svn commit: r368492 - head/sbin/ifconfig

Hans Petter Selasky hselasky at FreeBSD.org
Wed Dec 9 20:13:13 UTC 2020


Author: hselasky
Date: Wed Dec  9 20:13:12 2020
New Revision: 368492
URL: https://svnweb.freebsd.org/changeset/base/368492

Log:
  Fix bug in ifconfig preventing proper VLAN creation.
  
  Detection of interface type by filter must happen before detection of
  interface type by prefix. Else the following sequence of commands will
  try to create a LAGG interface instead of a VLAN interface, which
  accidentially worked previously, because the date pointed to by the
  ifr_data pointer was not parsed by VLAN create ioctl(2). This is a
  regression after r368229, because the VLAN creation now parses the
  ifr_data field.
  
  How to reproduce:
  # ifconfig lagg0 create
  # ifconfig lagg0.256 create
  
  Differential Revision:	https://reviews.freebsd.org/D27521
  Reviewed by:		kib@ and kevans@
  Reported by:		raul.munoz at custos.es
  Sponsored by:		Mellanox Technologies // NVIDIA Networking

Modified:
  head/sbin/ifconfig/ifclone.c

Modified: head/sbin/ifconfig/ifclone.c
==============================================================================
--- head/sbin/ifconfig/ifclone.c	Wed Dec  9 20:06:37 2020	(r368491)
+++ head/sbin/ifconfig/ifclone.c	Wed Dec  9 20:13:12 2020	(r368492)
@@ -128,32 +128,32 @@ ifclonecreate(int s, void *arg)
 {
 	struct ifreq ifr;
 	struct clone_defcb *dcp;
-	clone_callback_func *clone_cb = NULL;
 
 	memset(&ifr, 0, sizeof(ifr));
 	(void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
 
-	if (clone_cb == NULL) {
-		/* Try to find a default callback */
+	/* Try to find a default callback by filter */
+	SLIST_FOREACH(dcp, &clone_defcbh, next) {
+		if (dcp->clone_mt == MT_FILTER &&
+		    dcp->ifmatch(ifr.ifr_name) != 0)
+			break;
+	}
+
+	if (dcp == NULL) {
+		/* Try to find a default callback by prefix */
 		SLIST_FOREACH(dcp, &clone_defcbh, next) {
-			if ((dcp->clone_mt == MT_PREFIX) &&
-			    (strncmp(dcp->ifprefix, ifr.ifr_name,
-			             strlen(dcp->ifprefix)) == 0)) {
-				clone_cb = dcp->clone_cb;
+			if (dcp->clone_mt == MT_PREFIX &&
+			    strncmp(dcp->ifprefix, ifr.ifr_name,
+			    strlen(dcp->ifprefix)) == 0)
 				break;
-			}
-			if ((dcp->clone_mt == MT_FILTER) &&
-			          dcp->ifmatch(ifr.ifr_name)) {
-				clone_cb = dcp->clone_cb;
-				break;
-			}
 		}
 	}
-	if (clone_cb == NULL) {
+
+	if (dcp == NULL || dcp->clone_cb == NULL) {
 		/* NB: no parameters */
 	  	ioctl_ifcreate(s, &ifr);
 	} else {
-		clone_cb(s, &ifr);
+		dcp->clone_cb(s, &ifr);
 	}
 
 	/*


More information about the svn-src-all mailing list