diff options
author | 2017-08-13 17:57:32 +0000 | |
---|---|---|
committer | 2017-08-13 17:57:32 +0000 | |
commit | d388c265ade5408c60e29b0f6d5c4bad202571e0 (patch) | |
tree | ac727d90dc26a5bce4b698584bd800d0458517e9 | |
parent | move endian/word size checks from runtime to compile time (diff) | |
download | wireguard-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.c | 13 | ||||
-rw-r--r-- | sbin/dhclient/dispatch.c | 14 | ||||
-rw-r--r-- | sbin/dhclient/privsep.c | 19 | ||||
-rw-r--r-- | sbin/dhclient/privsep.h | 4 |
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 *); |