mirror of
git://git.9front.org/plan9front/plan9front
synced 2025-01-12 11:10:06 +00:00
ip/dhcpd: impvoe validip(), make validipmask() reject ipv6 masks
Because isv4() is never true for IPnoaddr, we can skip the check. Make validipmask() ensure that the top IPv4off bytes are all 0xff, then check that the low 4 bytes are a valid mask (must be a power of two minus one).
This commit is contained in:
parent
248634879a
commit
1a91932731
5 changed files with 31 additions and 31 deletions
|
@ -49,8 +49,6 @@ struct Info
|
||||||
|
|
||||||
|
|
||||||
/* from dhcp.c */
|
/* from dhcp.c */
|
||||||
extern int validip(uchar*);
|
|
||||||
extern int validipmask(uchar*);
|
|
||||||
extern void fatal(char*, ...);
|
extern void fatal(char*, ...);
|
||||||
extern void warning(char*, ...);
|
extern void warning(char*, ...);
|
||||||
#pragma varargck argpos fatal 1
|
#pragma varargck argpos fatal 1
|
||||||
|
@ -58,6 +56,8 @@ extern void warning(char*, ...);
|
||||||
extern int minlease;
|
extern int minlease;
|
||||||
|
|
||||||
/* from db.c */
|
/* from db.c */
|
||||||
|
extern int validip(uchar*);
|
||||||
|
extern int validipmask(uchar*);
|
||||||
extern char* toid(uchar*, int);
|
extern char* toid(uchar*, int);
|
||||||
extern void initbinding(uchar*, int);
|
extern void initbinding(uchar*, int);
|
||||||
extern Binding* iptobinding(uchar*, int);
|
extern Binding* iptobinding(uchar*, int);
|
||||||
|
|
|
@ -412,3 +412,22 @@ releasebinding(Binding *b, char *id)
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
validip(uchar *ip)
|
||||||
|
{
|
||||||
|
if(ipcmp(ip, v4prefix) == 0)
|
||||||
|
return 0;
|
||||||
|
return isv4(ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
validipmask(uchar *mask)
|
||||||
|
{
|
||||||
|
unsigned x;
|
||||||
|
|
||||||
|
if(memcmp(mask, IPallbits, IPv4off) != 0)
|
||||||
|
return 0;
|
||||||
|
x = ~(mask[IPv4off+0] << 24 | mask[IPv4off+1] << 16 | mask[IPv4off+2] << 8 | mask[IPv4off+3]);
|
||||||
|
return ((x + 1U) & x) == 0;
|
||||||
|
}
|
||||||
|
|
|
@ -191,7 +191,6 @@ void sendnak(Req*, uchar*, char*);
|
||||||
void sendoffer(Req*, uchar*, int);
|
void sendoffer(Req*, uchar*, int);
|
||||||
void stringopt(Req*, int, char*);
|
void stringopt(Req*, int, char*);
|
||||||
void termopt(Req*);
|
void termopt(Req*);
|
||||||
int validip(uchar*);
|
|
||||||
void vectoropt(Req*, int, uchar*, int);
|
void vectoropt(Req*, int, uchar*, int);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1389,26 +1388,6 @@ readsysname(void)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int
|
|
||||||
validip(uchar *ip)
|
|
||||||
{
|
|
||||||
if(ipcmp(ip, IPnoaddr) == 0)
|
|
||||||
return 0;
|
|
||||||
if(ipcmp(ip, v4prefix) == 0)
|
|
||||||
return 0;
|
|
||||||
return isv4(ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int
|
|
||||||
validipmask(uchar *ip)
|
|
||||||
{
|
|
||||||
if(ipcmp(ip, IPnoaddr) == 0)
|
|
||||||
return 0;
|
|
||||||
if(ipcmp(ip, v4prefix) == 0)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
longopt(Req *rp, int t, long v)
|
longopt(Req *rp, int t, long v)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,7 +35,9 @@ main(void)
|
||||||
b.lease = b.offer = 0;
|
b.lease = b.offer = 0;
|
||||||
now = time(0);
|
now = time(0);
|
||||||
for(i = 0; i < nall; i++){
|
for(i = 0; i < nall; i++){
|
||||||
if(parseip(b.ip, all[i].name) == -1 || syncbinding(&b, 0) < 0)
|
if(parseip(b.ip, all[i].name) == -1
|
||||||
|
|| !validip(b.ip)
|
||||||
|
|| syncbinding(&b, 0) < 0)
|
||||||
continue;
|
continue;
|
||||||
if(b.lease > now)
|
if(b.lease > now)
|
||||||
print("%I leased by %s until %s", b.ip, b.boundto,
|
print("%I leased by %s until %s", b.ip, b.boundto,
|
||||||
|
|
|
@ -57,19 +57,19 @@ localip(uchar *laddr, uchar *raddr, Ipifc *ifc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setipaddr(uchar *addr, char *ip)
|
setipaddr(uchar *ip, char *s)
|
||||||
{
|
{
|
||||||
if(ipcmp(addr, IPnoaddr) == 0)
|
if(ipcmp(ip, IPnoaddr) == 0)
|
||||||
if(parseip(addr, ip) == -1
|
if(parseip(ip, s) == -1
|
||||||
|| !validip(addr))
|
|| !validip(ip))
|
||||||
ipmove(addr, IPnoaddr); /* invalid */
|
ipmove(ip, IPnoaddr); /* invalid */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setipmask(uchar *mask, char *ip)
|
setipmask(uchar *mask, char *s)
|
||||||
{
|
{
|
||||||
if(ipcmp(mask, IPnoaddr) == 0)
|
if(ipcmp(mask, IPnoaddr) == 0)
|
||||||
if(parseipmask(mask, ip, 1) == -1
|
if(parseipmask(mask, s, 1) == -1
|
||||||
|| !validipmask(mask))
|
|| !validipmask(mask))
|
||||||
ipmove(mask, IPnoaddr); /* invalid */
|
ipmove(mask, IPnoaddr); /* invalid */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue