diff options
Diffstat (limited to 'src/sp_network_utils.c')
| -rw-r--r-- | src/sp_network_utils.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/sp_network_utils.c b/src/sp_network_utils.c index 31e8426..5b4fd95 100644 --- a/src/sp_network_utils.c +++ b/src/sp_network_utils.c | |||
| @@ -91,10 +91,13 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) { | |||
| 91 | return -1; | 91 | return -1; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | if (sscanf(mask + 1, "%hhu", &(cidr->mask)) != 1) { | 94 | int masklen = strlen(mask+1); |
| 95 | int imask = atoi(mask+1); | ||
| 96 | if (masklen < 1 || masklen > 3 || !isdigit(*(mask+1)) || (masklen >= 2 && !isdigit(*(mask+2))) || (masklen == 3 && !isdigit(*(mask+3))) || imask < 0 || imask > 128) { | ||
| 95 | sp_log_err("config", "'%s' isn't a valid network mask.", mask + 1); | 97 | sp_log_err("config", "'%s' isn't a valid network mask.", mask + 1); |
| 96 | return -1; | 98 | return -1; |
| 97 | } | 99 | } |
| 100 | cidr->mask = (uint8_t)imask; | ||
| 98 | 101 | ||
| 99 | ip[mask - ip] = '\0'; // NULL the '/' char | 102 | ip[mask - ip] = '\0'; // NULL the '/' char |
| 100 | 103 | ||
| @@ -113,5 +116,10 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) { | |||
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | ip[mask - ip] = '/'; | 118 | ip[mask - ip] = '/'; |
| 119 | if (cidr->ip_version < 0) { | ||
| 120 | sp_log_err("cidr_match", "Weird ip (%s) family", ip); | ||
| 121 | return -1; | ||
| 122 | } | ||
| 123 | |||
| 116 | return 0; | 124 | return 0; |
| 117 | } | 125 | } |
