]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
privsep: Double the size of the send buffer.
authorRoy Marples <roy@marples.name>
Mon, 1 Jun 2020 14:33:05 +0000 (15:33 +0100)
committerRoy Marples <roy@marples.name>
Mon, 1 Jun 2020 14:33:05 +0000 (15:33 +0100)
And ensure the buffer size is not reduced.

src/privsep.c

index ce84ff806e0a74611dcf1b050225e433cacbf3a7..d35b2be0e99b74f066eb01eea681b00fe03cd159 100644 (file)
@@ -131,13 +131,34 @@ ps_dropprivs(struct dhcpcd_ctx *ctx)
        return 0;
 }
 
+static int
+ps_setbuf0(int fd, int ctl, int minlen)
+{
+       int len;
+       socklen_t slen;
+
+       slen = sizeof(len);
+       if (getsockopt(fd, SOL_SOCKET, ctl, &len, &slen) == -1)
+               return -1;
+
+#ifdef __linux__
+       len /= 2;
+#endif
+       if (len >= minlen)
+               return 0;
+
+       return setsockopt(fd, SOL_SOCKET, ctl, &minlen, sizeof(minlen));
+}
+
 static int
 ps_setbuf(int fd)
 {
-       socklen_t len = (socklen_t)sizeof(struct ps_msg);
+       /* Ensure we can receive a fully sized privsep message.
+        * Double the send buffer. */
+       int minlen = (int)sizeof(struct ps_msg);
 
-       if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) == -1 ||
-           setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len)) == -1)
+       if (ps_setbuf0(fd, SO_RCVBUF, minlen) == -1 ||
+           ps_setbuf0(fd, SO_SNDBUF, minlen * 2) == -1)
        {
                logerr(__func__);
                return -1;