fix uninitialized/stale use of alloc (%m modifier) flag in scanf
[musl] / src / network / if_nameindex.c
index 580acce..ad0a766 100644 (file)
@@ -10,7 +10,7 @@
 
 static void *do_nameindex(int s, size_t n)
 {
-       size_t i, len;
+       size_t i, len, k;
        struct ifconf conf;
        struct if_nameindex *idx;
 
@@ -29,17 +29,16 @@ static void *do_nameindex(int s, size_t n)
        }
 
        n = conf.ifc_len / sizeof(struct ifreq);
-       for (i=0; i<n; i++) {
+       for (i=k=0; i<n; i++) {
                if (ioctl(s, SIOCGIFINDEX, &conf.ifc_req[i]) < 0) {
-                       i--;
-                       n--;
+                       k++;
                        continue;
                }
-               idx[i].if_index = conf.ifc_req[i].ifr_ifindex;
-               idx[i].if_name = conf.ifc_req[i].ifr_name;
+               idx[i-k].if_index = conf.ifc_req[i].ifr_ifindex;
+               idx[i-k].if_name = conf.ifc_req[i].ifr_name;
        }
-       idx[i].if_name = 0;
-       idx[i].if_index = 0;
+       idx[i-k].if_name = 0;
+       idx[i-k].if_index = 0;
 
        return idx;
 }
@@ -48,7 +47,7 @@ struct if_nameindex *if_nameindex()
 {
        size_t n;
        void *p = 0;
-       int s = socket(AF_UNIX, SOCK_DGRAM, 0);
+       int s = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
        if (s>=0) {
                for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++);
                __syscall(SYS_close, s);