summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2012-02-28 11:06:56 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2012-02-28 11:06:56 +0000
commitbd046f0201cfe3f69be81a0727d39e79bb992d9f (patch)
tree6538c5c72d8d5560eb1f22363e4a116bfa4963db
parentc19d86338d6a88a3e91b42a8acca2ee9ff5a1543 (diff)
downloadlvm2-bd046f0201cfe3f69be81a0727d39e79bb992d9f.tar.gz
lvm2-bd046f0201cfe3f69be81a0727d39e79bb992d9f.tar.xz
lvm2-bd046f0201cfe3f69be81a0727d39e79bb992d9f.zip
Ensure clvmd message is always \0 terminated
Drop whole buffer clearing (most messages at <100 bytes). Just make sure we have always \0 terminated string for strlen() operations. (before for PIPE_BUF sized messages this was not set).
-rw-r--r--WHATS_NEW1
-rw-r--r--daemons/clvmd/clvmd.c6
2 files changed, 4 insertions, 3 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 33ca6020..315853da 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.94 -
====================================
+ Ensure clvmd message is always \0 terminated after read.
Better detection of missing dmeventd fifo connection (2.02.93).
Add some close() and dev_close() error path backtraces.
For polling daemon reopen stdin,stdout,stderr to /dev/null.
diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c
index b1d75a6d..2ee56108 100644
--- a/daemons/clvmd/clvmd.c
+++ b/daemons/clvmd/clvmd.c
@@ -1087,10 +1087,9 @@ static int read_from_local_sock(struct local_client *thisfd)
int len;
int argslen;
int missing_len;
- char buffer[PIPE_BUF];
+ char buffer[PIPE_BUF + 1];
- memset(buffer, 0, PIPE_BUF);
- len = read(thisfd->fd, buffer, sizeof(buffer));
+ len = read(thisfd->fd, buffer, sizeof(buffer) - 1);
if (len == -1 && errno == EINTR)
return 1;
@@ -1180,6 +1179,7 @@ static int read_from_local_sock(struct local_client *thisfd)
struct clvm_header *inheader;
int status;
+ buffer[len] = 0; /* Ensure \0 terminated */
inheader = (struct clvm_header *) buffer;
/* Fill in the client ID */