]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Coverity: 1024552 Logically dead code
authorAndrey Volk <andywolk@gmail.com>
Thu, 5 Oct 2023 15:03:32 +0000 (18:03 +0300)
committerGitHub <noreply@github.com>
Thu, 5 Oct 2023 15:03:32 +0000 (18:03 +0300)
src/switch_utils.c
tests/unit/switch_core.c

index df7a507920a3f2ce7becd595b4f8ba84f99732dd..faffc1cc0482aa4fa09b5d932e861ac64c11caf9 100644 (file)
@@ -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;
index da93fbdef412074fe121028f1ba40bb464b91c2f..1159017571e6a281c6e82bda2754464078bb87eb 100644 (file)
@@ -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)
                {