upnppermissions.c: allow 192.168.1.1/255.255.255.0 as ip/mask

Change read_permission_line() to allow 192.168.1.1/255.255.255.0 in
addition to 192.168.1.1/24 in permission line (in configuration file).
This commit is contained in:
Thomas Bernard 2012-02-15 23:49:56 +01:00
parent f01dc59aa3
commit b1cc7aad36
2 changed files with 32 additions and 8 deletions

View File

@ -3,6 +3,8 @@ $Id: Changelog.txt,v 1.260 2012/02/15 22:44:26 nanard Exp $
2012/02/15: 2012/02/15:
Change parselanaddr() function to allow 192.168.1.1/255.255.255.0 in Change parselanaddr() function to allow 192.168.1.1/255.255.255.0 in
configuration file. configuration file.
Change read_permission_line() to allow 192.168.1.1/255.255.255.0 in
permission line (in configuration file).
2012/02/12: 2012/02/12:
More syntax checks in upnppermissions.c More syntax checks in upnppermissions.c

View File

@ -1,4 +1,4 @@
/* $Id: upnppermissions.c,v 1.16 2012/02/12 13:02:54 nanard Exp $ */ /* $Id: upnppermissions.c,v 1.17 2012/02/15 22:43:34 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2006-2012 Thomas Bernard * (c) 2006-2012 Thomas Bernard
@ -16,6 +16,11 @@
#include "config.h" #include "config.h"
#include "upnppermissions.h" #include "upnppermissions.h"
/* read_permission_line()
* parse the a permission line which format is :
* (deny|allow) [0-9]+(-[0-9]+) ip/mask [0-9]+(-[0-9]+)
* ip/mask is either 192.168.1.1/24 or 192.168.1.1/255.255.255.0
*/
int int
read_permission_line(struct upnpperm * perm, read_permission_line(struct upnpperm * perm,
char * p) char * p)
@ -64,6 +69,8 @@ read_permission_line(struct upnpperm * perm,
if(i > 65535) if(i > 65535)
return -1; return -1;
perm->eport_max = (u_short)i; perm->eport_max = (u_short)i;
if(perm->eport_min > perm->eport_max)
return -1;
} }
else if(isspace(*q)) else if(isspace(*q))
{ {
@ -94,20 +101,33 @@ read_permission_line(struct upnpperm * perm,
p = q; p = q;
while(isdigit(*q)) while(isdigit(*q))
q++; q++;
if(!isspace(*q)) if(*q == '.')
{
while(*q == '.' || isdigit(*q))
q++;
if(!isspace(*q))
return -1;
*q = '\0';
if(!inet_aton(p, &perm->mask))
return -1;
}
else if(!isspace(*q))
return -1; return -1;
*q = '\0'; else
n_bits = atoi(p); {
if(n_bits > 32) *q = '\0';
return -1; n_bits = atoi(p);
perm->mask.s_addr = htonl(n_bits ? (0xffffffff << (32 - n_bits)) : 0); if(n_bits > 32)
return -1;
perm->mask.s_addr = htonl(n_bits ? (0xffffffffu << (32 - n_bits)) : 0);
}
} }
else if(isspace(*q)) else if(isspace(*q))
{ {
*q = '\0'; *q = '\0';
if(!inet_aton(p, &perm->address)) if(!inet_aton(p, &perm->address))
return -1; return -1;
perm->mask.s_addr = 0xffffffff; perm->mask.s_addr = 0xffffffffu;
} }
else else
{ {
@ -137,6 +157,8 @@ read_permission_line(struct upnpperm * perm,
if(i > 65535) if(i > 65535)
return -1; return -1;
perm->iport_max = (u_short)i; perm->iport_max = (u_short)i;
if(perm->iport_min > perm->iport_max)
return -1;
} }
else if(isspace(*q) || *q == '\0') else if(isspace(*q) || *q == '\0')
{ {