BZ#16469: resolv: skip leading dot in domain to search
Commit Message
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
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
@@ -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,