shithub: riscv

Download patch

ref: 35cab9b816dbf6eabe94d4ed3eff01ebff68a695
parent: 94d9b7a49d8be66d1db0427335c88d32708f3df8
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Dec 22 15:06:18 EST 2024

ip/dhcpd: don't get confused by ipv6 addresses for bootp Info

When looking up tftp/bootp information from ndb,
filter out ipv6 addresses. This can happen
when for example the tftp= attribute points to
a domain or sys-name that resolves to both
ipv4 and ipv6 addresses.

Make validip() do the isv4() check, and provide
separate validipmask() function.

--- a/sys/src/cmd/ip/dhcpd/dat.h
+++ b/sys/src/cmd/ip/dhcpd/dat.h
@@ -50,6 +50,7 @@
 
 /* from dhcp.c */
 extern int	validip(uchar*);
+extern int	validipmask(uchar*);
 extern void	fatal(char*, ...);
 extern void	warning(char*, ...);
 #pragma	varargck argpos	fatal 1
--- a/sys/src/cmd/ip/dhcpd/dhcpd.c
+++ b/sys/src/cmd/ip/dhcpd/dhcpd.c
@@ -1134,9 +1134,9 @@
 		addrs[i] = &x[i*IPaddrlen];
 
 	/* always supply these */
-	if(validip(rp->ii.ipmask))
+	if(validipmask(rp->ii.ipmask))
 		maskopt(rp, OBmask, rp->ii.ipmask);
-	else if(validip(rp->gii.ipmask))
+	else if(validipmask(rp->gii.ipmask))
 		maskopt(rp, OBmask, rp->gii.ipmask);
 	else if((lifc = ipremoteonifc(rp->ifc, ip)) != nil)
 		maskopt(rp, OBmask, lifc->mask);
@@ -1391,6 +1391,16 @@
 
 extern int
 validip(uchar *ip)
+{
+	if(ipcmp(ip, IPnoaddr) == 0)
+		return 0;
+	if(ipcmp(ip, v4prefix) == 0)
+		return 0;
+	return isv4(ip);
+}
+
+extern int
+validipmask(uchar *ip)
 {
 	if(ipcmp(ip, IPnoaddr) == 0)
 		return 0;
--- a/sys/src/cmd/ip/dhcpd/ndb.c
+++ b/sys/src/cmd/ip/dhcpd/ndb.c
@@ -60,7 +60,9 @@
 setipaddr(uchar *addr, char *ip)
 {
 	if(ipcmp(addr, IPnoaddr) == 0)
-		parseip(addr, ip);
+		if(parseip(addr, ip) == -1
+		|| !validip(addr))
+			ipmove(addr, IPnoaddr);	/* invalid */
 }
 
 static void
@@ -67,7 +69,9 @@
 setipmask(uchar *mask, char *ip)
 {
 	if(ipcmp(mask, IPnoaddr) == 0)
-		parseipmask(mask, ip, 1);
+		if(parseipmask(mask, ip, 1) == -1
+		|| !validipmask(mask))
+			ipmove(mask, IPnoaddr);	/* invalid */
 }
 
 /*
@@ -228,9 +232,7 @@
 		for(nt = t; nt != nil; nt = nt->entry){
 			if(strcmp(nt->attr, "ip") != 0)
 				continue;
-			if(parseip(ciaddr, nt->val) == -1 || !isv4(ciaddr))
-				continue;
-			if(!validip(ciaddr))
+			if(parseip(ciaddr, nt->val) == -1 || !validip(ciaddr))
 				continue;
 			if(!samenet(ciaddr, riip))
 				continue;
--