Refactored netmask array fill with range check
When building a numeric ACL with netmask, range check the supplied value. In addition, the code to walk the array has been extracted and "simplified". Signed-off-by: Robert James Kaes <rjk@wormbytes.ca>
This commit is contained in:
parent
95c1f39f60
commit
51fb15be2c
47
src/acl.c
47
src/acl.c
@ -57,6 +57,41 @@ struct acl_s {
|
|||||||
*/
|
*/
|
||||||
static vector_t access_list = NULL;
|
static vector_t access_list = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fills in the netmask array given a numeric value.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success
|
||||||
|
* -1 on failure (invalid mask value)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
inline static int
|
||||||
|
fill_netmask_array(long int mask, unsigned char array[], unsigned int len)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (mask < 0 || mask > (8 * len))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i != len; ++i) {
|
||||||
|
if (mask >= 8) {
|
||||||
|
array[i] = 0xff;
|
||||||
|
mask -= 8;
|
||||||
|
}
|
||||||
|
else if (mask > 0) {
|
||||||
|
array[i] = (unsigned char)(0xff << (8 - mask));
|
||||||
|
mask = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
array[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inserts a new access control into the list. The function will figure out
|
* Inserts a new access control into the list. The function will figure out
|
||||||
* whether the location is an IP address (with optional netmask) or a
|
* whether the location is an IP address (with optional netmask) or a
|
||||||
@ -70,7 +105,8 @@ int
|
|||||||
insert_acl(char *location, acl_access_t access_type)
|
insert_acl(char *location, acl_access_t access_type)
|
||||||
{
|
{
|
||||||
struct acl_s acl;
|
struct acl_s acl;
|
||||||
int i, ret, mask;
|
int ret;
|
||||||
|
long int mask;
|
||||||
char *p, ip_dst[IPV6_LEN];
|
char *p, ip_dst[IPV6_LEN];
|
||||||
|
|
||||||
assert(location != NULL);
|
assert(location != NULL);
|
||||||
@ -119,13 +155,8 @@ insert_acl(char *location, acl_access_t access_type)
|
|||||||
memcpy(acl.address.ip.octet, ip_dst, IPV6_LEN);
|
memcpy(acl.address.ip.octet, ip_dst, IPV6_LEN);
|
||||||
|
|
||||||
mask = strtol(p + 1, NULL, 10);
|
mask = strtol(p + 1, NULL, 10);
|
||||||
for (i = 0; i != IPV6_LEN; ++i) {
|
if (fill_netmask_array(mask, &(acl.address.ip.mask[0]), IPV6_LEN) < 0)
|
||||||
if (mask >= ((i + 1) * 8))
|
return -1;
|
||||||
acl.address.ip.mask[i] = 0xff;
|
|
||||||
else
|
|
||||||
acl.address.ip.mask[i] =
|
|
||||||
0xff << (8 - (mask - i * 8));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* In all likelihood a string */
|
/* In all likelihood a string */
|
||||||
acl.type = ACL_STRING;
|
acl.type = ACL_STRING;
|
||||||
|
Loading…
Reference in New Issue
Block a user