Module Name: src Committed By: roy Date: Fri Oct 6 08:49:42 UTC 2023
Modified Files: src/external/bsd/dhcpcd/dist/src: dhcp.c dhcp6.c dhcpcd.c if-options.c ipv6nd.c privsep.c Log Message: sync with dhcpcd-10.0.3 To generate a diff of this commit: cvs rdiff -u -r1.48 -r1.49 src/external/bsd/dhcpcd/dist/src/dhcp.c cvs rdiff -u -r1.30 -r1.31 src/external/bsd/dhcpcd/dist/src/dhcp6.c cvs rdiff -u -r1.51 -r1.52 src/external/bsd/dhcpcd/dist/src/dhcpcd.c cvs rdiff -u -r1.34 -r1.35 src/external/bsd/dhcpcd/dist/src/if-options.c cvs rdiff -u -r1.29 -r1.30 src/external/bsd/dhcpcd/dist/src/ipv6nd.c cvs rdiff -u -r1.15 -r1.16 src/external/bsd/dhcpcd/dist/src/privsep.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.48 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.49 --- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.48 Wed Jul 19 13:53:03 2023 +++ src/external/bsd/dhcpcd/dist/src/dhcp.c Fri Oct 6 08:49:42 2023 @@ -3314,7 +3314,8 @@ dhcp_handledhcp(struct interface *ifp, s state->reason = "TEST"; script_runreason(ifp, state->reason); eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS); - state->bpf->bpf_flags |= BPF_EOF; + if (state->bpf) + state->bpf->bpf_flags |= BPF_EOF; return; } eloop_timeout_delete(ifp->ctx->eloop, send_discover, ifp); Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.30 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.31 --- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.30 Wed Jul 19 13:53:03 2023 +++ src/external/bsd/dhcpcd/dist/src/dhcp6.c Fri Oct 6 08:49:42 2023 @@ -1022,9 +1022,11 @@ dhcp6_makemessage(struct interface *ifp) n--; while (n-- > 0) *ep++ = *pp--; - if (u8) + n = (size_t)(ep - exb); + if (u8) { *ep = (uint8_t)(*pp << u8); - n++; + n++; + } COPYIN(D6_OPTION_PD_EXCLUDE, exb, (uint16_t)n); ia_na_len = (uint16_t) @@ -1628,6 +1630,7 @@ dhcp6_startdiscover(void *arg) struct interface *ifp; struct dhcp6_state *state; int llevel; + struct ipv6_addr *ia; ifp = arg; state = D6_STATE(ifp); @@ -1652,6 +1655,14 @@ dhcp6_startdiscover(void *arg) state->new = NULL; state->new_len = 0; + /* If we fail to renew or confirm, our requested addreses will + * be marked as stale. + To re-request them, just mark them as not stale. */ + TAILQ_FOREACH(ia, &state->addrs, next) { + if (ia->flags & IPV6_AF_REQUEST) + ia->flags &= ~IPV6_AF_STALE; + } + if (dhcp6_makemessage(ifp) == -1) logerr("%s: %s", __func__, ifp->name); else @@ -2268,9 +2279,7 @@ dhcp6_findpd(struct interface *ifp, cons } else { if (!(a->flags & IPV6_AF_DELEGATEDPFX)) a->flags |= IPV6_AF_NEW | IPV6_AF_DELEGATEDPFX; - a->flags &= ~(IPV6_AF_STALE | - IPV6_AF_EXTENDED | - IPV6_AF_REQUEST); + a->flags &= ~(IPV6_AF_STALE | IPV6_AF_EXTENDED); if (a->prefix_vltime != pdp.vltime) a->flags |= IPV6_AF_NEW; } Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.51 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.52 --- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.51 Wed Jul 19 13:53:03 2023 +++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Fri Oct 6 08:49:42 2023 @@ -75,6 +75,9 @@ static const char dhcpcd_copyright[] = " #ifdef HAVE_CAPSICUM #include <sys/capsicum.h> #endif +#ifdef HAVE_OPENSSL +#include <openssl/crypto.h> +#endif #ifdef HAVE_UTIL_H #include <util.h> #endif @@ -1411,6 +1414,7 @@ dhcpcd_renew(struct dhcpcd_ctx *ctx) #ifdef USE_SIGNALS #define sigmsg "received %s, %s" +static volatile bool dhcpcd_exiting = false; void dhcpcd_signal_cb(int sig, void *arg) { @@ -1483,9 +1487,20 @@ dhcpcd_signal_cb(int sig, void *arg) return; } + /* + * Privsep has a mini-eloop for reading data from other processes. + * This mini-eloop processes signals as well so we can reap children. + * During teardown we don't want to process SIGTERM or SIGINT again, + * as that could trigger memory issues. + */ + if (dhcpcd_exiting) + return; + + dhcpcd_exiting = true; if (!(ctx->options & DHCPCD_TEST)) stop_all_interfaces(ctx, opts); eloop_exit(ctx->eloop, exit_code); + dhcpcd_exiting = false; } #endif @@ -1495,7 +1510,7 @@ dhcpcd_handleargs(struct dhcpcd_ctx *ctx { struct interface *ifp; unsigned long long opts; - int opt, oi, do_reboot, do_renew, af = AF_UNSPEC; + int opt, oi, oifind, do_reboot, do_renew, af = AF_UNSPEC; size_t len, l, nifaces; char *tmp, *p; @@ -1511,7 +1526,7 @@ dhcpcd_handleargs(struct dhcpcd_ctx *ctx return control_queue(fd, UNCONST(fd->ctx->cffile), strlen(fd->ctx->cffile) + 1); } else if (strcmp(*argv, "--getinterfaces") == 0) { - optind = argc = 0; + oifind = argc = 0; goto dumplease; } else if (strcmp(*argv, "--listen") == 0) { fd->flags |= FD_LISTEN; @@ -1574,6 +1589,9 @@ dhcpcd_handleargs(struct dhcpcd_ctx *ctx } } + /* store the index; the optind will change when a getopt get called */ + oifind = optind; + if (opts & DHCPCD_DUMPLEASE) { ctx->options |= DHCPCD_DUMPLEASE; dumplease: @@ -1581,11 +1599,11 @@ dumplease: TAILQ_FOREACH(ifp, ctx->ifaces, next) { if (!ifp->active) continue; - for (oi = optind; oi < argc; oi++) { + for (oi = oifind; oi < argc; oi++) { if (strcmp(ifp->name, argv[oi]) == 0) break; } - if (optind == argc || oi < argc) { + if (oifind == argc || oi < argc) { opt = send_interface(NULL, ifp, af); if (opt == -1) goto dumperr; @@ -1597,11 +1615,11 @@ dumplease: TAILQ_FOREACH(ifp, ctx->ifaces, next) { if (!ifp->active) continue; - for (oi = optind; oi < argc; oi++) { + for (oi = oifind; oi < argc; oi++) { if (strcmp(ifp->name, argv[oi]) == 0) break; } - if (optind == argc || oi < argc) { + if (oifind == argc || oi < argc) { if (send_interface(fd, ifp, af) == -1) goto dumperr; } @@ -1620,12 +1638,12 @@ dumperr: } if (opts & (DHCPCD_EXITING | DHCPCD_RELEASE)) { - if (optind == argc) { + if (oifind == argc) { stop_all_interfaces(ctx, opts); eloop_exit(ctx->eloop, EXIT_SUCCESS); return 0; } - for (oi = optind; oi < argc; oi++) { + for (oi = oifind; oi < argc; oi++) { if ((ifp = if_find(ctx->ifaces, argv[oi])) == NULL) continue; if (!ifp->active) @@ -1639,11 +1657,11 @@ dumperr: } if (do_renew) { - if (optind == argc) { + if (oifind == argc) { dhcpcd_renew(ctx); return 0; } - for (oi = optind; oi < argc; oi++) { + for (oi = oifind; oi < argc; oi++) { if ((ifp = if_find(ctx->ifaces, argv[oi])) == NULL) continue; dhcpcd_ifrenew(ifp); @@ -1653,7 +1671,7 @@ dumperr: reload_config(ctx); /* XXX: Respect initial commandline options? */ - reconf_reboot(ctx, do_reboot, argc, argv, optind - 1); + reconf_reboot(ctx, do_reboot, argc, argv, oifind); return 0; } @@ -1822,7 +1840,7 @@ dhcpcd_stderr_cb(void *arg, unsigned sho if (!(events & ELE_READ)) return; - len = read(ctx->stderr_fd, log, sizeof(log)); + len = read(ctx->stderr_fd, log, sizeof(log) - 1); if (len == -1) { if (errno != ECONNRESET) logerr(__func__); @@ -2197,6 +2215,11 @@ printpidfile: } #endif +#ifdef HAVE_OPENSSL + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS | + OPENSSL_INIT_ADD_ALL_DIGESTS | OPENSSL_INIT_LOAD_CONFIG, NULL); +#endif + #ifdef PRIVSEP ps_init(&ctx); #endif Index: src/external/bsd/dhcpcd/dist/src/if-options.c diff -u src/external/bsd/dhcpcd/dist/src/if-options.c:1.34 src/external/bsd/dhcpcd/dist/src/if-options.c:1.35 --- src/external/bsd/dhcpcd/dist/src/if-options.c:1.34 Wed Jul 19 13:53:03 2023 +++ src/external/bsd/dhcpcd/dist/src/if-options.c Fri Oct 6 08:49:42 2023 @@ -1833,6 +1833,8 @@ err_sla: t |= OT_ADDRIPV6; else if (strcasecmp(arg, "string") == 0) t |= OT_STRING; + else if (strcasecmp(arg, "uri") == 0) + t |= OT_URI; else if (strcasecmp(arg, "byte") == 0) t |= OT_UINT8; else if (strcasecmp(arg, "bitflags") == 0) Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.29 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.30 --- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.29 Fri Apr 21 16:54:26 2023 +++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c Fri Oct 6 08:49:42 2023 @@ -1238,7 +1238,7 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx, old_lifetime = rap->lifetime; rap->lifetime = ntohs(nd_ra->nd_ra_router_lifetime); if (!new_rap && rap->lifetime == 0 && old_lifetime != 0) - logwarnx("%s: %s: no longer a default router", + logwarnx("%s: %s: no longer a default router (lifetime = 0)", ifp->name, rap->sfrom); if (nd_ra->nd_ra_curhoplimit != 0) rap->hoplimit = nd_ra->nd_ra_curhoplimit; Index: src/external/bsd/dhcpcd/dist/src/privsep.c diff -u src/external/bsd/dhcpcd/dist/src/privsep.c:1.15 src/external/bsd/dhcpcd/dist/src/privsep.c:1.16 --- src/external/bsd/dhcpcd/dist/src/privsep.c:1.15 Wed Jul 19 13:53:03 2023 +++ src/external/bsd/dhcpcd/dist/src/privsep.c Fri Oct 6 08:49:42 2023 @@ -412,7 +412,6 @@ ps_startprocess(struct ps_process *psp, return pid; } - #ifdef PLUGIN_DEV /* If we are not the root process, stop listening to devices. */ if (ctx->ps_root != psp) @@ -541,11 +540,11 @@ ps_stopprocess(struct ps_process *psp) err = -1; } #endif - psp->psp_fd = -1; } /* Don't wait for the process as it may not respond to the shutdown - * request. We'll reap the process on receipt of SIGCHLD. */ + * request. We'll reap the process on receipt of SIGCHLD where we + * also close the fd. */ return err; } @@ -1200,7 +1199,7 @@ ps_newprocess(struct dhcpcd_ctx *ctx, st #endif if (!(ctx->options & DHCPCD_MANAGER)) - strlcpy(psp->psp_ifname, ctx->ifv[0], sizeof(psp->psp_name)); + strlcpy(psp->psp_ifname, ctx->ifv[0], sizeof(psp->psp_ifname)); TAILQ_INSERT_TAIL(&ctx->ps_processes, psp, next); return psp; }