Sync
This commit is contained in:
parent
ec58a5344d
commit
f0364f8372
|
@ -164,8 +164,6 @@ dhcp_printoptions(const struct dhcpcd_ctx *ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define get_option_raw(ctx, bootp, bootp_len, opt) \
|
|
||||||
get_option((ctx), (bootp), (bootp_len), NULL)
|
|
||||||
static const uint8_t *
|
static const uint8_t *
|
||||||
get_option(struct dhcpcd_ctx *ctx,
|
get_option(struct dhcpcd_ctx *ctx,
|
||||||
const struct bootp *bootp, size_t bootp_len,
|
const struct bootp *bootp, size_t bootp_len,
|
||||||
|
@ -3275,26 +3273,35 @@ is_packet_udp_bootp(void *packet, size_t plen)
|
||||||
{
|
{
|
||||||
struct ip *ip = packet;
|
struct ip *ip = packet;
|
||||||
size_t ip_hlen;
|
size_t ip_hlen;
|
||||||
struct udphdr *udp;
|
struct udphdr udp;
|
||||||
|
|
||||||
if (sizeof(*ip) > plen)
|
if (plen < sizeof(*ip))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (ip->ip_v != IPVERSION || ip->ip_p != IPPROTO_UDP)
|
if (ip->ip_v != IPVERSION || ip->ip_p != IPPROTO_UDP)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Sanity. */
|
/* Sanity. */
|
||||||
if (ntohs(ip->ip_len) != plen)
|
if (ntohs(ip->ip_len) > plen)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ip_hlen = (size_t)ip->ip_hl * 4;
|
ip_hlen = (size_t)ip->ip_hl * 4;
|
||||||
|
if (ip_hlen < sizeof(*ip))
|
||||||
|
return false;
|
||||||
|
|
||||||
/* Check we have a UDP header and BOOTP. */
|
/* 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;
|
return false;
|
||||||
|
|
||||||
/* Check it's to and from the right ports. */
|
/* 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 false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -3306,14 +3313,17 @@ checksums_valid(void *packet,
|
||||||
struct in_addr *from, unsigned int flags)
|
struct in_addr *from, unsigned int flags)
|
||||||
{
|
{
|
||||||
struct ip *ip = packet;
|
struct ip *ip = packet;
|
||||||
struct ip pseudo_ip = {
|
union pip {
|
||||||
.ip_p = IPPROTO_UDP,
|
struct ip ip;
|
||||||
.ip_src = ip->ip_src,
|
uint16_t w[sizeof(struct ip)];
|
||||||
.ip_dst = ip->ip_dst
|
} pip = {
|
||||||
|
.ip.ip_p = IPPROTO_UDP,
|
||||||
|
.ip.ip_src = ip->ip_src,
|
||||||
|
.ip.ip_dst = ip->ip_dst,
|
||||||
};
|
};
|
||||||
size_t ip_hlen;
|
size_t ip_hlen;
|
||||||
uint16_t udp_len, uh_sum;
|
struct udphdr udp;
|
||||||
struct udphdr *udp;
|
char *udpp, *uh_sump;
|
||||||
uint32_t csum;
|
uint32_t csum;
|
||||||
|
|
||||||
if (from != NULL)
|
if (from != NULL)
|
||||||
|
@ -3324,22 +3334,32 @@ checksums_valid(void *packet,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (flags & BPF_PARTIALCSUM)
|
if (flags & BPF_PARTIALCSUM)
|
||||||
return 0;
|
return true;
|
||||||
|
|
||||||
udp = (struct udphdr *)(void *)((char *)ip + ip_hlen);
|
udpp = (char *)ip + ip_hlen;
|
||||||
if (udp->uh_sum == 0)
|
memcpy(&udp, udpp, sizeof(udp));
|
||||||
return 0;
|
if (udp.uh_sum == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
/* UDP checksum is based on a pseudo IP header alongside
|
/* UDP checksum is based on a pseudo IP header alongside
|
||||||
* the UDP header and payload. */
|
* the UDP header and payload. */
|
||||||
udp_len = ntohs(udp->uh_ulen);
|
pip.ip.ip_len = udp.uh_ulen;
|
||||||
uh_sum = udp->uh_sum;
|
|
||||||
udp->uh_sum = 0;
|
|
||||||
pseudo_ip.ip_len = udp->uh_ulen;
|
|
||||||
csum = 0;
|
csum = 0;
|
||||||
in_cksum(&pseudo_ip, sizeof(pseudo_ip), &csum);
|
|
||||||
csum = in_cksum(udp, udp_len, &csum);
|
/* Need to zero the UDP sum in the packet for the checksum to work. */
|
||||||
return csum == uh_sum;
|
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
|
static void
|
||||||
|
|
|
@ -1984,12 +1984,10 @@ printpidfile:
|
||||||
logdebugx(PACKAGE "-" VERSION " starting");
|
logdebugx(PACKAGE "-" VERSION " starting");
|
||||||
ctx.options |= DHCPCD_STARTED;
|
ctx.options |= DHCPCD_STARTED;
|
||||||
|
|
||||||
#ifdef HAVE_SETPROCTITLE
|
|
||||||
setproctitle("%s%s%s",
|
setproctitle("%s%s%s",
|
||||||
ctx.options & DHCPCD_MASTER ? "[master]" : argv[optind],
|
ctx.options & DHCPCD_MASTER ? "[master]" : argv[optind],
|
||||||
ctx.options & DHCPCD_IPV4 ? " [ip4]" : "",
|
ctx.options & DHCPCD_IPV4 ? " [ip4]" : "",
|
||||||
ctx.options & DHCPCD_IPV6 ? " [ip6]" : "");
|
ctx.options & DHCPCD_IPV6 ? " [ip6]" : "");
|
||||||
#endif
|
|
||||||
|
|
||||||
if (if_opensockets(&ctx) == -1) {
|
if (if_opensockets(&ctx) == -1) {
|
||||||
logerr("%s: if_opensockets", __func__);
|
logerr("%s: if_opensockets", __func__);
|
||||||
|
@ -2155,6 +2153,9 @@ exit1:
|
||||||
loginfox(PACKAGE " exited");
|
loginfox(PACKAGE " exited");
|
||||||
logclose();
|
logclose();
|
||||||
free(ctx.logfile);
|
free(ctx.logfile);
|
||||||
|
#ifdef SETPROCTITLE_H
|
||||||
|
setproctitle_free();
|
||||||
|
#endif
|
||||||
#ifdef USE_SIGNALS
|
#ifdef USE_SIGNALS
|
||||||
if (ctx.options & DHCPCD_FORKED)
|
if (ctx.options & DHCPCD_FORKED)
|
||||||
_exit(i); /* so atexit won't remove our pidfile */
|
_exit(i); /* so atexit won't remove our pidfile */
|
||||||
|
|
|
@ -1253,7 +1253,9 @@ out:
|
||||||
* or DHCP6 handlers and the existance of any useable
|
* or DHCP6 handlers and the existance of any useable
|
||||||
* global address on the interface has changed,
|
* global address on the interface has changed,
|
||||||
* call rt_build to add/remove the default route. */
|
* 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) &&
|
!(ctx->options & DHCPCD_RTBUILD) &&
|
||||||
(ipv6_anyglobal(ifp) != NULL) != anyglobal)
|
(ipv6_anyglobal(ifp) != NULL) != anyglobal)
|
||||||
rt_build(ctx, AF_INET6);
|
rt_build(ctx, AF_INET6);
|
||||||
|
|
Loading…
Reference in New Issue