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.
This commit is contained in:
Alexandre Oliva 2014-09-27 07:23:39 -03:00
parent f3d945d5f2
commit b59d114bd1
2 changed files with 20 additions and 3 deletions

View File

@ -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]

View 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,