summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2020-01-29 16:41:28 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2020-02-04 17:22:06 +0100
commit4791d0f035e006e9541d27ef2c3dcb6ea561324a (patch)
tree31d30387debe554bc177ddfed66f0580f958cda1
parent91d16fc049ba2034708aa6a0bab5f548040dfd3b (diff)
downloadlvm2-4791d0f035e006e9541d27ef2c3dcb6ea561324a.tar.gz
dmeventd: nicer error path for reading pipe
When _daemon_read()/_client_read() fails during the read, ensure memory allocated withing function is also release here (so caller does not need to care). Also improve code readbility a bit a for same functionality use more similar code.
-rw-r--r--daemons/dmeventd/dmeventd.c39
-rw-r--r--daemons/dmeventd/libdevmapper-event.c35
2 files changed, 39 insertions, 35 deletions
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
index 4fcb38178..36a35ba04 100644
--- a/daemons/dmeventd/dmeventd.c
+++ b/daemons/dmeventd/dmeventd.c
@@ -1485,37 +1485,34 @@ static int _client_read(struct dm_event_fifos *fifos,
t.tv_usec = 0;
ret = select(fifos->client + 1, &fds, NULL, NULL, &t);
- if (!ret && !bytes) /* nothing to read */
- return 0;
+ if (!ret && bytes)
+ continue; /* trying to finish read */
- if (!ret) /* trying to finish read */
- continue;
-
- if (ret < 0) /* error */
- return 0;
+ if (ret <= 0) /* nothing to read */
+ goto bad;
ret = read(fifos->client, buf + bytes, size - bytes);
bytes += ret > 0 ? ret : 0;
- if (header && (bytes == 2 * sizeof(uint32_t))) {
+ if (!msg->data && (bytes == 2 * sizeof(uint32_t))) {
msg->cmd = ntohl(header[0]);
- size = msg->size = ntohl(header[1]);
bytes = 0;
- if (!size)
- break; /* No data -> error */
- buf = msg->data = malloc(msg->size);
- if (!buf)
- break; /* No mem -> error */
- header = 0;
+
+ if (!(size = msg->size = ntohl(header[1])))
+ break;
+
+ if (!(buf = msg->data = malloc(msg->size)))
+ goto bad;
}
}
- if (bytes != size) {
- free(msg->data);
- msg->data = NULL;
- return 0;
- }
+ if (bytes == size)
+ return 1;
- return 1;
+bad:
+ free(msg->data);
+ msg->data = NULL;
+
+ return 0;
}
/*
diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c
index 491374e67..780d10db9 100644
--- a/daemons/dmeventd/libdevmapper-event.c
+++ b/daemons/dmeventd/libdevmapper-event.c
@@ -237,16 +237,16 @@ static int _daemon_read(struct dm_event_fifos *fifos,
ret = select(fifos->server + 1, &fds, NULL, NULL, &tval);
if (ret < 0 && errno != EINTR) {
log_error("Unable to read from event server.");
- return 0;
+ goto bad;
}
if ((ret == 0) && (i > 4) && !bytes) {
log_error("No input from event server.");
- return 0;
+ goto bad;
}
}
if (ret < 1) {
log_error("Unable to read from event server.");
- return 0;
+ goto bad;
}
ret = read(fifos->server, buf + bytes, size);
@@ -255,25 +255,32 @@ static int _daemon_read(struct dm_event_fifos *fifos,
continue;
log_error("Unable to read from event server.");
- return 0;
+ goto bad;
}
bytes += ret;
- if (header && (bytes == 2 * sizeof(uint32_t))) {
+ if (!msg->data && (bytes == 2 * sizeof(uint32_t))) {
msg->cmd = ntohl(header[0]);
- msg->size = ntohl(header[1]);
- buf = msg->data = malloc(msg->size);
- size = msg->size;
bytes = 0;
- header = 0;
+
+ if (!(size = msg->size = ntohl(header[1])))
+ break;
+
+ if (!(buf = msg->data = malloc(msg->size))) {
+ log_error("Unable to allocate message data.");
+ return 0;
+ }
}
}
- if (bytes != size) {
- free(msg->data);
- msg->data = NULL;
- }
- return bytes == size;
+ if (bytes == size)
+ return 1;
+
+bad:
+ free(msg->data);
+ msg->data = NULL;
+
+ return 0;
}
/* Write message to daemon. */