BZ#16469: resolv: skip leading dot in domain to search

Message ID ord28pgw7i.fsf@free.home
State Committed
Headers

Commit Message

Alexandre Oliva Nov. 15, 2014, 12:10 a.m. UTC
  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.

No testcase for this one; we can't really exercise this in a controlled
fashion without overriding /etc/resolv.conf.

No regressions on x86_64-linux-gnu.  Ok to install?


for  ChangeLog

	[BZ #16469]
	* resolv/res_query.c (__libc_res_nsearch): Skip leading dot in
	search domain names.
---
 resolv/res_query.c |   17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
  

Comments

Siddhesh Poyarekar Nov. 19, 2014, 10:31 a.m. UTC | #1
On Fri, Nov 14, 2014 at 10:10:25PM -0200, Alexandre Oliva wrote:
> 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.
> 
> No testcase for this one; we can't really exercise this in a controlled
> fashion without overriding /etc/resolv.conf.
> 
> No regressions on x86_64-linux-gnu.  Ok to install?
> 
> 
> for  ChangeLog
> 
> 	[BZ #16469]
> 	* resolv/res_query.c (__libc_res_nsearch): Skip leading dot in
> 	search domain names.

Looks good to me.

Siddhesh
  

Patch

diff --git a/resolv/res_query.c b/resolv/res_query.c
index 338ad82..0d276b0 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,