changeset 5146:389bc505382e draft

privsep: Don't abort if we fail to init a protocol. It's only an error if we cannot init anything.
author Roy Marples <roy@marples.name>
date Thu, 16 Apr 2020 21:00:58 +0100
parents c0341181c51f
children e90134cc9520
files src/privsep-inet.c
diffstat 1 files changed, 21 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/privsep-inet.c	Wed Apr 15 16:50:32 2020 +0100
+++ b/src/privsep-inet.c	Thu Apr 16 21:00:58 2020 +0100
@@ -99,37 +99,37 @@
 	close(ctx->ps_data_fd);
 	ctx->ps_data_fd = -1;
 
+	errno = 0;
+
 #ifdef INET
 	if ((ctx->options & (DHCPCD_IPV4 | DHCPCD_MASTER)) ==
 	    (DHCPCD_IPV4 | DHCPCD_MASTER))
 	{
 		ctx->udp_fd = dhcp_openudp(NULL);
-		if (ctx->udp_fd == -1) {
+		if (ctx->udp_fd == -1)
 			logerr("%s: dhcp_open", __func__);
-			return -1;
-		}
-		if (eloop_event_add(ctx->eloop, ctx->udp_fd,
+		else if (eloop_event_add(ctx->eloop, ctx->udp_fd,
 		    ps_inet_recvbootp, ctx) == -1)
 		{
 			logerr("%s: eloop_event_add DHCP", __func__);
-			return -1;
-		}
-		ret++;
+			close(ctx->udp_fd);
+			ctx->udp_fd = -1;
+		} else
+			ret++;
 	}
 #endif
 #if defined(INET6) && !defined(__sun)
 	if (ctx->options & DHCPCD_IPV6) {
-		if (ipv6nd_open(ctx) == -1) {
+		if (ipv6nd_open(ctx) == -1)
 			logerr("%s: ipv6nd_open", __func__);
-			return -1;
-		}
-		if (eloop_event_add(ctx->eloop, ctx->nd_fd,
+		else if (eloop_event_add(ctx->eloop, ctx->nd_fd,
 		    ps_inet_recvra, ctx) == -1)
 		{
 			logerr("%s: eloop_event_add RA", __func__);
-			return -1;
-		}
-		ret++;
+			close(ctx->nd_fd);
+			ctx->nd_fd = -1;
+		} else
+			ret++;
 	}
 #endif
 #ifdef DHCP6
@@ -137,21 +137,20 @@
 	    (DHCPCD_DHCP6 | DHCPCD_MASTER))
 	{
 		ctx->dhcp6_fd = dhcp6_openudp(0, NULL);
-		if (ctx->dhcp6_fd == -1) {
+		if (ctx->dhcp6_fd == -1)
 			logerr("%s: dhcp6_open", __func__);
-			return -1;
-		}
-		if (eloop_event_add(ctx->eloop, ctx->dhcp6_fd,
+		else if (eloop_event_add(ctx->eloop, ctx->dhcp6_fd,
 		    ps_inet_recvdhcp6, ctx) == -1)
 		{
 			logerr("%s: eloop_event_add DHCP6", __func__);
-			return -1;
-		}
-		ret++;
+			close(ctx->dhcp6_fd);
+			ctx->dhcp6_fd = -1;
+		} else
+			ret++;
 	}
 #endif
 
-	if (ret == 0) {
+	if (ret == 0 && errno == 0) {
 		errno = ENXIO;
 		return -1;
 	}