Module Name: src Committed By: snj Date: Tue Aug 4 20:23:37 UTC 2009
Modified Files: src/doc [netbsd-5-0]: 3RDPARTY CHANGES src/external/bsd/dhcpcd/dist [netbsd-5-0]: client.c config.h configure.c dhcp.c dhcp.h dhcpcd-run-hooks.8.in dhcpcd.8.in dhcpcd.c dhcpcd.conf.5.in net.c net.h signals.c Log Message: Apply patch (requested by roy in ticket #880): Update dhcpcd to 4.0.14. To generate a diff of this commit: cvs rdiff -u -r1.647.2.6 -r1.647.2.6.2.1 src/doc/3RDPARTY cvs rdiff -u -r1.1142.2.7 -r1.1142.2.7.2.1 src/doc/CHANGES cvs rdiff -u -r1.1.1.2.6.2 -r1.1.1.2.6.2.2.1 \ src/external/bsd/dhcpcd/dist/client.c \ src/external/bsd/dhcpcd/dist/config.h src/external/bsd/dhcpcd/dist/dhcp.c \ src/external/bsd/dhcpcd/dist/dhcpcd.c cvs rdiff -u -r1.1.1.2.6.1 -r1.1.1.2.6.1.2.1 \ src/external/bsd/dhcpcd/dist/configure.c \ src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in \ src/external/bsd/dhcpcd/dist/dhcpcd.8.in \ src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in \ src/external/bsd/dhcpcd/dist/net.c src/external/bsd/dhcpcd/dist/signals.c cvs rdiff -u -r1.1.1.2 -r1.1.1.2.10.1 src/external/bsd/dhcpcd/dist/dhcp.h cvs rdiff -u -r1.1.1.1.8.1 -r1.1.1.1.8.1.2.1 \ src/external/bsd/dhcpcd/dist/net.h 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.647.2.6 src/doc/3RDPARTY:1.647.2.6.2.1 --- src/doc/3RDPARTY:1.647.2.6 Mon Mar 2 20:24:26 2009 +++ src/doc/3RDPARTY Tue Aug 4 20:23:37 2009 @@ -1,4 +1,4 @@ -# $NetBSD: 3RDPARTY,v 1.647.2.6 2009/03/02 20:24:26 snj Exp $ +# $NetBSD: 3RDPARTY,v 1.647.2.6.2.1 2009/08/04 20:23:37 snj Exp $ # # This file contains a list of the software that has been integrated into # NetBSD where we are not the primary maintainer. @@ -232,8 +232,8 @@ top of the current tree. Package: dhcpcd -Version: 4.0.10 -Current Vers: 4.0.10 +Version: 4.0.14 +Current Vers: 4.0.14/5.0.7 Maintainer: roy Archive Site: ftp://roy.marples.name/pub/dhcpcd/ Home Page: http://roy.marples.name/projects/dhcpcd/ Index: src/doc/CHANGES diff -u src/doc/CHANGES:1.1142.2.7 src/doc/CHANGES:1.1142.2.7.2.1 --- src/doc/CHANGES:1.1142.2.7 Mon Mar 2 21:02:25 2009 +++ src/doc/CHANGES Tue Aug 4 20:23:37 2009 @@ -1,4 +1,4 @@ -# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.1142.2.7 $> +# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.1142.2.7.2.1 $> # # # [Note: This file does not mention every change made to the NetBSD source tree. @@ -1161,3 +1161,4 @@ ntp: import ntp 4.2.4p6. openssl API related security fix. [kardel 20090108] dhcpcd(8): Import 4.0.10 [roy 20090204] + dhcpcd(8): Import 4.0.14 [roy 20090804] Index: src/external/bsd/dhcpcd/dist/client.c diff -u src/external/bsd/dhcpcd/dist/client.c:1.1.1.2.6.2 src/external/bsd/dhcpcd/dist/client.c:1.1.1.2.6.2.2.1 --- src/external/bsd/dhcpcd/dist/client.c:1.1.1.2.6.2 Fri Feb 6 02:25:38 2009 +++ src/external/bsd/dhcpcd/dist/client.c Tue Aug 4 20:23:37 2009 @@ -368,7 +368,7 @@ return; lease->addr.s_addr = dhcp->yiaddr; - if (get_option_addr(&lease->net.s_addr, dhcp, DHO_SUBNETMASK) == -1) + if (get_option_addr(&lease->net, dhcp, DHO_SUBNETMASK) == -1) lease->net.s_addr = get_netmask(dhcp->yiaddr); if (get_option_uint32(&lease->leasetime, dhcp, DHO_LEASETIME) == 0) { /* Ensure that we can use the lease */ @@ -685,7 +685,9 @@ if (r == -1) { state->state = STATE_INIT; timerclear(&state->timeout); - timerclear(&state->stop); + /* We need to set a timeout so we fall through gracefully */ + state->stop.tv_sec = 1; + state->stop.tv_usec = 0; do_socket(state, SOCKET_CLOSED); } return r; @@ -835,12 +837,24 @@ } /* We configured our array in the order we should deal with them */ - for (i = 0; i < nfds; i++) - if (fds[i].revents & POLLIN) { + for (i = 0; i < nfds; i++) { + if (fds[i].revents & POLLERR) { + syslog(LOG_ERR, "poll: POLLERR on fd %d", fds[i].fd); + errno = EBADF; + return -1; + } + if (fds[i].revents & POLLNVAL) { + syslog(LOG_ERR, "poll: POLLNVAL on fd %d", fds[i].fd); + errno = EINVAL; + return -1; + } + if (fds[i].revents & (POLLIN | POLLHUP)) { *fd = fds[i].fd; return r; } - return r; + } + /* We should never get here. */ + return 0; } static int @@ -1039,6 +1053,7 @@ { logger(LOG_INFO, "probing for an IPV4LL address"); free(state->offer); + lease->frominfo = 0; state->offer = ipv4ll_get_dhcp(0); gotlease = 0; } @@ -1246,6 +1261,8 @@ timerclear(&state->stop); /* FALLTHROUGH */ case STATE_INIT: + if (state->carrier == LINK_DOWN) + return 0; do_socket(state, SOCKET_OPEN); state->xid = arc4random(); iface->start_uptime = uptime(); @@ -1269,8 +1286,6 @@ } /* FALLTHROUGH */ case STATE_INIT: - if (state->carrier == LINK_DOWN) - return 0; if (lease->addr.s_addr == 0 || IN_LINKLOCAL(ntohl(iface->addr.s_addr))) { @@ -1346,7 +1361,7 @@ addr.s_addr = dhcp->yiaddr; a = xstrdup(inet_ntoa(addr)); } - r = get_option_addr(&addr.s_addr, dhcp, DHO_SERVERID); + r = get_option_addr(&addr, dhcp, DHO_SERVERID); if (dhcp->servername[0] && r == 0) logger(lvl, "%s %s from %s `%s'", msg, a, inet_ntoa(addr), dhcp->servername); @@ -1374,7 +1389,12 @@ /* We have to have DHCP type to work */ if (get_option_uint8(&type, dhcp, DHO_MESSAGETYPE) == -1) { - log_dhcp(LOG_ERR, "no DHCP type in", dhcp); + logger(LOG_ERR, "ignoring message; no DHCP type"); + return 0; + } + /* Every DHCP message should include ServerID */ + if (get_option_addr(&addr, dhcp, DHO_SERVERID) == -1) { + logger(LOG_ERR, "ignoring message; no Server ID"); return 0; } @@ -1382,7 +1402,7 @@ * We should expand this to check IP and/or hardware address * at the packet level. */ if (options->blacklist_len != 0 && - get_option_addr(&addr.s_addr, dhcp, DHO_SERVERID) == 0) + get_option_addr(&addr, dhcp, DHO_SERVERID) == 0) { for (i = 0; i < options->blacklist_len; i++) { if (options->blacklist[i] != addr.s_addr) @@ -1434,7 +1454,7 @@ if (type == DHCP_OFFER && state->state == STATE_DISCOVERING) { lease->addr.s_addr = dhcp->yiaddr; - get_option_addr(&lease->server.s_addr, dhcp, DHO_SERVERID); + get_option_addr(&lease->server, dhcp, DHO_SERVERID); log_dhcp(LOG_INFO, "offered", dhcp); if (state->options & DHCPCD_TEST) { run_script(options, iface->name, "TEST", dhcp, NULL); @@ -1467,7 +1487,7 @@ case STATE_RENEWING: case STATE_REBINDING: if (!(state->options & DHCPCD_INFORM)) { - get_option_addr(&lease->server.s_addr, + get_option_addr(&lease->server, dhcp, DHO_SERVERID); log_dhcp(LOG_INFO, "acknowledged", dhcp); } @@ -1533,7 +1553,7 @@ } if (bytes == -1) break; - if (valid_udp_packet(packet) == -1) + if (valid_udp_packet(packet, bytes) == -1) continue; bytes = get_udp_data(&pp, packet); if ((size_t)bytes > sizeof(*dhcp)) { Index: src/external/bsd/dhcpcd/dist/config.h diff -u src/external/bsd/dhcpcd/dist/config.h:1.1.1.2.6.2 src/external/bsd/dhcpcd/dist/config.h:1.1.1.2.6.2.2.1 --- src/external/bsd/dhcpcd/dist/config.h:1.1.1.2.6.2 Fri Feb 6 02:25:38 2009 +++ src/external/bsd/dhcpcd/dist/config.h Tue Aug 4 20:23:37 2009 @@ -28,7 +28,7 @@ #define CONFIG_H #define PACKAGE "dhcpcd" -#define VERSION "4.0.10" +#define VERSION "4.0.14" /* * By default we don't add a local link route if we got a routeable address. Index: src/external/bsd/dhcpcd/dist/dhcp.c diff -u src/external/bsd/dhcpcd/dist/dhcp.c:1.1.1.2.6.2 src/external/bsd/dhcpcd/dist/dhcp.c:1.1.1.2.6.2.2.1 --- src/external/bsd/dhcpcd/dist/dhcp.c:1.1.1.2.6.2 Fri Feb 6 02:25:38 2009 +++ src/external/bsd/dhcpcd/dist/dhcp.c Tue Aug 4 20:23:37 2009 @@ -327,25 +327,27 @@ } int -get_option_addr(uint32_t *a, const struct dhcp_message *dhcp, uint8_t option) +get_option_addr(struct in_addr *a, const struct dhcp_message *dhcp, + uint8_t option) { const uint8_t *p = get_option_raw(dhcp, option); if (!p) return -1; - memcpy(a, p, sizeof(*a)); + memcpy(&a->s_addr, p, sizeof(a->s_addr)); return 0; } int get_option_uint32(uint32_t *i, const struct dhcp_message *dhcp, uint8_t option) { - uint32_t a; + const uint8_t *p = get_option_raw(dhcp, option); + uint32_t d; - if (get_option_addr(&a, dhcp, option) == -1) + if (!p) return -1; - - *i = ntohl(a); + memcpy(&d, p, sizeof(d)); + *i = ntohl(d); return 0; } @@ -1231,14 +1233,14 @@ * message but are not necessarily in the options */ addr.s_addr = dhcp->yiaddr; setvar(&ep, prefix, "ip_address", inet_ntoa(addr)); - if (get_option_addr(&net.s_addr, dhcp, DHO_SUBNETMASK) == -1) { + if (get_option_addr(&net, dhcp, DHO_SUBNETMASK) == -1) { net.s_addr = get_netmask(addr.s_addr); setvar(&ep, prefix, "subnet_mask", inet_ntoa(net)); } i = inet_ntocidr(net); snprintf(cidr, sizeof(cidr), "%d", inet_ntocidr(net)); setvar(&ep, prefix, "subnet_cidr", cidr); - if (get_option_addr(&brd.s_addr, dhcp, DHO_BROADCAST) == -1) { + if (get_option_addr(&brd, dhcp, DHO_BROADCAST) == -1) { brd.s_addr = addr.s_addr | ~net.s_addr; setvar(&ep, prefix, "broadcast_address", inet_ntoa(brd)); } Index: src/external/bsd/dhcpcd/dist/dhcpcd.c diff -u src/external/bsd/dhcpcd/dist/dhcpcd.c:1.1.1.2.6.2 src/external/bsd/dhcpcd/dist/dhcpcd.c:1.1.1.2.6.2.2.1 --- src/external/bsd/dhcpcd/dist/dhcpcd.c:1.1.1.2.6.2 Fri Feb 6 02:25:38 2009 +++ src/external/bsd/dhcpcd/dist/dhcpcd.c Tue Aug 4 20:23:37 2009 @@ -619,7 +619,7 @@ closefrom(3); /* Saves calling fflush(stream) in the logger */ setlinebuf(stdout); - openlog(PACKAGE, LOG_PID, LOG_LOCAL0); + openlog(PACKAGE, LOG_PID, LOG_DAEMON); setlogprefix(PACKAGE ": "); options = xzalloc(sizeof(*options)); Index: src/external/bsd/dhcpcd/dist/configure.c diff -u src/external/bsd/dhcpcd/dist/configure.c:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/configure.c:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/configure.c:1.1.1.2.6.1 Fri Jan 9 03:13:49 2009 +++ src/external/bsd/dhcpcd/dist/configure.c Tue Aug 4 20:23:37 2009 @@ -357,9 +357,9 @@ if (addr.s_addr == 0) addr.s_addr = lease->addr.s_addr; /* Ensure we have all the needed values */ - if (get_option_addr(&net.s_addr, dhcp, DHO_SUBNETMASK) == -1) + if (get_option_addr(&net, dhcp, DHO_SUBNETMASK) == -1) net.s_addr = get_netmask(addr.s_addr); - if (get_option_addr(&brd.s_addr, dhcp, DHO_BROADCAST) == -1) + if (get_option_addr(&brd, dhcp, DHO_BROADCAST) == -1) brd.s_addr = addr.s_addr | ~net.s_addr; } Index: src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in diff -u src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in:1.1.1.2.6.1 Fri Jan 9 03:13:49 2009 +++ src/external/bsd/dhcpcd/dist/dhcpcd-run-hooks.8.in Tue Aug 4 20:23:37 2009 @@ -24,6 +24,7 @@ .\" .Dd August 14, 2008 .Dt DHCPCD.SH 8 SMM +.Os .Sh NAME .Nm dhcpcd-run-hooks .Nd DHCP client configuration script Index: src/external/bsd/dhcpcd/dist/dhcpcd.8.in diff -u src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/dhcpcd.8.in:1.1.1.2.6.1 Fri Jan 9 03:13:49 2009 +++ src/external/bsd/dhcpcd/dist/dhcpcd.8.in Tue Aug 4 20:23:37 2009 @@ -24,6 +24,7 @@ .\" .Dd November 18, 2008 .Dt DHCPCD 8 SMM +.Os .Sh NAME .Nm dhcpcd .Nd an RFC 2131 compliant DHCP client @@ -335,7 +336,7 @@ .Ar clientid of the hardware family and the hardware address. .El -.Ss Restriciting behaviour +.Ss Restricting behaviour .Nm will try to do as much as it can by default. However, there are sometimes situations where you don't want the things to be Index: src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in diff -u src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in:1.1.1.2.6.1 Fri Jan 9 03:13:49 2009 +++ src/external/bsd/dhcpcd/dist/dhcpcd.conf.5.in Tue Aug 4 20:23:37 2009 @@ -24,6 +24,7 @@ .\" .Dd November 18, 2008 .Dt DHCPCD.CONF 5 SMM +.Os .Sh NAME .Nm dhcpcd.conf .Nd dhcpcd configuration file Index: src/external/bsd/dhcpcd/dist/net.c diff -u src/external/bsd/dhcpcd/dist/net.c:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/net.c:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/net.c:1.1.1.2.6.1 Fri Jan 9 03:13:50 2009 +++ src/external/bsd/dhcpcd/dist/net.c Tue Aug 4 20:23:37 2009 @@ -634,44 +634,42 @@ } int -valid_udp_packet(const uint8_t *data) +valid_udp_packet(const uint8_t *data, size_t data_len) { struct udp_dhcp_packet packet; - uint16_t bytes; - uint16_t ipsum; - uint16_t iplen; - uint16_t udpsum; - struct in_addr source; - struct in_addr dest; - int retval = 0; + uint16_t bytes, udpsum; - memcpy(&packet, data, sizeof(packet)); - bytes = ntohs(packet.ip.ip_len); - ipsum = packet.ip.ip_sum; - iplen = packet.ip.ip_len; - udpsum = packet.udp.uh_sum; - - if (0 != checksum(&packet.ip, sizeof(packet.ip))) { + if (data_len > sizeof(packet)) { + errno = EINVAL; + return -1; + } + memcpy(&packet, data, data_len); + if (checksum(&packet.ip, sizeof(packet.ip)) != 0) { errno = EINVAL; return -1; } - packet.ip.ip_sum = 0; - memcpy(&source, &packet.ip.ip_src, sizeof(packet.ip.ip_src)); - memcpy(&dest, &packet.ip.ip_dst, sizeof(packet.ip.ip_dst)); - memset(&packet.ip, 0, sizeof(packet.ip)); + bytes = ntohs(packet.ip.ip_len); + if (data_len < bytes) { + errno = EINVAL; + return -1; + } + udpsum = packet.udp.uh_sum; packet.udp.uh_sum = 0; - - packet.ip.ip_p = IPPROTO_UDP; - memcpy(&packet.ip.ip_src, &source, sizeof(packet.ip.ip_src)); - memcpy(&packet.ip.ip_dst, &dest, sizeof(packet.ip.ip_dst)); + packet.ip.ip_hl = 0; + packet.ip.ip_v = 0; + packet.ip.ip_tos = 0; packet.ip.ip_len = packet.udp.uh_ulen; - if (udpsum && udpsum != checksum(&packet, bytes)) { + packet.ip.ip_id = 0; + packet.ip.ip_off = 0; + packet.ip.ip_ttl = 0; + packet.ip.ip_sum = 0; + if (udpsum && checksum(&packet, bytes) != udpsum) { errno = EINVAL; - retval = -1; + return -1; } - return retval; + return 0; } int Index: src/external/bsd/dhcpcd/dist/signals.c diff -u src/external/bsd/dhcpcd/dist/signals.c:1.1.1.2.6.1 src/external/bsd/dhcpcd/dist/signals.c:1.1.1.2.6.1.2.1 --- src/external/bsd/dhcpcd/dist/signals.c:1.1.1.2.6.1 Fri Feb 6 02:25:38 2009 +++ src/external/bsd/dhcpcd/dist/signals.c Tue Aug 4 20:23:37 2009 @@ -71,11 +71,11 @@ { int sig = -1; char buf[16]; - size_t bytes; + ssize_t bytes; memset(buf, 0, sizeof(buf)); bytes = read(signal_pipe[0], buf, sizeof(buf)); - if (bytes >= sizeof(sig)) + if (bytes >= 0 && (size_t)bytes >= sizeof(sig)) memcpy(&sig, buf, sizeof(sig)); return sig; } Index: src/external/bsd/dhcpcd/dist/dhcp.h diff -u src/external/bsd/dhcpcd/dist/dhcp.h:1.1.1.2 src/external/bsd/dhcpcd/dist/dhcp.h:1.1.1.2.10.1 --- src/external/bsd/dhcpcd/dist/dhcp.h:1.1.1.2 Fri Sep 19 22:59:58 2008 +++ src/external/bsd/dhcpcd/dist/dhcp.h Tue Aug 4 20:23:37 2009 @@ -160,7 +160,7 @@ int make_option_mask(uint8_t *, char **, int); void print_options(void); char *get_option_string(const struct dhcp_message *, uint8_t); -int get_option_addr(uint32_t *, const struct dhcp_message *, uint8_t); +int get_option_addr(struct in_addr *, const struct dhcp_message *, uint8_t); int get_option_uint32(uint32_t *, const struct dhcp_message *, uint8_t); int get_option_uint16(uint16_t *, const struct dhcp_message *, uint8_t); int get_option_uint8(uint8_t *, const struct dhcp_message *, uint8_t); Index: src/external/bsd/dhcpcd/dist/net.h diff -u src/external/bsd/dhcpcd/dist/net.h:1.1.1.1.8.1 src/external/bsd/dhcpcd/dist/net.h:1.1.1.1.8.1.2.1 --- src/external/bsd/dhcpcd/dist/net.h:1.1.1.1.8.1 Fri Jan 9 03:13:50 2009 +++ src/external/bsd/dhcpcd/dist/net.h Tue Aug 4 20:23:37 2009 @@ -160,7 +160,7 @@ ssize_t make_udp_packet(uint8_t **, const uint8_t *, size_t, struct in_addr, struct in_addr); ssize_t get_udp_data(const uint8_t **, const uint8_t *); -int valid_udp_packet(const uint8_t *); +int valid_udp_packet(const uint8_t *, size_t); int open_socket(struct interface *, int); ssize_t send_packet(const struct interface *, struct in_addr,