From: Roy Marples Date: Fri, 7 Feb 2014 11:03:39 +0000 (+0000) Subject: Don't hold onto an AF_INET socket for the duration of the program, X-Git-Tag: v6.3.0~40 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c7c1e4112a51092b025ed59790d30e0d59b4bf75;p=thirdparty%2Fdhcpcd.git Don't hold onto an AF_INET socket for the duration of the program, open and close it as required. --- diff --git a/dhcpcd.c b/dhcpcd.c index 8502a722..df1e7447 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -1313,11 +1313,6 @@ main(int argc, char **argv) syslog(LOG_ERR, "control_start: %m"); } - if (open_sockets() == -1) { - syslog(LOG_ERR, "open_sockets: %m"); - goto exit_failure; - } - #if 0 if (options & DHCPCD_IPV6RS && disable_rtadv() == -1) { syslog(LOG_ERR, "disable_rtadvd: %m"); @@ -1451,7 +1446,6 @@ exit1: restore_kernel_ra(); ipv4_free(NULL); ipv6_free(NULL); - if_free(); get_line_free(); dev_stop(options & DHCPCD_DAEMONISED); if (linkfd != -1) { diff --git a/if-bsd.c b/if-bsd.c index 302abc0b..320e94ef 100644 --- a/if-bsd.c +++ b/if-bsd.c @@ -84,10 +84,6 @@ # define CLLADDR(s) ((const char *)((s)->sdl_data + (s)->sdl_nlen)) #endif -static int r_fd = -1; -static char *link_buf; -static ssize_t link_buflen; - int if_init(__unused struct interface *iface) { @@ -102,32 +98,6 @@ if_conf(__unused struct interface *iface) return 0; } -void -if_free(void) -{ - - if (r_fd != -1) { - close(r_fd); - r_fd = -1; - } - if (link_buflen) { - free(link_buf); - link_buflen = 0; - } -} - -int -open_sockets(void) -{ - if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return -1; - set_cloexec(socket_afnet); - if ((r_fd = socket(PF_ROUTE, SOCK_RAW, 0)) == -1) - return -1; - set_cloexec(r_fd); - return 0; -} - int open_link_socket(void) { @@ -144,7 +114,7 @@ open_link_socket(void) int getifssid(const char *ifname, char *ssid) { - int retval = -1; + int s, retval = -1; #if defined(SIOCG80211NWID) struct ifreq ifr; struct ieee80211_nwid nwid; @@ -153,12 +123,15 @@ getifssid(const char *ifname, char *ssid) char nwid[IEEE80211_NWID_LEN + 1]; #endif + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; + #if defined(SIOCG80211NWID) /* NetBSD */ memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); memset(&nwid, 0, sizeof(nwid)); ifr.ifr_data = (void *)&nwid; - if (ioctl(socket_afnet, SIOCG80211NWID, &ifr) == 0) { + if (ioctl(s, SIOCG80211NWID, &ifr) == 0) { retval = nwid.i_len; if (ssid) { memcpy(ssid, nwid.i_nwid, nwid.i_len); @@ -172,7 +145,7 @@ getifssid(const char *ifname, char *ssid) ireq.i_val = -1; memset(nwid, 0, sizeof(nwid)); ireq.i_data = &nwid; - if (ioctl(socket_afnet, SIOCG80211, &ireq) == 0) { + if (ioctl(s, SIOCG80211, &ireq) == 0) { retval = ireq.i_len; if (ssid) { memcpy(ssid, nwid, ireq.i_len); @@ -180,6 +153,8 @@ getifssid(const char *ifname, char *ssid) } } #endif + + close(s); return retval; } @@ -193,11 +168,16 @@ getifssid(const char *ifname, char *ssid) int if_vimaster(const char *ifname) { + int s, r; struct ifmediareq ifmr; + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; memset(&ifmr, 0, sizeof(ifmr)); strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name)); - if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) == -1) + r = ioctl(s, SIOCGIFMEDIA, &ifmr); + close(s); + if (r == -1) return -1; if (ifmr.ifm_status & IFM_AVALID && IFM_TYPE(ifmr.ifm_active) == IFM_IEEE80211) @@ -214,12 +194,16 @@ if_address(const struct interface *iface, const struct in_addr *address, const struct in_addr *netmask, const struct in_addr *broadcast, int action) { + int s, r; struct ifaliasreq ifa; union { struct sockaddr *sa; struct sockaddr_in *sin; } _s; + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; + memset(&ifa, 0, sizeof(ifa)); strlcpy(ifa.ifra_name, iface->name, sizeof(ifa.ifra_name)); @@ -237,9 +221,11 @@ if_address(const struct interface *iface, const struct in_addr *address, } #undef ADDADDR - return ioctl(socket_afnet, + r = ioctl(s, action < 0 ? SIOCDIFADDR : action == 2 ? SIOCSIFADDR : SIOCAIFADDR, &ifa); + close(s); + return r; } int @@ -259,7 +245,10 @@ if_route(const struct rt *rt, int action) } rtm; char *bp = rtm.buffer; size_t l; - int retval = 0; + int s, retval; + + if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) == -1) + return -1; #define ADDSU { \ l = RT_ROUNDUP(su.sa.sa_len); \ @@ -336,8 +325,9 @@ if_route(const struct rt *rt, int action) #undef ADDSU rtm.hdr.rtm_msglen = l = bp - (char *)&rtm; - if (write(r_fd, &rtm, l) == -1) - retval = -1; + + retval = write(s, &rtm, l) == -1 ? -1 : 0; + close(s); return retval; } #endif @@ -350,9 +340,9 @@ if_address6(const struct ipv6_addr *a, int action) struct in6_aliasreq ifa; struct in6_addr mask; - s = socket(AF_INET6, SOCK_DGRAM, 0); - if (s == -1) + if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) return -1; + memset(&ifa, 0, sizeof(ifa)); strlcpy(ifa.ifra_name, a->iface->name, sizeof(ifa.ifra_name)); /* @@ -402,9 +392,12 @@ if_route6(const struct rt6 *rt, int action) } rtm; char *bp = rtm.buffer; size_t l; - int retval = 0; + int s, retval; const struct ipv6_addr_l *lla; + if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) == -1) + return -1; + /* KAME based systems want to store the scope inside the sin6_addr * for link local addreses */ #ifdef __KAME__ @@ -507,8 +500,9 @@ if_route6(const struct rt6 *rt, int action) } rtm.hdr.rtm_msglen = l = bp - (char *)&rtm; - if (write(r_fd, &rtm, l) == -1) - retval = -1; + + retval = write(s, &rtm, l) == -1 ? -1 : 0; + close(s); return retval; } #endif @@ -557,8 +551,8 @@ in6_addr_flags(const char *ifname, const struct in6_addr *addr) int manage_link(int fd) { - char *p, *e, *cp; - char ifname[IF_NAMESIZE]; + /* route and ifwatchd like a msg buf size of 2048 */ + char msg[2048], *p, *e, *cp, ifname[IF_NAMESIZE]; ssize_t bytes; struct rt_msghdr *rtm; struct if_announcemsghdr *ifan; @@ -577,16 +571,7 @@ manage_link(int fd) #endif for (;;) { - if (ioctl(fd, FIONREAD, &len) == -1) - return -1; - if (link_buflen < len) { - p = realloc(link_buf, len); - if (p == NULL) - return -1; - link_buf = p; - link_buflen = len; - } - bytes = read(fd, link_buf, link_buflen); + bytes = read(fd, msg, sizeof(msg)); if (bytes == -1) { if (errno == EAGAIN) return 0; @@ -594,8 +579,8 @@ manage_link(int fd) continue; return -1; } - e = link_buf + bytes; - for (p = link_buf; p < e; p += rtm->rtm_msglen) { + e = msg + bytes; + for (p = msg; p < e; p += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)(void *)p; // Ignore messages generated by us if (rtm->rtm_pid == getpid()) diff --git a/if-linux.c b/if-linux.c index 6a932152..69b4ca7d 100644 --- a/if-linux.c +++ b/if-linux.c @@ -63,9 +63,6 @@ #include "ipv6.h" #include "net.h" -static int sock_fd; -static struct sockaddr_nl sock_nl; - int if_init(struct interface *iface) { @@ -112,16 +109,6 @@ if_conf(struct interface *iface) return 0; } -void -if_free(void) -{ - - if (sock_fd != -1) { - close(sock_fd); - sock_fd = -1; - } -} - /* XXX work out Virtal Interface Masters */ int if_vimaster(__unused const char *ifname) @@ -145,17 +132,6 @@ _open_link_socket(struct sockaddr_nl *nl) return fd; } -int -open_sockets(void) -{ - if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - return -1; - set_cloexec(socket_afnet); - sock_fd = _open_link_socket(&sock_nl); - set_cloexec(sock_fd); - return sock_fd; -} - int open_link_socket(void) { @@ -538,11 +514,14 @@ manage_link(int fd) static int send_netlink(struct nlmsghdr *hdr) { - int r; + int s, r; + struct sockaddr_nl sock_nl; struct iovec iov; struct msghdr msg; static unsigned int seq; + if ((s = _open_link_socket(&sock_nl)) == -1) + return -1; memset(&iov, 0, sizeof(iov)); iov.iov_base = hdr; iov.iov_len = hdr->nlmsg_len; @@ -555,10 +534,11 @@ send_netlink(struct nlmsghdr *hdr) hdr->nlmsg_flags |= NLM_F_ACK; hdr->nlmsg_seq = ++seq; - if (sendmsg(sock_fd, &msg, 0) != -1) - r = get_netlink(sock_fd, 0, &err_netlink); + if (sendmsg(s, &msg, 0) != -1) + r = get_netlink(s, 0, &err_netlink); else r = -1; + close(s); return r; } diff --git a/net.c b/net.c index 13aa9a66..c440b924 100644 --- a/net.c +++ b/net.c @@ -1,6 +1,6 @@ /* * dhcpcd - DHCP client daemon - * Copyright (c) 2006-2013 Roy Marples + * Copyright (c) 2006-2014 Roy Marples * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -75,8 +75,6 @@ #include "ipv6nd.h" #include "net.h" -int socket_afnet = -1; - static char hwaddr_buffer[(HWADDR_LEN * 3) + 1 + 1024]; char * @@ -152,7 +150,7 @@ free_interface(struct interface *ifp) int carrier_status(struct interface *iface) { - int ret; + int s, r; struct ifreq ifr; #ifdef SIOCGIFMEDIA struct ifmediareq ifmr; @@ -161,6 +159,8 @@ carrier_status(struct interface *iface) char *p; #endif + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return LINK_UNKNOWN; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); #ifdef __linux__ @@ -169,32 +169,37 @@ carrier_status(struct interface *iface) *p = '\0'; #endif - if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == -1) + if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) { + close(s); return LINK_UNKNOWN; + } iface->flags = ifr.ifr_flags; - ret = LINK_UNKNOWN; + r = LINK_UNKNOWN; #ifdef SIOCGIFMEDIA memset(&ifmr, 0, sizeof(ifmr)); strlcpy(ifmr.ifm_name, iface->name, sizeof(ifmr.ifm_name)); - if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) != -1 && + if (ioctl(s, SIOCGIFMEDIA, &ifmr) != -1 && ifmr.ifm_status & IFM_AVALID) - ret = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN; + r = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN; #endif - if (ret == LINK_UNKNOWN) - ret = (ifr.ifr_flags & IFF_RUNNING) ? LINK_UP : LINK_DOWN; - return ret; + if (r == LINK_UNKNOWN) + r = (ifr.ifr_flags & IFF_RUNNING) ? LINK_UP : LINK_DOWN; + close(s); + return r; } -int +static int up_interface(struct interface *iface) { struct ifreq ifr; - int retval = -1; + int s, r; #ifdef __linux__ char *p; #endif + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name)); #ifdef __linux__ @@ -202,17 +207,19 @@ up_interface(struct interface *iface) if ((p = strchr(ifr.ifr_name, ':'))) *p = '\0'; #endif - if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == 0) { + r = -1; + if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { if ((ifr.ifr_flags & IFF_UP)) - retval = 0; + r = 0; else { ifr.ifr_flags |= IFF_UP; - if (ioctl(socket_afnet, SIOCSIFFLAGS, &ifr) == 0) - retval = 0; + if (ioctl(s, SIOCSIFFLAGS, &ifr) == 0) + r = 0; } iface->flags = ifr.ifr_flags; } - return retval; + close(s); + return r; } struct if_head * @@ -508,13 +515,16 @@ discover_interfaces(int argc, char * const *argv) int do_mtu(const char *ifname, short int mtu) { + int s, r; struct ifreq ifr; - int r; + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return -1; memset(&ifr, 0, sizeof(ifr)); strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ifr.ifr_mtu = mtu; - r = ioctl(socket_afnet, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr); + r = ioctl(s, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr); + close(s); if (r == -1) return -1; return ifr.ifr_mtu; diff --git a/net.h b/net.h index 3962e88f..5ce1ff02 100644 --- a/net.h +++ b/net.h @@ -85,10 +85,6 @@ # define IN_LINKLOCAL(addr) ((addr & IN_CLASSB_NET) == LINKLOCAL_ADDR) #endif -extern int socket_afnet; - -int open_sockets(void); - char *hwaddr_ntoa(const unsigned char *, size_t); size_t hwaddr_aton(unsigned char *, const char *); @@ -100,10 +96,8 @@ int do_mtu(const char *, short int); #define get_mtu(iface) do_mtu(iface, 0) #define set_mtu(iface, mtu) do_mtu(iface, mtu) -int up_interface(struct interface *); int if_conf(struct interface *); int if_init(struct interface *); -void if_free(void); int open_link_socket(void); int manage_link(int);