Prepare access stanzas for more address families

This commit is contained in:
Pierre Pronchery 2018-07-18 04:38:12 +02:00
parent a2902cbc62
commit c753215038

View File

@ -351,13 +351,15 @@ static int
add_int_ent(acc_int_list_t **ilist, const char *ip) add_int_ent(acc_int_list_t **ilist, const char *ip)
{ {
char *ndx; char *ndx;
char ip_str[MAX_IPV4_STR_LEN] = {0}; char ip_str[MAX_IPV46_STR_LEN] = {0};
char ip_mask_str[MAX_IPV4_STR_LEN] = {0}; char ip_mask_str[MAX_IPV46_STR_LEN] = {0};
uint32_t mask; uint32_t mask;
int is_err, mask_len = 0, need_shift = 1; int is_err, mask_len = 0, need_shift = 1;
struct in_addr in; struct in_addr in;
struct in_addr mask_in; struct in_addr mask_in;
struct addrinfo *ai, hints;
struct sockaddr_in *sin;
acc_int_list_t *last_sle, *new_sle, *tmp_sle; acc_int_list_t *last_sle, *new_sle, *tmp_sle;
@ -383,7 +385,7 @@ add_int_ent(acc_int_list_t **ilist, const char *ip)
*/ */
if((ndx = strchr(ip, '/')) != NULL) if((ndx = strchr(ip, '/')) != NULL)
{ {
if(((ndx-ip)) >= MAX_IPV4_STR_LEN) if(((ndx-ip)) >= MAX_IPV46_STR_LEN)
{ {
log_msg(LOG_ERR, "[*] Error parsing string to IP"); log_msg(LOG_ERR, "[*] Error parsing string to IP");
free(new_sle); free(new_sle);
@ -426,7 +428,7 @@ add_int_ent(acc_int_list_t **ilist, const char *ip)
{ {
/* CIDR mask /* CIDR mask
*/ */
mask = strtol_wrapper(ndx+1, 1, 32, NO_EXIT_UPON_ERR, &is_err); mask = strtol_wrapper(ndx+1, 1, 128, NO_EXIT_UPON_ERR, &is_err);
if(is_err != FKO_SUCCESS) if(is_err != FKO_SUCCESS)
{ {
log_msg(LOG_ERR, "[*] Invalid IP mask str '%s'.", ndx+1); log_msg(LOG_ERR, "[*] Invalid IP mask str '%s'.", ndx+1);
@ -449,7 +451,7 @@ add_int_ent(acc_int_list_t **ilist, const char *ip)
else else
{ {
mask = 32; mask = 32;
if(strnlen(ip, MAX_IPV4_STR_LEN+1) >= MAX_IPV4_STR_LEN) if(strnlen(ip, MAX_IPV46_STR_LEN+1) >= MAX_IPV46_STR_LEN)
{ {
log_msg(LOG_ERR, "[*] Error parsing string to IP"); log_msg(LOG_ERR, "[*] Error parsing string to IP");
free(new_sle); free(new_sle);
@ -459,21 +461,38 @@ add_int_ent(acc_int_list_t **ilist, const char *ip)
strlcpy(ip_str, ip, sizeof(ip_str)); strlcpy(ip_str, ip, sizeof(ip_str));
} }
if(inet_aton(ip_str, &in) == 0) memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_NUMERICHOST | AI_CANONNAME;
if(getaddrinfo(ip_str, NULL, &hints, &ai) != 0)
{ {
log_msg(LOG_ERR, log_msg(LOG_ERR,
"[*] Fatal error parsing IP to int for: %s", ip_str "[*] Fatal error parsing IP to int for: %s", ip_str
); );
free(new_sle); free(new_sle);
new_sle = NULL; new_sle = NULL;
return 0; return 0;
} }
switch(ai->ai_family)
{
case AF_INET:
sin = (struct sockaddr_in *)ai->ai_addr;
in = sin->sin_addr;
break;
default:
log_msg(LOG_ERR,
"[*] Unsupported family parsing IP to int for: %s", ip_str
);
free(new_sle);
new_sle = NULL;
freeaddrinfo(ai);
return 0;
}
new_sle->family = ai->ai_family;
freeaddrinfo(ai);
/* Store our mask converted from CIDR to a 32-bit value. /* Store our mask converted from CIDR to a 32-bit value.
*/ */
new_sle->family = AF_INET;
if(mask == 32) if(mask == 32)
new_sle->acc_int.inet.mask = 0xFFFFFFFF; new_sle->acc_int.inet.mask = 0xFFFFFFFF;
else if(need_shift && (mask > 0 && mask < 32)) else if(need_shift && (mask > 0 && mask < 32))