}
//LCOV_EXCL_STOP
-static int __profile_convert_netmask_to_prefix_len(const char *netmask)
+static unsigned char __profile_convert_netmask_to_prefix_len(const char *netmask)
{
if (netmask == NULL)
return 0;
in_addr_t mask = inet_network(netmask);
- int prefix_len = 0;
+ in_addr_t host = ~mask;
+ unsigned char prefix_len = 0;
+
+ /* a valid netmask must be 2^n - 1 */
+ if ((host & (host + 1)) != 0)
+ return -1;
for (; mask; mask <<= 1)
++prefix_len;
return CONNECTION_ERROR_INVALID_PARAMETER;
net_info->PrefixLen = __profile_convert_netmask_to_prefix_len(subnet_mask);
+ if (net_info->PrefixLen <= 0 || net_info->PrefixLen > 31) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid Prefix length: %d", net_info->PrefixLen);
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
return CONNECTION_ERROR_NONE;
}