svn commit: r202289 - head/sbin/ifconfig

Ed Maste emaste at FreeBSD.org
Thu Jan 14 15:27:19 UTC 2010


Author: emaste
Date: Thu Jan 14 15:27:18 2010
New Revision: 202289
URL: http://svn.freebsd.org/changeset/base/202289

Log:
  Reject invalid CIDR widths rather than silently stopping at the first
  non-digit character.
  
  Due to an issue with rc(8) in a test configuration, ifconfig was being
  invoked with the address used again as the width - for example,
  
    ifconfig vlan0 10.0.0.1/10.0.0.1
  
  Prior to this change, that address/width would be interpreted as
  10.0.0.1/10.

Modified:
  head/sbin/ifconfig/af_inet.c

Modified: head/sbin/ifconfig/af_inet.c
==============================================================================
--- head/sbin/ifconfig/af_inet.c	Thu Jan 14 15:20:46 2010	(r202288)
+++ head/sbin/ifconfig/af_inet.c	Thu Jan 14 15:27:18 2010	(r202289)
@@ -37,6 +37,7 @@ static const char rcsid[] =
 #include <sys/socket.h>
 #include <net/if.h>
 
+#include <ctype.h>
 #include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -110,15 +111,18 @@ in_getaddr(const char *s, int which)
 		char *p = NULL;
 
 		if((p = strrchr(s, '/')) != NULL) {
+			const char *errstr;
 			/* address is `name/masklen' */
 			int masklen;
-			int ret;
 			struct sockaddr_in *min = sintab[MASK];
 			*p = '\0';
-			ret = sscanf(p+1, "%u", &masklen);
-			if(ret != 1 || (masklen < 0 || masklen > 32)) {
+			if (!isdigit(*(p + 1)))
+				errstr = "invalid";
+			else
+				masklen = (int)strtonum(p + 1, 0, 32, &errstr);
+			if (errstr != NULL) {
 				*p = '/';
-				errx(1, "%s: bad value", s);
+				errx(1, "%s: bad value (width %s)", s, errstr);
 			}
 			min->sin_len = sizeof(*min);
 			min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) & 


More information about the svn-src-head mailing list