]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
priv: ensure we write exactly what will be read
authorVincent Bernat <vincent@bernat.im>
Wed, 18 Mar 2015 14:25:36 +0000 (15:25 +0100)
committerVincent Bernat <vincent@bernat.im>
Wed, 18 Mar 2015 14:25:36 +0000 (15:25 +0100)
When using SOCK_DGRAM/SOCK_SEQPACKET, it doesn't matter to write a bit
more since it is truncated. However, if we want to switch to
SOCK_STREAM, we must exactly write the right amount of bytes.

src/daemon/priv-linux.c
src/daemon/priv.c

index 69054cd7c72338a516d82cccd174332fff7d5642..cc14087920dc9905df66a39b4d6af559a5aab536 100644 (file)
@@ -47,7 +47,7 @@ priv_open(char *file)
        must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd));
        len = strlen(file);
        must_write(PRIV_UNPRIVILEGED, &len, sizeof(int));
-       must_write(PRIV_UNPRIVILEGED, file, len + 1);
+       must_write(PRIV_UNPRIVILEGED, file, len);
        priv_wait();
        must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int));
        if (rc == -1)
@@ -64,7 +64,7 @@ priv_ethtool(char *ifname, void *ethc, size_t length)
        must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd));
        len = strlen(ifname);
        must_write(PRIV_UNPRIVILEGED, &len, sizeof(int));
-       must_write(PRIV_UNPRIVILEGED, ifname, len + 1);
+       must_write(PRIV_UNPRIVILEGED, ifname, len);
        priv_wait();
        must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int));
        if (rc != 0)
index 00e18846ed94bd117fdfe03a3d3a641104663e92..e0f35f666fde0b7ef8e2a239d405c1a40e96f4ea 100644 (file)
@@ -107,7 +107,8 @@ priv_gethostname()
        must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int));
        if ((buf = (char*)realloc(buf, rc+1)) == NULL)
                fatal("privsep", NULL);
-       must_read(PRIV_UNPRIVILEGED, buf, rc+1);
+       must_read(PRIV_UNPRIVILEGED, buf, rc);
+       buf[rc] = '\0';
        return buf;
 }
 
@@ -229,11 +230,11 @@ asroot_gethostname()
 #endif
                 len = strlen(un.nodename);
                 must_write(PRIV_PRIVILEGED, &len, sizeof(int));
-                must_write(PRIV_PRIVILEGED, un.nodename, len + 1);
+                must_write(PRIV_PRIVILEGED, un.nodename, len);
         } else {
                 len = strlen(res->ai_canonname);
                 must_write(PRIV_PRIVILEGED, &len, sizeof(int));
-                must_write(PRIV_PRIVILEGED, res->ai_canonname, len + 1);
+                must_write(PRIV_PRIVILEGED, res->ai_canonname, len);
                freeaddrinfo(res);
         }
 }