Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/roy]: src/external/bsd/dhcpcd/dist/src Update to dhcpcd-8.1.6 with the f...



details:   https://anonhg.NetBSD.org/src/rev/e213ce20be7b
branches:  roy
changeset: 744230:e213ce20be7b
user:      roy <roy%NetBSD.org@localhost>
date:      Mon Jan 27 20:41:58 2020 +0000

description:
Update to dhcpcd-8.1.6 with the following changes:

 * INET6: Support a /128 prefix advertised via RA
 * BSD: More address validation from route(4) messages
 * DHCP: Fix a potential segfault on DaD failure
 * IPv4LL: Fix a potential segfault when dropping IPv4LL addresses

diffstat:

 external/bsd/dhcpcd/dist/src/defs.h   |    2 +-
 external/bsd/dhcpcd/dist/src/dhcp.c   |    7 +-
 external/bsd/dhcpcd/dist/src/if-bsd.c |  129 ++++++++++++++-------------------
 external/bsd/dhcpcd/dist/src/ipv6.c   |    9 +-
 external/bsd/dhcpcd/dist/src/ipv6.h   |    3 +
 external/bsd/dhcpcd/dist/src/ipv6nd.c |    3 +-
 external/bsd/dhcpcd/dist/src/script.c |    2 +-
 7 files changed, 72 insertions(+), 83 deletions(-)

diffs (299 lines):

diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/defs.h
--- a/external/bsd/dhcpcd/dist/src/defs.h       Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/defs.h       Mon Jan 27 20:41:58 2020 +0000
@@ -29,7 +29,7 @@
 #define CONFIG_H
 
 #define PACKAGE                        "dhcpcd"
-#define VERSION                        "8.1.5"
+#define VERSION                        "8.1.6"
 
 #ifndef CONFIG
 # define CONFIG                        SYSCONFDIR "/" PACKAGE ".conf"
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/dhcp.c
--- a/external/bsd/dhcpcd/dist/src/dhcp.c       Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/dhcp.c       Mon Jan 27 20:41:58 2020 +0000
@@ -2335,9 +2335,10 @@
 static void
 dhcp_arp_defend_failed(struct arp_state *astate)
 {
-
-       dhcp_drop(astate->iface, "EXPIRED");
-       dhcp_start1(astate->iface);
+       struct interface *ifp = astate->iface;
+
+       dhcp_drop(ifp, "EXPIRED");
+       dhcp_start1(ifp);
 }
 #endif
 
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/if-bsd.c
--- a/external/bsd/dhcpcd/dist/src/if-bsd.c     Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/if-bsd.c     Mon Jan 27 20:41:58 2020 +0000
@@ -860,8 +860,6 @@
        return r;
 }
 
-
-
 #if !(defined(HAVE_IFADDRS_ADDRFLAGS) && defined(HAVE_IFAM_ADDRFLAGS))
 int
 if_addrflags(const struct interface *ifp, const struct in_addr *addr,
@@ -1194,7 +1192,7 @@
 {
        struct interface *ifp;
        const struct sockaddr *rti_info[RTAX_MAX];
-       int addrflags;
+       int flags;
        pid_t pid;
 
        if (ifam->ifam_msglen < sizeof(*ifam)) {
@@ -1216,9 +1214,6 @@
        pid = 0;
 #endif
 
-#ifdef HAVE_IFAM_ADDRFLAGS
-       addrflags = ifam->ifam_addrflags;
-#endif
        switch (rti_info[RTAX_IFA]->sa_family) {
        case AF_LINK:
        {
@@ -1252,78 +1247,70 @@
                bcast.s_addr = sin != NULL && sin->sin_family == AF_INET ?
                    sin->sin_addr.s_addr : INADDR_ANY;
 
-#if defined(__NetBSD_Version__) && __NetBSD_Version__ < 800000000
                /*
                 * NetBSD-7 and older send an invalid broadcast address.
                 * So we need to query the actual address to get
                 * the right one.
+                * We can also use this to test if the address
+                * has really been added or deleted.
                 */
-               {
-#else
-               /*
-                * If the address was deleted, lets check if it's
-                * a late message and it still exists (maybe modified).
-                * If so, ignore it as deleting an address causes
-                * dhcpcd to drop any lease to which it belongs.
-                */
-               if (ifam->ifam_type == RTM_DELADDR) {
-#endif
 #ifdef SIOCGIFALIAS
-                       struct in_aliasreq ifra;
+               struct in_aliasreq ifra;
 
-                       memset(&ifra, 0, sizeof(ifra));
-                       strlcpy(ifra.ifra_name, ifp->name,
-                           sizeof(ifra.ifra_name));
-                       ifra.ifra_addr.sin_family = AF_INET;
-                       ifra.ifra_addr.sin_len = sizeof(ifra.ifra_addr);
-                       ifra.ifra_addr.sin_addr = addr;
-                       if (ioctl(ctx->pf_inet_fd, SIOCGIFALIAS, &ifra) == -1) {
-                               if (errno != ENXIO && errno != EADDRNOTAVAIL)
-                                       logerr("%s: SIOCGIFALIAS", __func__);
-                               if (ifam->ifam_type != RTM_DELADDR)
-                                       break;
-                       }
+               memset(&ifra, 0, sizeof(ifra));
+               strlcpy(ifra.ifra_name, ifp->name, sizeof(ifra.ifra_name));
+               ifra.ifra_addr.sin_family = AF_INET;
+               ifra.ifra_addr.sin_len = sizeof(ifra.ifra_addr);
+               ifra.ifra_addr.sin_addr = addr;
+               if (ioctl(ctx->pf_inet_fd, SIOCGIFALIAS, &ifra) == -1) {
+                       if (errno != ENXIO && errno != EADDRNOTAVAIL)
+                               logerr("%s: SIOCGIFALIAS", __func__);
+                       if (ifam->ifam_type != RTM_DELADDR)
+                               break;
+               } else {
+                       if (ifam->ifam_type == RTM_DELADDR)
+                               break;
 #if defined(__NetBSD_Version__) && __NetBSD_Version__ < 800000000
-                       else
-                               bcast = ifra.ifra_broadaddr.sin_addr;
+                       bcast = ifra.ifra_broadaddr.sin_addr;
 #endif
+               }
 #else
 #warning No SIOCGIFALIAS support
-                       /*
-                        * No SIOCGIFALIAS? That sucks!
-                        * This makes this call very heavy weight, but we
-                        * really need to know if the message is late or not.
-                        */
-                       const struct sockaddr *sa;
-                       struct ifaddrs *ifaddrs = NULL, *ifa;
+               /*
+                * No SIOCGIFALIAS? That sucks!
+                * This makes this call very heavy weight, but we
+                * really need to know if the message is late or not.
+                */
+               const struct sockaddr *sa;
+               struct ifaddrs *ifaddrs = NULL, *ifa;
 
-                       sa = rti_info[RTAX_IFA];
-                       getifaddrs(&ifaddrs);
-                       for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) {
-                               if (ifa->ifa_addr == NULL)
-                                       continue;
-                               if (sa_cmp(ifa->ifa_addr, sa) == 0 &&
-                                   strcmp(ifa->ifa_name, ifp->name) == 0)
-                                       break;
-                       }
-                       freeifaddrs(ifaddrs);
+               sa = rti_info[RTAX_IFA];
+               getifaddrs(&ifaddrs);
+               for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) {
+                       if (ifa->ifa_addr == NULL)
+                               continue;
+                       if (sa_cmp(ifa->ifa_addr, sa) == 0 &&
+                           strcmp(ifa->ifa_name, ifp->name) == 0)
+                               break;
+               }
+               freeifaddrs(ifaddrs);
+               if (ifam->ifam_type == RTM_DELADDR) {
                        if (ifa != NULL)
-                               return 0;
-#endif
-               }
-
-#ifndef HAVE_IFAM_ADDRFLAGS
-               if (ifam->ifam_type == RTM_DELADDR)
-                       addrflags = 0 ;
-               else if ((addrflags = if_addrflags(ifp, &addr, NULL)) == -1) {
-                       if (errno != EADDRNOTAVAIL)
-                               logerr("%s: if_addrflags", __func__);
-                       break;
+                               break;
+               } else {
+                       if (ifa == NULL)
+                               break;
                }
 #endif
 
+#ifdef HAVE_IFAM_ADDRFLAGS
+               flags = ifam->ifam_addrflags;
+#else
+               flags = 0;
+#endif
+
                ipv4_handleifa(ctx, ifam->ifam_type, NULL, ifp->name,
-                   &addr, &mask, &bcast, addrflags, pid);
+                   &addr, &mask, &bcast, flags, pid);
                break;
        }
 #endif
@@ -1332,7 +1319,6 @@
        {
                struct in6_addr addr6, mask6;
                const struct sockaddr_in6 *sin6;
-               int flags;
 
                sin6 = (const void *)rti_info[RTAX_IFA];
                addr6 = sin6->sin6_addr;
@@ -1344,20 +1330,17 @@
                 * a late message and it still exists (maybe modified).
                 * If so, ignore it as deleting an address causes
                 * dhcpcd to drop any lease to which it belongs.
+                * Also check an added address was really added.
                 */
-               if (ifam->ifam_type == RTM_DELADDR) {
-                       flags = if_addrflags6(ifp, &addr6, NULL);
-                       if (flags != -1)
-                               break;
-                       addrflags = 0;
-               }
-#ifndef HAVE_IFAM_ADDRFLAGS
-               else if ((addrflags = if_addrflags6(ifp, &addr6, NULL)) == -1) {
+               flags = if_addrflags6(ifp, &addr6, NULL);
+               if (flags == -1) {
                        if (errno != EADDRNOTAVAIL)
                                logerr("%s: if_addrflags6", __func__);
+                       if (ifam->ifam_type != RTM_DELADDR)
+                               break;
+                       flags = 0;
+               } else if (ifam->ifam_type == RTM_DELADDR)
                        break;
-               }
-#endif
 
 #ifdef __KAME__
                if (IN6_IS_ADDR_LINKLOCAL(&addr6))
@@ -1366,7 +1349,7 @@
 #endif
 
                ipv6_handleifa(ctx, ifam->ifam_type, NULL,
-                   ifp->name, &addr6, ipv6_prefixlen(&mask6), addrflags, pid);
+                   ifp->name, &addr6, ipv6_prefixlen(&mask6), flags, pid);
                break;
        }
 #endif
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/ipv6.c
--- a/external/bsd/dhcpcd/dist/src/ipv6.c       Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/ipv6.c       Mon Jan 27 20:41:58 2020 +0000
@@ -1565,7 +1565,9 @@
        tempaddr = false;
 #endif
 
-       if (ia->flags & IPV6_AF_AUTOCONF && !tempaddr) {
+       if (prefix_len == 128)
+               goto makepfx;
+       else if (ia->flags & IPV6_AF_AUTOCONF && !tempaddr) {
                ia->prefix = *addr;
                ia->dadcounter = ipv6_makeaddr(&ia->addr, ifp,
                                               &ia->prefix,
@@ -1581,13 +1583,12 @@
 #else
                return ia;
 #endif
-       } else if (ia->flags & (IPV6_AF_REQUEST | IPV6_AF_DELEGATEDPFX) &&
-                  prefix_len != 128)
-       {
+       } else if (ia->flags & (IPV6_AF_REQUEST | IPV6_AF_DELEGATEDPFX)) {
                ia->prefix = *addr;
                cbp = inet_ntop(AF_INET6, &ia->prefix, buf, sizeof(buf));
                goto paddr;
        } else {
+makepfx:
                ia->addr = *addr;
                if (ipv6_makeprefix(&ia->prefix,
                                    &ia->addr, ia->prefix_len) == -1)
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/ipv6.h
--- a/external/bsd/dhcpcd/dist/src/ipv6.h       Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/ipv6.h       Mon Jan 27 20:41:58 2020 +0000
@@ -67,6 +67,9 @@
 #define IDGEN_RETRIES  3
 #define IDGEN_DELAY    1 /* second */
 
+/* Interface identifier length. Prefix + this == 128 for autoconf */
+#define ipv6_ifidlen(ifp)      64
+
 #ifndef IN6_ARE_MASKED_ADDR_EQUAL
 #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)     (       \
        (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/ipv6nd.c
--- a/external/bsd/dhcpcd/dist/src/ipv6nd.c     Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/ipv6nd.c     Mon Jan 27 20:41:58 2020 +0000
@@ -1262,7 +1262,8 @@
 #ifdef IPV6_MANAGETEMPADDR
                        /* RFC4941 Section 3.3.3 */
                        if (ap->flags & IPV6_AF_AUTOCONF &&
-                           ip6_use_tempaddr(ap->iface->name))
+                           ip6_use_tempaddr(ap->iface->name) &&
+                           ipv6_ifidlen(ap->iface) + ap->prefix_len == 128)
                        {
                                if (!new_ap) {
                                        if (ipv6_settemptime(ap, 1) == NULL)
diff -r 151ab7d21e0f -r e213ce20be7b external/bsd/dhcpcd/dist/src/script.c
--- a/external/bsd/dhcpcd/dist/src/script.c     Fri Jan 03 12:38:14 2020 +0000
+++ b/external/bsd/dhcpcd/dist/src/script.c     Mon Jan 27 20:41:58 2020 +0000
@@ -453,7 +453,7 @@
 dumplease:
 #ifdef INET
 #ifdef IPV4LL
-       if (protocol == PROTO_IPV4LL) {
+       if (protocol == PROTO_IPV4LL && istate) {
                if (ipv4ll_env(fp, istate->down ? "old" : "new", ifp) == -1)
                        goto eexit;
        }



Home | Main Index | Thread Index | Old Index