diff options
author | krw <krw@openbsd.org> | 2020-12-01 14:55:40 +0000 |
---|---|---|
committer | krw <krw@openbsd.org> | 2020-12-01 14:55:40 +0000 |
commit | 0354dba97f3b8436423eda5414a88043208743b2 (patch) | |
tree | d15eb7188d60a7faee4efb449df76348ce03560f /sbin/dhclient | |
parent | Turn uvm_pagealloc() mp-safe by checking uvmexp global with pageqlock held. (diff) | |
download | wireguard-openbsd-0354dba97f3b8436423eda5414a88043208743b2.tar.xz wireguard-openbsd-0354dba97f3b8436423eda5414a88043208743b2.zip |
Extract another couple of chunks from main() into helper functions,
get_routefd() and set_user().
Diffstat (limited to 'sbin/dhclient')
-rw-r--r-- | sbin/dhclient/dhclient.c | 84 |
1 files changed, 51 insertions, 33 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c index 05760697a75..3238da5a7b2 100644 --- a/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhclient.c,v 1.687 2020/11/27 14:52:36 krw Exp $ */ +/* $OpenBSD: dhclient.c,v 1.688 2020/12/01 14:55:40 krw Exp $ */ /* * Copyright 2004 Henning Brauer <henning@openbsd.org> @@ -118,8 +118,10 @@ void get_name(struct interface_info *, int, char *); void get_address(struct interface_info *); void get_ssid(struct interface_info *, int); void get_sockets(struct interface_info *); +int get_routefd(int); void set_autoconf(struct interface_info *, int); void set_iff_up(struct interface_info *, int); +void set_user(char *); int get_ifa_family(char *, int); struct ifaddrs *get_link_ifa(const char *, struct ifaddrs *); void interface_state(struct interface_info *); @@ -413,6 +415,29 @@ set_iff_up(struct interface_info *ifi, int ioctlfd) } void +set_user(char *user) +{ + struct passwd *pw; + + pw = getpwnam(user); + if (pw == NULL) + fatalx("no such user: %s", user); + + if (chroot(pw->pw_dir) == -1) + fatal("chroot(%s)", pw->pw_dir); + if (chdir("/") == -1) + fatal("chdir(\"/\")"); + if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1) + fatal("setresgid"); + if (setgroups(1, &pw->pw_gid) == -1) + fatal("setgroups"); + if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1) + fatal("setresuid"); + + endpwent(); +} + +void get_sockets(struct interface_info *ifi) { unsigned char *newp; @@ -430,6 +455,28 @@ get_sockets(struct interface_info *ifi) } } +int +get_routefd(int rdomain) +{ + int routefd, rtfilter; + + if ((routefd = socket(AF_ROUTE, SOCK_RAW, AF_INET)) == -1) + fatal("socket(AF_ROUTE, SOCK_RAW)"); + + rtfilter = ROUTE_FILTER(RTM_PROPOSAL) | ROUTE_FILTER(RTM_IFINFO) | + ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) | + ROUTE_FILTER(RTM_IFANNOUNCE) | ROUTE_FILTER(RTM_80211INFO); + + if (setsockopt(routefd, AF_ROUTE, ROUTE_MSGFILTER, + &rtfilter, sizeof(rtfilter)) == -1) + fatal("setsockopt(ROUTE_MSGFILTER)"); + if (setsockopt(routefd, AF_ROUTE, ROUTE_TABLEFILTER, &rdomain, + sizeof(rdomain)) == -1) + fatal("setsockopt(ROUTE_TABLEFILTER)"); + + return routefd; +} + void routefd_handler(struct interface_info *ifi, int routefd) { @@ -578,10 +625,9 @@ main(int argc, char *argv[]) { struct stat sb; struct interface_info *ifi; - struct passwd *pw; char *ignore_list = NULL; int fd, socket_fd[2]; - int rtfilter, routefd; + int routefd; int ch; if (isatty(STDERR_FILENO) != 0) @@ -684,26 +730,10 @@ main(int argc, char *argv[]) if ((cmd_opts & OPT_NOACTION) != 0) return 0; - if ((pw = getpwnam("_dhcp")) == NULL) - fatalx("no such user: _dhcp"); - if (asprintf(&path_lease_db, "%s.%s", _PATH_LEASE_DB, ifi->name) == -1) fatal("path_lease_db"); - if ((routefd = socket(AF_ROUTE, SOCK_RAW, AF_INET)) == -1) - fatal("socket(AF_ROUTE, SOCK_RAW)"); - - rtfilter = ROUTE_FILTER(RTM_PROPOSAL) | ROUTE_FILTER(RTM_IFINFO) | - ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) | - ROUTE_FILTER(RTM_IFANNOUNCE) | ROUTE_FILTER(RTM_80211INFO); - - if (setsockopt(routefd, AF_ROUTE, ROUTE_MSGFILTER, - &rtfilter, sizeof(rtfilter)) == -1) - fatal("setsockopt(ROUTE_MSGFILTER)"); - if (setsockopt(routefd, AF_ROUTE, ROUTE_TABLEFILTER, &ifi->rdomain, - sizeof(ifi->rdomain)) == -1) - fatal("setsockopt(ROUTE_TABLEFILTER)"); - + routefd = get_routefd(ifi->rdomain); fd = take_charge(ifi, routefd, path_lease_db); if (fd != -1) read_lease_db(&ifi->lease_db); @@ -712,19 +742,7 @@ main(int argc, char *argv[]) log_warn("%s: fopen(%s)", log_procname, path_lease_db); write_lease_db(&ifi->lease_db); - if (chroot(pw->pw_dir) == -1) - fatal("chroot(%s)", pw->pw_dir); - if (chdir("/") == -1) - fatal("chdir(\"/\")"); - - if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1) - fatal("setresgid"); - if (setgroups(1, &pw->pw_gid) == -1) - fatal("setgroups"); - if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1) - fatal("setresuid"); - - endpwent(); + set_user("_dhcp"); if ((cmd_opts & OPT_FOREGROUND) == 0) { if (pledge("stdio inet dns route proc", NULL) == -1) |