svn commit: r212114 - stable/8/sbin/ifconfig

Ed Maste emaste at FreeBSD.org
Wed Sep 1 20:25:37 UTC 2010


Author: emaste
Date: Wed Sep  1 20:25:36 2010
New Revision: 212114
URL: http://svn.freebsd.org/changeset/base/212114

Log:
  MFC r202289:
  
    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:
  stable/8/sbin/ifconfig/af_inet.c
Directory Properties:
  stable/8/sbin/ifconfig/   (props changed)

Modified: stable/8/sbin/ifconfig/af_inet.c
==============================================================================
--- stable/8/sbin/ifconfig/af_inet.c	Wed Sep  1 19:53:15 2010	(r212113)
+++ stable/8/sbin/ifconfig/af_inet.c	Wed Sep  1 20:25:36 2010	(r212114)
@@ -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-all mailing list