From d08424384b643e6de7ef82e8d7550259e48dcc4a Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Thu, 5 Oct 2023 18:03:32 +0300 Subject: [PATCH] [Core] Coverity: 1024552 Logically dead code --- src/switch_utils.c | 23 ++++++++------- tests/unit/switch_core.c | 60 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/switch_utils.c b/src/switch_utils.c index df7a507920..faffc1cc04 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -747,7 +747,7 @@ SWITCH_DECLARE(int) switch_parse_cidr(const char *string, ip_t *ip, ip_t *mask, ip_t *maskv = mask; ip_t *ipv = ip; - switch_copy_string(host, string, sizeof(host)-1); + switch_copy_string(host, string, sizeof(host) - 1); bit_str = strchr(host, '/'); if (!bit_str) { @@ -758,22 +758,20 @@ SWITCH_DECLARE(int) switch_parse_cidr(const char *string, ip_t *ip, ip_t *mask, bits = atoi(bit_str); ipv6 = strchr(string, ':'); if (ipv6) { - int i,n; + int32_t i, n; + uint32_t k; + if (bits < 0 || bits > 128) { return -2; } + bits = atoi(bit_str); switch_inet_pton(AF_INET6, host, (unsigned char *)ip); - for (n=bits,i=0 ;i < 16; i++){ - if (n >= 8) { - maskv->v6.s6_addr[i] = 0xFF; - n -= 8; - } else if (n < 8) { - maskv->v6.s6_addr[i] = 0xFF & ~(0xFF >> n); - n -= n; - } else if (n == 0) { - maskv->v6.s6_addr[i] = 0x00; - } + + for (n = bits, i = 0; i < 16; i++) { + k = (n > 8) ? 8 : n; + maskv->v6.s6_addr[i] = 0xFF & ~(0xFF >> k); /* k = 0 gives 0x00, k = 8 gives 0xFF */ + n -= k; } } else { if (bits < 0 || bits > 32) { @@ -786,6 +784,7 @@ SWITCH_DECLARE(int) switch_parse_cidr(const char *string, ip_t *ip, ip_t *mask, maskv->v4 = 0xFFFFFFFF & ~(0xFFFFFFFF >> bits); } + *bitp = bits; return 0; diff --git a/tests/unit/switch_core.c b/tests/unit/switch_core.c index da93fbdef4..1159017571 100644 --- a/tests/unit/switch_core.c +++ b/tests/unit/switch_core.c @@ -53,6 +53,66 @@ FST_CORE_BEGIN("./conf") } FST_TEARDOWN_END() + FST_TEST_BEGIN(test_switch_parse_cidr_v6) + { + ip_t ip, mask; + uint32_t bits; + + fst_check(!switch_parse_cidr("fe80::/10", &ip, &mask, &bits)); + fst_check_int_equals(bits, 10); + fst_check_int_equals(ip.v6.s6_addr[0], 0xfe); + fst_check_int_equals(ip.v6.s6_addr[1], 0x80); + fst_check_int_equals(ip.v6.s6_addr[2], 0); + fst_check_int_equals(mask.v6.s6_addr[0], 0xff); + fst_check_int_equals(mask.v6.s6_addr[1], 0xc0); + fst_check_int_equals(mask.v6.s6_addr[2], 0); + + fst_check(!switch_parse_cidr("::/0", &ip, &mask, &bits)); + fst_check_int_equals(bits, 0); + fst_check_int_equals(ip.v6.s6_addr[0], 0); + fst_check_int_equals(ip.v6.s6_addr[1], 0); + fst_check_int_equals(ip.v6.s6_addr[2], 0); + fst_check_int_equals(mask.v6.s6_addr[0], 0); + fst_check_int_equals(mask.v6.s6_addr[1], 0); + fst_check_int_equals(mask.v6.s6_addr[2], 0); + + fst_check(!switch_parse_cidr("::1/128", &ip, &mask, &bits)); + fst_check_int_equals(bits, 128); + fst_check_int_equals(ip.v6.s6_addr[0], 0); + fst_check_int_equals(ip.v6.s6_addr[1], 0); + fst_check_int_equals(ip.v6.s6_addr[2], 0); + fst_check_int_equals(ip.v6.s6_addr[3], 0); + fst_check_int_equals(ip.v6.s6_addr[4], 0); + fst_check_int_equals(ip.v6.s6_addr[5], 0); + fst_check_int_equals(ip.v6.s6_addr[6], 0); + fst_check_int_equals(ip.v6.s6_addr[7], 0); + fst_check_int_equals(ip.v6.s6_addr[8], 0); + fst_check_int_equals(ip.v6.s6_addr[9], 0); + fst_check_int_equals(ip.v6.s6_addr[10], 0); + fst_check_int_equals(ip.v6.s6_addr[11], 0); + fst_check_int_equals(ip.v6.s6_addr[12], 0); + fst_check_int_equals(ip.v6.s6_addr[13], 0); + fst_check_int_equals(ip.v6.s6_addr[14], 0); + fst_check_int_equals(ip.v6.s6_addr[15], 1); + fst_check_int_equals(mask.v6.s6_addr[0], 0xff); + fst_check_int_equals(mask.v6.s6_addr[1], 0xff); + fst_check_int_equals(mask.v6.s6_addr[2], 0xff); + fst_check_int_equals(mask.v6.s6_addr[3], 0xff); + fst_check_int_equals(mask.v6.s6_addr[4], 0xff); + fst_check_int_equals(mask.v6.s6_addr[5], 0xff); + fst_check_int_equals(mask.v6.s6_addr[6], 0xff); + fst_check_int_equals(mask.v6.s6_addr[7], 0xff); + fst_check_int_equals(mask.v6.s6_addr[8], 0xff); + fst_check_int_equals(mask.v6.s6_addr[9], 0xff); + fst_check_int_equals(mask.v6.s6_addr[10], 0xff); + fst_check_int_equals(mask.v6.s6_addr[11], 0xff); + fst_check_int_equals(mask.v6.s6_addr[12], 0xff); + fst_check_int_equals(mask.v6.s6_addr[13], 0xff); + fst_check_int_equals(mask.v6.s6_addr[14], 0xff); + fst_check_int_equals(mask.v6.s6_addr[15], 0xff); + } + FST_TEST_END() + #if ENABLE_SNPRINTFV_TESTS FST_TEST_BEGIN(test_snprintfv_1) {