changeset 5459:4ac77faa4990 draft

privsep: Fold capsicum and pledge entry points into ps_entersandbox
author Roy Marples <roy@marples.name>
date Sat, 19 Sep 2020 18:58:52 +0100
parents dd8347a0ea1c
children 5f999efcfe01
files src/privsep-bpf.c src/privsep-control.c src/privsep-inet.c src/privsep.c src/privsep.h
diffstat 5 files changed, 31 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep-bpf.c	Sat Sep 19 15:05:51 2020 +0100
+++ b/src/privsep-bpf.c	Sat Sep 19 18:58:52 2020 +0100
@@ -53,10 +53,6 @@
 #include "logerr.h"
 #include "privsep.h"
 
-#ifdef HAVE_CAPSICUM
-#include <sys/capsicum.h>
-#endif
-
 static void
 ps_bpf_recvbpf(void *arg)
 {
@@ -244,14 +240,7 @@
 		ps_freeprocess(psp);
 		return -1;
 	case 0:
-#ifdef HAVE_CAPSICUM
-		if (cap_enter() == -1 && errno != ENOSYS)
-			logerr("%s: cap_enter", __func__);
-#endif
-#ifdef HAVE_PLEDGE
-		if (pledge("stdio", NULL) == -1)
-			logerr("%s: pledge", __func__);
-#endif
+		ps_entersandbox("stdio");
 		break;
 	default:
 #ifdef PRIVSEP_DEBUG
--- a/src/privsep-control.c	Sat Sep 19 15:05:51 2020 +0100
+++ b/src/privsep-control.c	Sat Sep 19 18:58:52 2020 +0100
@@ -36,10 +36,6 @@
 #include "logerr.h"
 #include "privsep.h"
 
-#ifdef HAVE_CAPSICUM
-#include <sys/capsicum.h>
-#endif
-
 static int
 ps_ctl_startcb(void *arg)
 {
@@ -267,14 +263,7 @@
 	    ps_ctl_listen, ctx) == -1)
 		return -1;
 
-#ifdef HAVE_CAPSICUM
-	if (cap_enter() == -1 && errno != ENOSYS)
-		logerr("%s: cap_enter", __func__);
-#endif
-#ifdef HAVE_PLEDGE
-	if (pledge("stdio inet", NULL) == -1)
-		logerr("%s: pledge", __func__);
-#endif
+	ps_entersandbox("stdio inet");
 	return 0;
 }
 
--- a/src/privsep-inet.c	Sat Sep 19 15:05:51 2020 +0100
+++ b/src/privsep-inet.c	Sat Sep 19 18:58:52 2020 +0100
@@ -47,10 +47,6 @@
 #include "logerr.h"
 #include "privsep.h"
 
-#ifdef HAVE_CAPSICUM
-#include <sys/capsicum.h>
-#endif
-
 #ifdef INET
 static void
 ps_inet_recvbootp(void *arg)
@@ -337,14 +333,8 @@
 	    ps_inet_startcb, NULL,
 	    PSF_DROPPRIVS);
 
-#ifdef HAVE_CAPSICUM
-	if (pid == 0 && cap_enter() == -1 && errno != ENOSYS)
-		logerr("%s: cap_enter", __func__);
-#endif
-#ifdef HAVE_PLEDGE
-	if (pid == 0 && pledge("stdio", NULL) == -1)
-		logerr("%s: pledge", __func__);
-#endif
+	if (pid == 0)
+		ps_entersandbox("stdio");
 
 	return pid;
 }
@@ -570,14 +560,7 @@
 		ps_freeprocess(psp);
 		return -1;
 	case 0:
-#ifdef HAVE_CAPSICUM
-		if (cap_enter() == -1 && errno != ENOSYS)
-			logerr("%s: cap_enter", __func__);
-#endif
-#ifdef HAVE_PLEDGE
-		if (pledge("stdio", NULL) == -1)
-			logerr("%s: pledge", __func__);
-#endif
+		ps_entersandbox("stdio");
 		break;
 	default:
 		break;
--- a/src/privsep.c	Sat Sep 19 15:05:51 2020 +0100
+++ b/src/privsep.c	Sat Sep 19 18:58:52 2020 +0100
@@ -490,6 +490,28 @@
 }
 
 int
+ps_entersandbox(const char *_pledge)
+{
+
+#ifdef HAVE_CAPSICUM
+	if (cap_enter() == -1 && errno != ENOSYS) {
+		logerr("%s: cap_enter", __func__);
+		return -1;
+	}
+#endif
+#ifdef HAVE_PLEDGE
+	if (pledge(_pledge, NULL) == -1) {
+		logerr("%s: pledge", __func__);
+		return -1;
+	}
+#else
+	UNUSED(_pledge);
+#endif
+
+	return 0;
+}
+
+int
 ps_mastersandbox(struct dhcpcd_ctx *ctx)
 {
 
@@ -508,20 +530,8 @@
 		return -1;
 	}
 #endif
-#ifdef HAVE_CAPSICUM
-	if (cap_enter() == -1 && errno != ENOSYS) {
-		logerr("%s: cap_enter", __func__);
-		return -1;
-	}
-#endif
-#ifdef HAVE_PLEDGE
-	if (pledge("stdio route", NULL) == -1) {
-		logerr("%s: pledge", __func__);
-		return -1;
-	}
-#endif
 
-	return 0;
+	return ps_entersandbox("stdio route");
 }
 
 int
--- a/src/privsep.h	Sat Sep 19 15:05:51 2020 +0100
+++ b/src/privsep.h	Sat Sep 19 18:58:52 2020 +0100
@@ -92,7 +92,6 @@
 #define	IN_PRIVSEP_SE(ctx)	\
 	(((ctx)->options & (DHCPCD_PRIVSEP | DHCPCD_FORKED)) == DHCPCD_PRIVSEP)
 
-
 #if defined(PRIVSEP) && defined(HAVE_CAPSICUM)
 #define PRIVSEP_RIGHTS
 #endif
@@ -168,6 +167,7 @@
 int ps_init(struct dhcpcd_ctx *);
 int ps_start(struct dhcpcd_ctx *);
 int ps_stop(struct dhcpcd_ctx *);
+int ps_entersandbox(const char *);
 int ps_mastersandbox(struct dhcpcd_ctx *);
 
 int ps_unrollmsg(struct msghdr *, struct ps_msghdr *, const void *, size_t);
@@ -185,6 +185,7 @@
 
 /* Internal privsep functions. */
 int ps_setbuf_fdpair(int []);
+
 #ifdef PRIVSEP_RIGHTS
 int ps_rights_limit_ioctl(int);
 int ps_rights_limit_fd_fctnl(int);
@@ -192,6 +193,7 @@
 int ps_rights_limit_fd(int);
 int ps_rights_limit_fdpair(int []);
 #endif
+
 pid_t ps_dostart(struct dhcpcd_ctx * ctx,
     pid_t *priv_pid, int *priv_fd,
     void (*recv_msg)(void *), void (*recv_unpriv_msg),