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-all
mailing list