svn commit: r239905 - head/sys/net

Gleb Smirnoff glebius at FreeBSD.org
Thu Aug 30 12:18:46 UTC 2012


Author: glebius
Date: Thu Aug 30 12:18:45 2012
New Revision: 239905
URL: http://svn.freebsd.org/changeset/base/239905

Log:
  In ifc_alloc_unit():
  - In the !wildcard case, return ENOSPC instead of confusing EEXIST
    in case if ifc->ifc_maxunit reached.
  - Fix unit leak, that I've introduced in previous revision.
  
  Submitted by:	Daan Vreeken <Daan vitsch.nl>

Modified:
  head/sys/net/if_clone.c

Modified: head/sys/net/if_clone.c
==============================================================================
--- head/sys/net/if_clone.c	Thu Aug 30 11:52:26 2012	(r239904)
+++ head/sys/net/if_clone.c	Thu Aug 30 12:18:45 2012	(r239905)
@@ -443,21 +443,30 @@ ifc_alloc_unit(struct if_clone *ifc, int
 
 	wildcard = (*unit < 0);
 retry:
-	if (wildcard) {
+	if (*unit > ifc->ifc_maxunit)
+		return (ENOSPC);
+	if (*unit < 0) {
 		*unit = alloc_unr(ifc->ifc_unrhdr);
 		if (*unit == -1)
 			return (ENOSPC);
 	} else {
 		*unit = alloc_unr_specific(ifc->ifc_unrhdr, *unit);
-		if (*unit == -1)
-			return (EEXIST);
+		if (*unit == -1) {
+			if (wildcard) {
+				(*unit)++;
+				goto retry;
+			} else
+				return (EEXIST);
+		}
 	}
 
 	snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, *unit);
 	if (ifunit(name) != NULL) {
-		if (wildcard)
-			goto retry;	/* XXXGL: yep, it's a unit leak */
-		else
+		free_unr(ifc->ifc_unrhdr, *unit);
+		if (wildcard) {
+			(*unit)++;
+			goto retry;
+		} else
 			return (EEXIST);
 	}
 


More information about the svn-src-all mailing list