From c753215038c5a3aaab85881c9384c9d816c8c306 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Wed, 18 Jul 2018 04:38:12 +0200 Subject: [PATCH] Prepare access stanzas for more address families --- server/access.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/server/access.c b/server/access.c index b069b606..518b35fb 100644 --- a/server/access.c +++ b/server/access.c @@ -351,13 +351,15 @@ static int add_int_ent(acc_int_list_t **ilist, const char *ip) { char *ndx; - char ip_str[MAX_IPV4_STR_LEN] = {0}; - char ip_mask_str[MAX_IPV4_STR_LEN] = {0}; + char ip_str[MAX_IPV46_STR_LEN] = {0}; + char ip_mask_str[MAX_IPV46_STR_LEN] = {0}; uint32_t mask; int is_err, mask_len = 0, need_shift = 1; struct in_addr in; struct in_addr mask_in; + struct addrinfo *ai, hints; + struct sockaddr_in *sin; 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-ip)) >= MAX_IPV4_STR_LEN) + if(((ndx-ip)) >= MAX_IPV46_STR_LEN) { log_msg(LOG_ERR, "[*] Error parsing string to IP"); free(new_sle); @@ -426,7 +428,7 @@ add_int_ent(acc_int_list_t **ilist, const char *ip) { /* 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) { 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 { 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"); 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)); } - 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, "[*] Fatal error parsing IP to int for: %s", ip_str ); - free(new_sle); new_sle = NULL; - 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. */ - new_sle->family = AF_INET; if(mask == 32) new_sle->acc_int.inet.mask = 0xFFFFFFFF; else if(need_shift && (mask > 0 && mask < 32))