summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2017-08-13 17:57:32 +0000
committerkrw <krw@openbsd.org>2017-08-13 17:57:32 +0000
commitd388c265ade5408c60e29b0f6d5c4bad202571e0 (patch)
treeac727d90dc26a5bce4b698584bd800d0458517e9
parentmove endian/word size checks from runtime to compile time (diff)
downloadwireguard-openbsd-d388c265ade5408c60e29b0f6d5c4bad202571e0.tar.xz
wireguard-openbsd-d388c265ade5408c60e29b0f6d5c4bad202571e0.zip
Simplify HUP handling now that proper error
checks are done on the imsg socket to detect closure, etc. Die immediately if the priv process notices the interface name can't be turned into an index.
-rw-r--r--sbin/dhclient/dhclient.c13
-rw-r--r--sbin/dhclient/dispatch.c14
-rw-r--r--sbin/dhclient/privsep.c19
-rw-r--r--sbin/dhclient/privsep.h4
4 files changed, 23 insertions, 27 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 6c018fd4cce..d4304c323f1 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.492 2017/08/10 17:15:05 krw Exp $ */
+/* $OpenBSD: dhclient.c,v 1.493 2017/08/13 17:57:32 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -2092,7 +2092,7 @@ fork_privchld(struct interface_info *ifi, int fd, int fd2)
struct pollfd pfd[1];
struct imsgbuf *priv_ibuf;
ssize_t n;
- int ioctlfd, routefd, nfds, got_imsg_hup = 0;
+ int ioctlfd, routefd, nfds;
switch (fork()) {
case -1:
@@ -2153,10 +2153,8 @@ fork_privchld(struct interface_info *ifi, int fd, int fd2)
continue;
}
- got_imsg_hup = dispatch_imsg(ifi->name, ifi->rdomain, ioctlfd,
- routefd, priv_ibuf);
- if (got_imsg_hup != 0)
- quit = SIGHUP;
+ dispatch_imsg(ifi->name, ifi->rdomain, ioctlfd, routefd,
+ priv_ibuf);
}
close(routefd);
close(ioctlfd);
@@ -2165,8 +2163,7 @@ fork_privchld(struct interface_info *ifi, int fd, int fd2)
close(fd);
if (quit == SIGHUP) {
- if (got_imsg_hup == 0)
- log_warnx("%s; restarting.", strsignal(quit));
+ log_warnx("%s; restarting.", strsignal(quit));
signal(SIGHUP, SIG_IGN); /* will be restored after exec */
execvp(saved_argv[0], saved_argv);
fatal("RESTART FAILED: '%s'", saved_argv[0]);
diff --git a/sbin/dhclient/dispatch.c b/sbin/dhclient/dispatch.c
index e5910aa187f..ad2a2689fa3 100644
--- a/sbin/dhclient/dispatch.c
+++ b/sbin/dhclient/dispatch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dispatch.c,v 1.138 2017/08/12 17:36:21 krw Exp $ */
+/* $OpenBSD: dispatch.c,v 1.139 2017/08/13 17:57:32 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -87,11 +87,9 @@ dispatch(struct interface_info *ifi, int routefd)
while (quit == 0 || quit == SIGHUP) {
if (quit == SIGHUP) {
- log_warnx("%s; restarting", strsignal(quit));
sendhup();
- }
-
- if (ifi->timeout_func != NULL) {
+ to_msec = 100;
+ } else if (ifi->timeout_func != NULL) {
time(&cur_time);
if (ifi->timeout <= cur_time) {
func = ifi->timeout_func;
@@ -107,8 +105,8 @@ dispatch(struct interface_info *ifi, int routefd)
*/
howlong = ifi->timeout - cur_time;
if (howlong > INT_MAX / 1000)
- howlong = INT_MAX / 1000;
- to_msec = howlong * 1000;
+ howlong = INT_MAX / 1000;
+ to_msec = howlong * 1000;
} else
to_msec = -1;
@@ -168,7 +166,7 @@ dispatch(struct interface_info *ifi, int routefd)
quit = INTERNALSIG;
}
- if (quit != INTERNALSIG)
+ if (quit != INTERNALSIG && quit != SIGHUP)
fatalx("%s", strsignal(quit));
}
diff --git a/sbin/dhclient/privsep.c b/sbin/dhclient/privsep.c
index 6cc66b2024d..09837fb5969 100644
--- a/sbin/dhclient/privsep.c
+++ b/sbin/dhclient/privsep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep.c,v 1.65 2017/08/12 16:57:38 krw Exp $ */
+/* $OpenBSD: privsep.c,v 1.66 2017/08/13 17:57:32 krw Exp $ */
/*
* Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -28,6 +28,7 @@
#include <imsg.h>
#include <signal.h>
#include <stdio.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -36,7 +37,7 @@
#include "log.h"
#include "privsep.h"
-int
+void
dispatch_imsg(char *name, int rdomain, int ioctlfd, int routefd,
struct imsgbuf *ibuf)
{
@@ -48,8 +49,11 @@ dispatch_imsg(char *name, int rdomain, int ioctlfd, int routefd,
int index, newidx;
index = if_nametoindex(name);
- if (index == 0)
- return 0;
+ if (index == 0) {
+ log_warnx("Unknown interface %s", name);
+ quit = INTERNALSIG;
+ return;
+ }
for (;;) {
if ((n = imsg_get(ibuf, &imsg)) == -1)
@@ -133,10 +137,8 @@ dispatch_imsg(char *name, int rdomain, int ioctlfd, int routefd,
case IMSG_HUP:
if (imsg.hdr.len != IMSG_HEADER_SIZE)
log_warnx("bad IMSG_HUP");
- else {
- imsg_free(&imsg);
- return 1;
- }
+ else
+ quit = SIGHUP;
break;
default:
@@ -146,5 +148,4 @@ dispatch_imsg(char *name, int rdomain, int ioctlfd, int routefd,
imsg_free(&imsg);
}
- return 0;
}
diff --git a/sbin/dhclient/privsep.h b/sbin/dhclient/privsep.h
index c76632748f0..b75daf7629a 100644
--- a/sbin/dhclient/privsep.h
+++ b/sbin/dhclient/privsep.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep.h,v 1.54 2017/08/12 16:57:38 krw Exp $ */
+/* $OpenBSD: privsep.h,v 1.55 2017/08/13 17:57:32 krw Exp $ */
/*
* Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -48,7 +48,7 @@ struct imsg_set_mtu {
int mtu;
};
-int dispatch_imsg(char *, int, int, int, struct imsgbuf *);
+void dispatch_imsg(char *, int, int, int, struct imsgbuf *);
int default_route_index(int, int);
void priv_add_route(char *, int, int, struct imsg_add_route *);