changeset 5537:4492d1d88fdd draft

control: create an unpriv socket for non master mode This allows `dhcpcd -U4 eth0` to work once more.
author Roy Marples <roy@marples.name>
date Wed, 11 Nov 2020 17:41:16 +0000
parents ddb1318a21e8
children fc24946f9b2a
files src/control.c src/defs.h src/dhcpcd.c src/dhcpcd.h
diffstat 4 files changed, 25 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/control.c	Wed Nov 04 14:25:00 2020 +0000
+++ b/src/control.c	Wed Nov 11 17:41:16 2020 +0000
@@ -274,9 +274,11 @@
 }
 
 static int
-make_path(char *path, size_t len, const char *ifname, sa_family_t family)
+make_path(char *path, size_t len, const char *ifname, sa_family_t family,
+    bool unpriv)
 {
 	const char *per;
+	const char *sunpriv;
 
 	switch(family) {
 	case AF_INET:
@@ -289,8 +291,13 @@
 		per = "";
 		break;
 	}
+	if (unpriv)
+		sunpriv = ifname ? ".unpriv" : "unpriv.";
+	else
+		sunpriv = "";
 	return snprintf(path, len, CONTROLSOCKET,
-	    ifname ? ifname : "", ifname ? per : "", ifname ? "." : "");
+	    ifname ? ifname : "", ifname ? per : "",
+	    sunpriv, ifname ? "." : "");
 }
 
 static int
@@ -303,10 +310,7 @@
 		return -1;
 	memset(sa, 0, sizeof(*sa));
 	sa->sun_family = AF_UNIX;
-	if (unpriv)
-		strlcpy(sa->sun_path, UNPRIVSOCKET, sizeof(sa->sun_path));
-	else
-		make_path(sa->sun_path, sizeof(sa->sun_path), ifname, family);
+	make_path(sa->sun_path, sizeof(sa->sun_path), ifname, family, unpriv);
 	return fd;
 }
 
@@ -346,9 +350,12 @@
 	}
 #endif
 
-	if ((fmode & S_UNPRIV) != S_UNPRIV)
+	if ((fmode & S_PRIV) == S_PRIV)
 		strlcpy(ctx->control_sock, sa.sun_path,
 		    sizeof(ctx->control_sock));
+	else
+		strlcpy(ctx->control_sock_unpriv, sa.sun_path,
+		    sizeof(ctx->control_sock_unpriv));
 	return fd;
 }
 
@@ -360,7 +367,9 @@
 #ifdef PRIVSEP
 	if (IN_PRIVSEP_SE(ctx)) {
 		make_path(ctx->control_sock, sizeof(ctx->control_sock),
-		    ifname, family);
+		    ifname, family, false);
+		make_path(ctx->control_sock_unpriv, sizeof(ctx->control_sock),
+		    ifname, family, true);
 		return 0;
 	}
 #endif
@@ -371,11 +380,7 @@
 	ctx->control_fd = fd;
 	eloop_event_add(ctx->eloop, fd, control_handle, ctx);
 
-	if (ifname == NULL &&
-	    (fd = control_start1(ctx, NULL, AF_UNSPEC, S_UNPRIV)) != -1)
-	{
-		/* We must be in master mode, so create an unprivileged socket
-		 * to allow normal users to learn the status of dhcpcd. */
+	if ((fd = control_start1(ctx, ifname, family, S_UNPRIV)) != -1) {
 		ctx->control_unpriv_fd = fd;
 		eloop_event_add(ctx->eloop, fd, control_handle_unpriv, ctx);
 	}
@@ -414,8 +419,7 @@
 	if (IN_PRIVSEP_SE(ctx)) {
 		if (ps_root_unlink(ctx, ctx->control_sock) == -1)
 			retval = -1;
-		if (ctx->options & DHCPCD_MASTER &&
-		    control_unlink(ctx, UNPRIVSOCKET) == -1)
+		if (ps_root_unlink(ctx, ctx->control_sock_unpriv) == -1)
 			retval = -1;
 		return retval;
 	} else if (ctx->options & DHCPCD_FORKED)
@@ -434,7 +438,7 @@
 		eloop_event_delete(ctx->eloop, ctx->control_unpriv_fd);
 		close(ctx->control_unpriv_fd);
 		ctx->control_unpriv_fd = -1;
-		if (control_unlink(ctx, UNPRIVSOCKET) == -1)
+		if (control_unlink(ctx, ctx->control_sock_unpriv) == -1)
 			retval = -1;
 	}
 
--- a/src/defs.h	Wed Nov 04 14:25:00 2020 +0000
+++ b/src/defs.h	Wed Nov 11 17:41:16 2020 +0000
@@ -60,10 +60,7 @@
 # define PIDFILE		RUNDIR "/%s%s%spid"
 #endif
 #ifndef CONTROLSOCKET
-# define CONTROLSOCKET		RUNDIR "/%s%s%ssock"
-#endif
-#ifndef UNPRIVSOCKET
-# define UNPRIVSOCKET		RUNDIR "/unpriv.sock"
+# define CONTROLSOCKET		RUNDIR "/%s%s%s%ssock"
 #endif
 #ifndef RDM_MONOFILE
 # define RDM_MONOFILE		DBDIR "/rdm_monotonic"
--- a/src/dhcpcd.c	Wed Nov 04 14:25:00 2020 +0000
+++ b/src/dhcpcd.c	Wed Nov 11 17:41:16 2020 +0000
@@ -2179,6 +2179,9 @@
 		if (!(ctx.options & DHCPCD_MASTER))
 			ctx.control_fd = control_open(argv[optind], family,
 			    ctx.options & DHCPCD_DUMPLEASE);
+		if (!(ctx.options & DHCPCD_MASTER) && ctx.control_fd == -1)
+			ctx.control_fd = control_open(argv[optind], AF_UNSPEC,
+			    ctx.options & DHCPCD_DUMPLEASE);
 		if (ctx.control_fd == -1)
 			ctx.control_fd = control_open(NULL, AF_UNSPEC,
 			    ctx.options & DHCPCD_DUMPLEASE);
--- a/src/dhcpcd.h	Wed Nov 04 14:25:00 2020 +0000
+++ b/src/dhcpcd.h	Wed Nov 11 17:41:16 2020 +0000
@@ -180,6 +180,7 @@
 	int control_unpriv_fd;
 	struct fd_list_head control_fds;
 	char control_sock[sizeof(CONTROLSOCKET) + IF_NAMESIZE];
+	char control_sock_unpriv[sizeof(CONTROLSOCKET) + IF_NAMESIZE + 7];
 	gid_t control_group;
 
 	/* DHCP Enterprise options, RFC3925 */