From patchwork Fri Nov 21 05:46:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Oliva X-Patchwork-Id: 3827 Received: (qmail 27451 invoked by alias); 21 Nov 2014 05:48:57 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 27438 invoked by uid 89); 21 Nov 2014 05:48:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_40, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com From: Alexandre Oliva To: Siddhesh Poyarekar Cc: libc-alpha@sourceware.org Subject: Re: BZ#16469: don't drop trailing dot in res_nquerydomain References: <20141119102803.GN7942@spoyarek.pnq.redhat.com> Date: Fri, 21 Nov 2014 03:46:12 -0200 In-Reply-To: <20141119102803.GN7942@spoyarek.pnq.redhat.com> (Siddhesh Poyarekar's message of "Wed, 19 Nov 2014 15:58:03 +0530") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 On Nov 19, 2014, Siddhesh Poyarekar wrote: > On Fri, Nov 14, 2014 at 10:08:37PM -0200, Alexandre Oliva wrote: >> --- a/resolv/res_query.c >> +++ b/resolv/res_query.c >> @@ -561,10 +561,6 @@ __libc_res_nquerydomain(res_state statp, > The comment on top of __libc_res_nquerydomain needs to be updated too. > Looks OK otherwise. Thanks, here's the patch I've just pushed to master: for ChangeLog [BZ #16469] * NEWS: Update. * resolv/res_query.c (__libc_res_nquerydomain): Retain trailing dot. * posix/tst-getaddrinfo5.c: New. * posix/Makefile (tests): Add it. --- NEWS | 8 +++-- posix/Makefile | 2 + posix/tst-getaddrinfo5.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ resolv/res_query.c | 13 +-------- 4 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 posix/tst-getaddrinfo5.c diff --git a/NEWS b/NEWS index 5ba3f1b..ad170c4 100644 --- a/NEWS +++ b/NEWS @@ -9,10 +9,10 @@ Version 2.21 * The following bugs are resolved with this release: - 6652, 12926, 14132, 14138, 14171, 14498, 15215, 15884, 17266, 17344, - 17363, 17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, 17508, - 17522, 17555, 17570, 17571, 17572, 17573, 17574, 17582, 17583, 17584, - 17585, 17589, 17594, 17616, 17625. + 6652, 12926, 14132, 14138, 14171, 14498, 15215, 15884, 16469, 17266, + 17344, 17363, 17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, + 17508, 17522, 17555, 17570, 17571, 17572, 17573, 17574, 17582, 17583, + 17584, 17585, 17589, 17594, 17616, 17625. * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag under certain input conditions resulting in the execution of a shell for diff --git a/posix/Makefile b/posix/Makefile index e6b69b4..faefaf1 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -87,7 +87,7 @@ tests := tstgetopt testfnm runtests runptests \ bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \ tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \ - tst-fnmatch3 bug-regex36 + tst-fnmatch3 bug-regex36 tst-getaddrinfo5 xtests := bug-ga2 ifeq (yes,$(build-shared)) test-srcs := globtest diff --git a/posix/tst-getaddrinfo5.c b/posix/tst-getaddrinfo5.c new file mode 100644 index 0000000..cfebb9b --- /dev/null +++ b/posix/tst-getaddrinfo5.c @@ -0,0 +1,69 @@ +/* Test host lookup with double dots at the end, [BZ #16469]. + Copyright (C) 2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + +static int +test (void) +{ + static char host1[] = "localhost.."; + static char host2[] = "www.gnu.org.."; + static char *hosts[] = { host1, host2 }; + int i; + int pass = 0; + + for (i = 0; i < sizeof (hosts) / sizeof (*hosts); i++) + { + char *host = hosts[i]; + size_t len = strlen (host); + struct addrinfo *ai; + + /* If the name doesn't resolve with a single dot at the + end, skip it. */ + host[len-1] = 0; + if (getaddrinfo (host, NULL, NULL, &ai) != 0) + { + printf ("resolving \"%s\" failed, skipping this hostname\n", host); + continue; + } + printf ("resolving \"%s\" worked, proceeding to test\n", host); + freeaddrinfo (ai); + + /* If it resolved with a single dot, check that it doesn't with + a second trailing dot. */ + host[len-1] = '.'; + if (getaddrinfo (host, NULL, NULL, &ai) == 0) + { + printf ("resolving \"%s\" worked, test failed\n", host); + return 1; + } + printf ("resolving \"%s\" failed, test passed\n", host); + pass = 1; + } + + /* We want at least one successful name resolution for the test to + succeed. */ + return pass ? 0 : 2; +} + +#define TEST_FUNCTION test () +#define TIMEOUT 10 +#include "../test-skeleton.c" diff --git a/resolv/res_query.c b/resolv/res_query.c index e4ee2a6..33eeeb7 100644 --- a/resolv/res_query.c +++ b/resolv/res_query.c @@ -535,8 +535,7 @@ res_nsearch(res_state statp, libresolv_hidden_def (res_nsearch) /* - * Perform a call on res_query on the concatenation of name and domain, - * removing a trailing dot from name if domain is NULL. + * Perform a call on res_query on the concatenation of name and domain. */ static int __libc_res_nquerydomain(res_state statp, @@ -561,10 +560,6 @@ __libc_res_nquerydomain(res_state statp, name, domain?domain:"", class, type); #endif if (domain == NULL) { - /* - * Check for trailing '.'; - * copy without '.' if present. - */ n = strlen(name); /* Decrement N prior to checking it against MAXDNAME @@ -575,11 +570,7 @@ __libc_res_nquerydomain(res_state statp, RES_SET_H_ERRNO(statp, NO_RECOVERY); return (-1); } - if (name[n] == '.') { - strncpy(nbuf, name, n); - nbuf[n] = '\0'; - } else - longname = name; + longname = name; } else { n = strlen(name); d = strlen(domain);