s4-resolver: make it work back with ipv4 only DNS records
authorMatthieu Patou <mat@matws.net>
Wed, 2 Nov 2011 08:39:23 +0000 (09:39 +0100)
committerMatthieu Patou <mat@samba.org>
Wed, 2 Nov 2011 10:15:34 +0000 (11:15 +0100)
It turns out that if there is no AAAA record the dns server (bind and MS
windows at least) do not return the A record when just asked for AAAA.

Autobuild-User: Matthieu Patou <mat@samba.org>
Autobuild-Date: Wed Nov  2 11:15:34 CET 2011 on sn-devel-104

source4/libcli/resolve/dns_ex.c

index 60e9afda370a9db29bd15478d94964a5e9eb1f54..993ef43caabbf94d0fe7ff88e5452789eb5b8fe9 100644 (file)
@@ -178,29 +178,38 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
           to avoid them in the parent */
        reply = rk_dns_lookup(name, "AAAA");
 
-       if (!reply) {
-               return ret;
-       }
+       count = count2 = 0;
+
+       if (reply) {
+
+               count = count_dns_rr(reply->head, rk_ns_t_aaaa);
+               count2 = count_dns_rr(reply->head, rk_ns_t_a);
+
+               if (!count2) {
+                       /*
+                       * DNS server didn't returned A when asked for AAAA records.
+                       * Most of the server do it, let's ask for A specificaly.
+                       */
+                       reply2 = rk_dns_lookup(name, "A");
 
-       count = count_dns_rr(reply->head, rk_ns_t_aaaa);
-       count2 = count_dns_rr(reply->head, rk_ns_t_a);
+                       if (!reply2) {
+                               return ret;
+                       }
 
-       if (!count2) {
-               /*
-                * DNS server didn't returned A when asked for AAAA records.
-                * Most of the server do it, let's ask for A specificaly.
-                */
-               reply2 = rk_dns_lookup(name, "A");
+                       count2 = count_dns_rr(reply2->head, rk_ns_t_a);
+               } else {
+                       reply2 = NULL;
+               }
+       } else {
 
-               if (!reply2) {
+               reply = rk_dns_lookup(name, "A");
+               if (!reply) {
                        return ret;
                }
 
-               count2 = count_dns_rr(reply2->head, rk_ns_t_a);
-       } else {
                reply2 = NULL;
+               count = count_dns_rr(reply->head, rk_ns_t_a);
        }
-
        count += count2;
 
        if (count == 0) {
@@ -322,7 +331,7 @@ static struct dns_records_container get_srv_records(TALLOC_CTX *mem_ctx,
 
                        addrs = talloc_realloc(mem_ctx, addrs, char*, total);
                        for (j=0; j < c.count; j++) {
-                               addrs[total - j] = talloc_steal(addrs, c.list[j]);
+                               addrs[total - j - 1] = talloc_steal(addrs, c.list[j]);
                        }
                }
        }