Module Name: src Committed By: martin Date: Wed Oct 16 17:41:40 UTC 2019
Modified Files: src/doc [netbsd-9]: 3RDPARTY src/external/bsd/dhcpcd/dist/src [netbsd-9]: defs.h dhcp.c dhcpcd.c ipv6.c Log Message: Pull up the following revisions, requested by roy in ticket #340: external/bsd/dhcpcd/dist/src/defs.h up to 1.1.1.32 external/bsd/dhcpcd/dist/src/dhcp.c up to 1.29 external/bsd/dhcpcd/dist/src/dhcpcd.c up to 1.28 external/bsd/dhcpcd/dist/src/ipv6.c up to 1.6 src/doc/3RDPARTY (manually edited) Import dhcpcd-8.1.1 with the following changes: * IPv6: Fix a potential crash when learning interface addresses. * DHCP: Fix fallout from dhcpcd-8.1.0 for checksum calculation. To generate a diff of this commit: cvs rdiff -u -r1.1640.2.4 -r1.1640.2.5 src/doc/3RDPARTY cvs rdiff -u -r1.1.1.25.2.2 -r1.1.1.25.2.3 \ src/external/bsd/dhcpcd/dist/src/defs.h cvs rdiff -u -r1.23.2.2 -r1.23.2.3 src/external/bsd/dhcpcd/dist/src/dhcp.c \ src/external/bsd/dhcpcd/dist/src/dhcpcd.c cvs rdiff -u -r1.3.2.2 -r1.3.2.3 src/external/bsd/dhcpcd/dist/src/ipv6.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/doc/3RDPARTY diff -u src/doc/3RDPARTY:1.1640.2.4 src/doc/3RDPARTY:1.1640.2.5 --- src/doc/3RDPARTY:1.1640.2.4 Sat Oct 12 14:44:31 2019 +++ src/doc/3RDPARTY Wed Oct 16 17:41:40 2019 @@ -1,4 +1,4 @@ -# $NetBSD: 3RDPARTY,v 1.1640.2.4 2019/10/12 14:44:31 martin Exp $ +# $NetBSD: 3RDPARTY,v 1.1640.2.5 2019/10/16 17:41:40 martin Exp $ # # This file contains a list of the software that has been integrated into # NetBSD where we are not the primary maintainer. @@ -341,12 +341,12 @@ Notes: Use the dhcp2netbsd script. Package: dhcpcd -Version: 8.1.0 -Current Vers: 8.1.0 +Version: 8.1.1 +Current Vers: 8.1.1 Maintainer: roy Archive Site: ftp://roy.marples.name/pub/dhcpcd/ Home Page: http://roy.marples.name/projects/dhcpcd/ -Date: 2019-10-12 +Date: 2019-10-16 Mailing List: dhcpcd-disc...@marples.name License: BSD (2-clause) Location: external/bsd/dhcpcd/dist Index: src/external/bsd/dhcpcd/dist/src/defs.h diff -u src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.2 src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.3 --- src/external/bsd/dhcpcd/dist/src/defs.h:1.1.1.25.2.2 Sat Oct 12 14:44:32 2019 +++ src/external/bsd/dhcpcd/dist/src/defs.h Wed Oct 16 17:41:40 2019 @@ -29,7 +29,7 @@ #define CONFIG_H #define PACKAGE "dhcpcd" -#define VERSION "8.1.0" +#define VERSION "8.1.1" #ifndef CONFIG # define CONFIG SYSCONFDIR "/" PACKAGE ".conf" Index: src/external/bsd/dhcpcd/dist/src/dhcp.c diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.2 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.3 --- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.23.2.2 Sat Oct 12 14:44:32 2019 +++ src/external/bsd/dhcpcd/dist/src/dhcp.c Wed Oct 16 17:41:40 2019 @@ -164,8 +164,6 @@ dhcp_printoptions(const struct dhcpcd_ct } } -#define get_option_raw(ctx, bootp, bootp_len, opt) \ - get_option((ctx), (bootp), (bootp_len), NULL) static const uint8_t * get_option(struct dhcpcd_ctx *ctx, const struct bootp *bootp, size_t bootp_len, @@ -3275,26 +3273,35 @@ is_packet_udp_bootp(void *packet, size_t { struct ip *ip = packet; size_t ip_hlen; - struct udphdr *udp; + struct udphdr udp; - if (sizeof(*ip) > plen) + if (plen < sizeof(*ip)) return false; if (ip->ip_v != IPVERSION || ip->ip_p != IPPROTO_UDP) return false; /* Sanity. */ - if (ntohs(ip->ip_len) != plen) + if (ntohs(ip->ip_len) > plen) return false; ip_hlen = (size_t)ip->ip_hl * 4; + if (ip_hlen < sizeof(*ip)) + return false; + /* Check we have a UDP header and BOOTP. */ - if (ip_hlen + sizeof(*udp) + offsetof(struct bootp, vend) > plen) + if (ip_hlen + sizeof(udp) + offsetof(struct bootp, vend) > plen) + return false; + + /* Sanity. */ + memcpy(&udp, (char *)ip + ip_hlen, sizeof(udp)); + if (ntohs(udp.uh_ulen) < sizeof(udp)) + return false; + if (ip_hlen + ntohs(udp.uh_ulen) > plen) return false; /* Check it's to and from the right ports. */ - udp = (struct udphdr *)(void *)((char *)ip + ip_hlen); - if (udp->uh_dport != htons(BOOTPC) || udp->uh_sport != htons(BOOTPS)) + if (udp.uh_dport != htons(BOOTPC) || udp.uh_sport != htons(BOOTPS)) return false; return true; @@ -3306,14 +3313,17 @@ checksums_valid(void *packet, struct in_addr *from, unsigned int flags) { struct ip *ip = packet; - struct ip pseudo_ip = { - .ip_p = IPPROTO_UDP, - .ip_src = ip->ip_src, - .ip_dst = ip->ip_dst + union pip { + struct ip ip; + uint16_t w[sizeof(struct ip)]; + } pip = { + .ip.ip_p = IPPROTO_UDP, + .ip.ip_src = ip->ip_src, + .ip.ip_dst = ip->ip_dst, }; size_t ip_hlen; - uint16_t udp_len, uh_sum; - struct udphdr *udp; + struct udphdr udp; + char *udpp, *uh_sump; uint32_t csum; if (from != NULL) @@ -3324,22 +3334,32 @@ checksums_valid(void *packet, return false; if (flags & BPF_PARTIALCSUM) - return 0; + return true; - udp = (struct udphdr *)(void *)((char *)ip + ip_hlen); - if (udp->uh_sum == 0) - return 0; + udpp = (char *)ip + ip_hlen; + memcpy(&udp, udpp, sizeof(udp)); + if (udp.uh_sum == 0) + return true; /* UDP checksum is based on a pseudo IP header alongside * the UDP header and payload. */ - udp_len = ntohs(udp->uh_ulen); - uh_sum = udp->uh_sum; - udp->uh_sum = 0; - pseudo_ip.ip_len = udp->uh_ulen; + pip.ip.ip_len = udp.uh_ulen; csum = 0; - in_cksum(&pseudo_ip, sizeof(pseudo_ip), &csum); - csum = in_cksum(udp, udp_len, &csum); - return csum == uh_sum; + + /* Need to zero the UDP sum in the packet for the checksum to work. */ + uh_sump = udpp + offsetof(struct udphdr, uh_sum); + memset(uh_sump, 0, sizeof(udp.uh_sum)); + + /* Checksum psuedo header and then UDP + payload. */ + in_cksum(pip.w, sizeof(pip.w), &csum); + csum = in_cksum(udpp, ntohs(udp.uh_ulen), &csum); + +#if 0 /* Not needed, just here for completeness. */ + /* Put the checksum back. */ + memcpy(uh_sump, &udp.uh_sum, sizeof(udp.uh_sum)); +#endif + + return csum == udp.uh_sum; } static void Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.2 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.3 --- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.23.2.2 Sat Oct 12 14:44:32 2019 +++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Wed Oct 16 17:41:40 2019 @@ -1984,12 +1984,10 @@ printpidfile: logdebugx(PACKAGE "-" VERSION " starting"); ctx.options |= DHCPCD_STARTED; -#ifdef HAVE_SETPROCTITLE setproctitle("%s%s%s", ctx.options & DHCPCD_MASTER ? "[master]" : argv[optind], ctx.options & DHCPCD_IPV4 ? " [ip4]" : "", ctx.options & DHCPCD_IPV6 ? " [ip6]" : ""); -#endif if (if_opensockets(&ctx) == -1) { logerr("%s: if_opensockets", __func__); @@ -2155,6 +2153,9 @@ exit1: loginfox(PACKAGE " exited"); logclose(); free(ctx.logfile); +#ifdef SETPROCTITLE_H + setproctitle_free(); +#endif #ifdef USE_SIGNALS if (ctx.options & DHCPCD_FORKED) _exit(i); /* so atexit won't remove our pidfile */ Index: src/external/bsd/dhcpcd/dist/src/ipv6.c diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.2 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.3 --- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.3.2.2 Sat Oct 12 14:44:32 2019 +++ src/external/bsd/dhcpcd/dist/src/ipv6.c Wed Oct 16 17:41:40 2019 @@ -1253,7 +1253,9 @@ out: * or DHCP6 handlers and the existance of any useable * global address on the interface has changed, * call rt_build to add/remove the default route. */ - if (ifp->active && ifp->options->options & DHCPCD_IPV6 && + if (ifp->active && + ((ifp->options != NULL && ifp->options->options & DHCPCD_IPV6) || + (ifp->options == NULL && ctx->options & DHCPCD_IPV6)) && !(ctx->options & DHCPCD_RTBUILD) && (ipv6_anyglobal(ifp) != NULL) != anyglobal) rt_build(ctx, AF_INET6);