]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Don't hold onto an AF_INET socket for the duration of the program,
authorRoy Marples <roy@marples.name>
Fri, 7 Feb 2014 11:03:39 +0000 (11:03 +0000)
committerRoy Marples <roy@marples.name>
Fri, 7 Feb 2014 11:03:39 +0000 (11:03 +0000)
open and close it as required.

dhcpcd.c
if-bsd.c
if-linux.c
net.c
net.h

index 8502a7225e3a6adfac49e2085c477a5ca4b4256f..df1e7447ffb68d3561dd3ae80b6cb61dcc514a46 100644 (file)
--- 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) {
index 302abc0bc181a3757bd63aa3104105b99c691dda..320e94efb824308b1e8ba059f64873e8ec11885f 100644 (file)
--- a/if-bsd.c
+++ b/if-bsd.c
 #  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())
index 6a932152961064bdd888a11659b19fd8c053eb51..69b4ca7daa9f3bbdfc7ec3ec8f7d1971712a3660 100644 (file)
@@ -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 13aa9a664bf2f33c27ab1dcd41a108f3dfa877b4..c440b9241d01d5e3a51daa04dea99452028e6f4b 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1,6 +1,6 @@
 /*
  * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2013 Roy Marples <roy@marples.name>
+ * Copyright (c) 2006-2014 Roy Marples <roy@marples.name>
  * 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 3962e88f7ead1ad24ed67f316e5f256a58d7ba9a..5ce1ff02e56f7d2aa094968e6d08d8c68516352f 100644 (file)
--- a/net.h
+++ b/net.h
 # 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);