summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2010-09-01 20:25:36 +0000
committerEd Maste <emaste@FreeBSD.org>2010-09-01 20:25:36 +0000
commitb9aa1c612d4f11d4df58870a34431c3cfe22fa40 (patch)
treec08fcb2129bd0202c1a597a3f949f925edaa7f93 /sbin
parent2c7f73c8f64d861c22cdc84b8682f9c3a537fa7a (diff)
Notes
Diffstat (limited to 'sbin')
-rw-r--r--sbin/ifconfig/af_inet.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c
index 2c75b01cded8..2e27114af13a 100644
--- a/sbin/ifconfig/af_inet.c
+++ b/sbin/ifconfig/af_inet.c
@@ -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) &