Skip site navigation (1)Skip section navigation (2)
Date:      20 Oct 2001 01:24:39 +0200
From:      Dag-Erling Smorgrav <des@ofug.org>
To:        net@freebsd.org
Subject:   Small tweak to in_control()
Message-ID:  <xzplmi71adk.fsf@flood.ping.uio.no>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
As far as I can determine, these changes are sufficient to ensure that
ia_sockmask.sa_family is always AF_INET, but I'm not 100% certain, so
I've added a KASSERT that checks this before returning from
in_control().

I also don't know if similar changes are required in the IPv6 code.

Comments?  Objections?

DES
-- 
Dag-Erling Smorgrav - des@ofug.org


[-- Attachment #2 --]
Index: sys/netinet/in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.59
diff -u -r1.59 in.c
--- sys/netinet/in.c	1 Oct 2001 18:07:08 -0000	1.59
+++ sys/netinet/in.c	19 Oct 2001 23:15:31 -0000
@@ -198,7 +198,6 @@
 	struct in_aliasreq *ifra = (struct in_aliasreq *)data;
 	struct sockaddr_in oldaddr;
 	int error, hostIsNew, maskIsNew, s;
-	u_long i;
 
 	switch (cmd) {
 	case SIOCALIFADDR:
@@ -286,6 +285,7 @@
 			ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
 			ifa->ifa_netmask = (struct sockaddr *)&ia->ia_sockmask;
 			ia->ia_sockmask.sin_len = 8;
+			ia->ia_sockmask.sin_family = AF_INET;
 			if (ifp->if_flags & IFF_BROADCAST) {
 				ia->ia_broadaddr.sin_len = sizeof(ia->ia_addr);
 				ia->ia_broadaddr.sin_family = AF_INET;
@@ -362,8 +362,8 @@
 		    (struct sockaddr_in *) &ifr->ifr_addr, 1));
 
 	case SIOCSIFNETMASK:
-		i = ifra->ifra_addr.sin_addr.s_addr;
-		ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i);
+		ia->ia_sockmask.sin_addr = ifra->ifra_addr.sin_addr;
+		ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr);
 		break;
 
 	case SIOCAIFADDR:
@@ -381,6 +381,7 @@
 		if (ifra->ifra_mask.sin_len) {
 			in_ifscrub(ifp, ia);
 			ia->ia_sockmask = ifra->ifra_mask;
+			ia->ia_sockmask.sin_family = AF_INET;
 			ia->ia_subnetmask =
 			     ntohl(ia->ia_sockmask.sin_addr.s_addr);
 			maskIsNew = 1;
@@ -439,6 +440,10 @@
 			return (EOPNOTSUPP);
 		return ((*ifp->if_ioctl)(ifp, cmd, data));
 	}
+
+	KASSERT(ia == NULL || ia->ia_sockmask.sin_family == AF_INET,
+	    (__FUNCTION__ "(): ia_sockmask is not AF_INET"));
+
 	return (0);
 }
 

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzplmi71adk.fsf>