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.
This commit is contained in:
parent
c068466245
commit
40efe37e07
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=202289
@ -37,6 +37,7 @@ static const char rcsid[] =
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -110,15 +111,18 @@ in_getaddr(const char *s, int which)
|
|||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
|
|
||||||
if((p = strrchr(s, '/')) != NULL) {
|
if((p = strrchr(s, '/')) != NULL) {
|
||||||
|
const char *errstr;
|
||||||
/* address is `name/masklen' */
|
/* address is `name/masklen' */
|
||||||
int masklen;
|
int masklen;
|
||||||
int ret;
|
|
||||||
struct sockaddr_in *min = sintab[MASK];
|
struct sockaddr_in *min = sintab[MASK];
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
ret = sscanf(p+1, "%u", &masklen);
|
if (!isdigit(*(p + 1)))
|
||||||
if(ret != 1 || (masklen < 0 || masklen > 32)) {
|
errstr = "invalid";
|
||||||
|
else
|
||||||
|
masklen = (int)strtonum(p + 1, 0, 32, &errstr);
|
||||||
|
if (errstr != NULL) {
|
||||||
*p = '/';
|
*p = '/';
|
||||||
errx(1, "%s: bad value", s);
|
errx(1, "%s: bad value (width %s)", s, errstr);
|
||||||
}
|
}
|
||||||
min->sin_len = sizeof(*min);
|
min->sin_len = sizeof(*min);
|
||||||
min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) &
|
min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) &
|
||||||
|
Loading…
Reference in New Issue
Block a user