diff options
author | 2001-11-23 17:12:10 +0000 | |
---|---|---|
committer | 2001-11-23 17:12:10 +0000 | |
commit | 2d1f164cac935056a9fe33b0ad9abaedb0487b74 (patch) | |
tree | fa5fe174e2a4202b6638c83538c7a9fcfc8dc789 | |
parent | Removed an unsed variable (oops) (diff) | |
download | wireguard-openbsd-2d1f164cac935056a9fe33b0ad9abaedb0487b74.tar.xz wireguard-openbsd-2d1f164cac935056a9fe33b0ad9abaedb0487b74.zip |
Be paranoid about non-zero netmasks being associated with INET addresses
of 0.0.0.0.
The OpenBSD PF_ROUTE/NET_RT_DUMP sysctl is sending back routes with
RTAX_NETMASK set, but the corresponding sockaddr being 4 zero bytes
(with an address family of zero). ppp was getting confused by this
and ending up interpreting it as a 0.0.0.0/32 routing table
destination and subsequently failing to do anything with the route.
Specifically, after this fix, ppp under OpenBSD can successfully
change and delete the default route again !
-rw-r--r-- | usr.sbin/ppp/ppp/ncpaddr.c | 23 | ||||
-rw-r--r-- | usr.sbin/ppp/ppp/route.c | 4 |
2 files changed, 21 insertions, 6 deletions
diff --git a/usr.sbin/ppp/ppp/ncpaddr.c b/usr.sbin/ppp/ppp/ncpaddr.c index aa99bda11b5..943db3dd937 100644 --- a/usr.sbin/ppp/ppp/ncpaddr.c +++ b/usr.sbin/ppp/ppp/ncpaddr.c @@ -591,8 +591,13 @@ ncprange_sethost(struct ncprange *range, const struct ncpaddr *from) case AF_INET: range->ncprange_family = AF_INET; range->ncprange_ip4addr = from->ncpaddr_ip4addr; - range->ncprange_ip4mask.s_addr = INADDR_BROADCAST; - range->ncprange_ip4width = 32; + if (from->ncpaddr_ip4addr.s_addr == INADDR_ANY) { + range->ncprange_ip4mask.s_addr = INADDR_ANY; + range->ncprange_ip4width = 0; + } else { + range->ncprange_ip4mask.s_addr = INADDR_BROADCAST; + range->ncprange_ip4width = 32; + } break; #ifndef NOINET6 @@ -654,8 +659,13 @@ ncprange_setip4host(struct ncprange *range, struct in_addr from) { range->ncprange_family = AF_INET; range->ncprange_ip4addr = from; - range->ncprange_ip4mask.s_addr = INADDR_BROADCAST; - range->ncprange_ip4width = 32; + if (from.s_addr == INADDR_ANY) { + range->ncprange_ip4mask.s_addr = INADDR_ANY; + range->ncprange_ip4width = 0; + } else { + range->ncprange_ip4mask.s_addr = INADDR_BROADCAST; + range->ncprange_ip4width = 32; + } } void @@ -693,7 +703,10 @@ ncprange_setsa(struct ncprange *range, const struct sockaddr *host, case AF_INET: range->ncprange_family = AF_INET; range->ncprange_ip4addr = host4->sin_addr; - if (mask4) { + if (host4->sin_addr.s_addr == INADDR_ANY) { + range->ncprange_ip4mask.s_addr = INADDR_ANY; + range->ncprange_ip4width = 0; + } else if (mask4 && mask4->sin_family == AF_INET) { range->ncprange_ip4mask.s_addr = mask4->sin_addr.s_addr; range->ncprange_ip4width = mask42bits(mask4->sin_addr); } else { diff --git a/usr.sbin/ppp/ppp/route.c b/usr.sbin/ppp/ppp/route.c index f003ec605ca..6bef97739f1 100644 --- a/usr.sbin/ppp/ppp/route.c +++ b/usr.sbin/ppp/ppp/route.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $OpenBSD: route.c,v 1.19 2001/11/23 15:46:10 brian Exp $ + * $OpenBSD: route.c,v 1.20 2001/11/23 17:12:10 brian Exp $ */ #include <sys/param.h> @@ -317,6 +317,8 @@ route_ParseHdr(struct rt_msghdr *rtm, struct sockaddr *sa[RTAX_MAX]) if (rtm->rtm_addrs & (1 << rtax)) { sa[rtax] = (struct sockaddr *)wp; wp += ROUNDUP(sa[rtax]->sa_len); + if (sa[rtax]->sa_family == 0) + sa[rtax] = NULL; /* ??? */ } else sa[rtax] = NULL; } |