svn commit: r228313 - head/sys/netinet

Gleb Smirnoff glebius at FreeBSD.org
Tue Dec 6 20:55:20 UTC 2011


Author: glebius
Date: Tue Dec  6 20:55:20 2011
New Revision: 228313
URL: http://svn.freebsd.org/changeset/base/228313

Log:
  Fix a very special case when SIOCAIFADDR supplies mask of 0.0.0.0,
  don't overwrite the mask with autoguessing based on classes.

Modified:
  head/sys/netinet/in.c

Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c	Tue Dec  6 19:04:45 2011	(r228312)
+++ head/sys/netinet/in.c	Tue Dec  6 20:55:20 2011	(r228313)
@@ -73,7 +73,7 @@ static int	in_addprefix(struct in_ifaddr
 static int	in_scrubprefix(struct in_ifaddr *, u_int);
 static void	in_socktrim(struct sockaddr_in *);
 static int	in_ifinit(struct ifnet *,
-	    struct in_ifaddr *, struct sockaddr_in *, int);
+	    struct in_ifaddr *, struct sockaddr_in *, int, int);
 static void	in_purgemaddrs(struct ifnet *);
 
 static VNET_DEFINE(int, sameprefixcarponly);
@@ -517,7 +517,7 @@ in_control(struct socket *so, u_long cmd
 
 	case SIOCSIFADDR:
 		error = in_ifinit(ifp, ia,
-		    (struct sockaddr_in *) &ifr->ifr_addr, 1);
+		    (struct sockaddr_in *) &ifr->ifr_addr, 1, 0);
 		if (error != 0 && iaIsNew)
 			break;
 		if (error == 0) {
@@ -569,7 +569,8 @@ in_control(struct socket *so, u_long cmd
 			maskIsNew  = 1; /* We lie; but the effect's the same */
 		}
 		if (hostIsNew || maskIsNew)
-			error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);
+			error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0,
+			    maskIsNew);
 		if (error != 0 && iaIsNew)
 			break;
 
@@ -842,7 +843,7 @@ in_ifscrub(struct ifnet *ifp, struct in_
  */
 static int
 in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin,
-    int scrub)
+    int scrub, int masksupplied)
 {
 	register u_long i = ntohl(sin->sin_addr.s_addr);
 	int flags = RTF_UP, error = 0;
@@ -872,7 +873,7 @@ in_ifinit(struct ifnet *ifp, struct in_i
 	 * Be compatible with network classes, if netmask isn't supplied,
 	 * guess it based on classes.
 	 */
-	if (ia->ia_subnetmask == 0) {
+	if (!masksupplied) {
 		if (IN_CLASSA(i))
 			ia->ia_subnetmask = IN_CLASSA_NET;
 		else if (IN_CLASSB(i))


More information about the svn-src-head mailing list