changeset 5291:d1e1fe84e3b3 draft

privsep: Double the size of the send buffer. And ensure the buffer size is not reduced.
author Roy Marples <roy@marples.name>
date Mon, 01 Jun 2020 15:33:05 +0100
parents fae6670fef23
children 2f2b53b05dc5
files src/privsep.c
diffstat 1 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep.c	Mon Jun 01 15:03:46 2020 +0100
+++ b/src/privsep.c	Mon Jun 01 15:33:05 2020 +0100
@@ -132,12 +132,33 @@
 }
 
 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;