about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2014-09-27 07:23:39 -0300
committerAlexandre Oliva <aoliva@redhat.com>2014-11-21 03:39:37 -0200
commitb59d114bd1e0571fba85b3cbcc61d4f4b42f5d1b (patch)
tree3dedf50106432b626fda97235f2d26f6d745ddb5
parentf3d945d5f2b9d7d44032c461af588c6d54f5664b (diff)
downloadglibc-b59d114bd1e0571fba85b3cbcc61d4f4b42f5d1b.tar.gz
glibc-b59d114bd1e0571fba85b3cbcc61d4f4b42f5d1b.tar.xz
glibc-b59d114bd1e0571fba85b3cbcc61d4f4b42f5d1b.zip
BZ#16469: resolv: skip leading dot in domain to search
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.
-rw-r--r--ChangeLog6
-rw-r--r--resolv/res_query.c17
2 files changed, 20 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 650d11892d..76fda28818 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
 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]
 	* NEWS: Update.
 	* resolv/res_query.c (__libc_res_nquerydomain): Retain
 	trailing dot.
diff --git a/resolv/res_query.c b/resolv/res_query.c
index 33eeeb70da..4a9b3b3f27 100644
--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -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,