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
--=-=-=

The attached patch makes sure that the address family on an
in_ifaddr's netmask sockaddr is set to AF_INET.  Apparently none of
our kernel or userland code cares about this, but certain binaries
from That Other OS, and possibly also applicatins ported from other
OSes, expect the sockaddr returned by SIOCGIFNETMASK to have a valid
address family.

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


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=sockmask.diff

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);
 }
 

--=-=-=--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




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