changeset 5290:fae6670fef23 draft

privsep: Ensure socketpair IPC buffers are large enough. For at least one fully sized message.
author Roy Marples <roy@marples.name>
date Mon, 01 Jun 2020 15:03:46 +0100
parents b32000689362
children d1e1fe84e3b3
files src/privsep.c
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep.c	Mon Jun 01 13:57:31 2020 +0100
+++ b/src/privsep.c	Mon Jun 01 15:03:46 2020 +0100
@@ -131,6 +131,20 @@
 	return 0;
 }
 
+static int
+ps_setbuf(int fd)
+{
+	socklen_t len = (socklen_t)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)
+	{
+		logerr(__func__);
+		return -1;
+	}
+	return 0;
+}
+
 pid_t
 ps_dostart(struct dhcpcd_ctx *ctx,
     pid_t *priv_pid, int *priv_fd,
@@ -160,6 +174,7 @@
 	case 0:
 		*priv_fd = fd[1];
 		close(fd[0]);
+		ps_setbuf(*priv_fd);
 		break;
 	default:
 		*priv_pid = pid;
@@ -181,6 +196,7 @@
 			logerr("%s: eloop_event_add", __func__);
 			return -1;
 		}
+		ps_setbuf(*priv_fd);
 		return pid;
 	}