BZ#16469: resolv: skip leading dot in domain to search
authorAlexandre Oliva <aoliva@redhat.com>
Sat, 27 Sep 2014 10:23:39 +0000 (07:23 -0300)
committerAlexandre Oliva <aoliva@redhat.com>
Fri, 21 Nov 2014 05:39:37 +0000 (03:39 -0200)
This should only happen if the domain to search is the root,
represented as "." rather than by an empty string.  Skipping it here
prevents libc_res_nquerydomain from duplicating the trailing dot,
which would cause the domain name compression to fail.

for  ChangeLog

[BZ #16469]
* resolv/res_query.c (__libc_res_nsearch): Skip leading dot in
search domain names.

ChangeLog
resolv/res_query.c

index 650d11892d578c19fbc82c1c139203a06b0d93f4..76fda28818b863cbffb39221894f84e82b342f4e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-21  Alexandre Oliva <aoliva@redhat.com>
+
+       [BZ #16469]
+       * resolv/res_query.c (__libc_res_nsearch): Skip leading dot in
+       search domain names.
+
 2014-11-21  Alexandre Oliva <aoliva@redhat.com>
 
        [BZ #16469]
index 33eeeb70da6511134342f4d50db1b80fe9032ac4..4a9b3b3f27288f1c6926082ba5aadcd0427b142e 100644 (file)
@@ -413,13 +413,24 @@ __libc_res_nsearch(res_state statp,
                for (domain = (const char * const *)statp->dnsrch;
                     *domain && !done;
                     domain++) {
+                       const char *dname = domain[0];
                        searched = 1;
 
-                       if (domain[0][0] == '\0' ||
-                           (domain[0][0] == '.' && domain[0][1] == '\0'))
+                       /* __libc_res_nquerydoman concatenates name
+                          with dname with a "." in between.  If we
+                          pass it in dname the "." we got from the
+                          configured default search path, we'll end
+                          up with "name..", which won't resolve.
+                          OTOH, passing it "" will result in "name.",
+                          which has the intended effect for both
+                          possible representations of the root
+                          domain.  */
+                       if (dname[0] == '.')
+                               dname++;
+                       if (dname[0] == '\0')
                                root_on_list++;
 
-                       ret = __libc_res_nquerydomain(statp, name, *domain,
+                       ret = __libc_res_nquerydomain(statp, name, dname,
                                                      class, type,
                                                      answer, anslen, answerp,
                                                      answerp2, nanswerp2,