fix broken dns response parsing code that made most ipv6 lookups fail
[musl] / src / network / __dns.c
index 73ec422..b53ad4a 100644 (file)
@@ -31,8 +31,8 @@ int __dns_doqueries(unsigned char *dest, const char *name, int *rr, int rrcnt)
                struct sockaddr_in6 sin6;
        } sa = {0}, ns[3] = {{0}};
        socklen_t sl;
-       int nns;
-       int family;
+       int nns = 0;
+       int family = AF_UNSPEC;
        unsigned char q[280] = "", *r = dest;
        int ql;
        int rlen;
@@ -46,7 +46,7 @@ int __dns_doqueries(unsigned char *dest, const char *name, int *rr, int rrcnt)
        /* Construct query template - RR and ID will be filled later */
        if (strlen(name)-1 >= 254U) return -1;
        q[2] = q[5] = 1;
-       strcpy(q+13, name);
+       strcpy((char *)q+13, name);
        for (i=13; q[i]; i=j+1) {
                for (j=i; q[j] && q[j] != '.'; j++);
                if (j-i-1u > 62u) return -1;
@@ -257,10 +257,12 @@ int __dns_count_addrs(const unsigned char *r, int cnt)
        int found=0, res, i;
        static const int p[2][2] = { { 4, RR_A }, { 16, RR_AAAA } };
 
-       while (cnt--) for (i=0; i<2; i++) {
-               res = __dns_get_rr(0, 0, p[i][0], -1, r, p[i][1], 0);
-               if (res < 0) return res;
-               found += res;
+       while (cnt--) {
+               for (i=0; i<2; i++) {
+                       res = __dns_get_rr(0, 0, p[i][0], -1, r, p[i][1], 0);
+                       if (res < 0) return res;
+                       found += res;
+               }
                r += 512;
        }
        return found;