Module Name: src Committed By: roy Date: Wed Oct 16 14:54:39 UTC 2019
Modified Files: src/external/bsd/dhcpcd/dist/src: dhcp.c dhcpcd.c ipv6.c Log Message: Sync To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/external/bsd/dhcpcd/dist/src/dhcp.c cvs rdiff -u -r1.27 -r1.28 src/external/bsd/dhcpcd/dist/src/dhcpcd.c cvs rdiff -u -r1.5 -r1.6 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/external/bsd/dhcpcd/dist/src/dhcp.c diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.28 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.29 --- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.28 Fri Oct 11 11:03:59 2019 +++ src/external/bsd/dhcpcd/dist/src/dhcp.c Wed Oct 16 14:54:39 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.27 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.28 --- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.27 Fri Oct 11 11:03:59 2019 +++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Wed Oct 16 14:54:39 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.5 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.6 --- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.5 Fri Sep 13 11:01:50 2019 +++ src/external/bsd/dhcpcd/dist/src/ipv6.c Wed Oct 16 14:54:39 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);