summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrian <brian@openbsd.org>2001-11-23 17:12:10 +0000
committerbrian <brian@openbsd.org>2001-11-23 17:12:10 +0000
commit2d1f164cac935056a9fe33b0ad9abaedb0487b74 (patch)
treefa5fe174e2a4202b6638c83538c7a9fcfc8dc789
parentRemoved an unsed variable (oops) (diff)
downloadwireguard-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.c23
-rw-r--r--usr.sbin/ppp/ppp/route.c4
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;
}