summaryrefslogtreecommitdiff
path: root/src/sp_network_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp_network_utils.c')
-rw-r--r--src/sp_network_utils.c10
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}