aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--NEWS8
-rw-r--r--posix/Makefile2
-rw-r--r--posix/tst-getaddrinfo5.c69
-rw-r--r--resolv/res_query.c13
5 files changed, 85 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 785189d..650d118 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2014-11-21 Alexandre Oliva <aoliva@redhat.com>
+ [BZ #16469]
+ * NEWS: Update.
+ * resolv/res_query.c (__libc_res_nquerydomain): Retain
+ trailing dot.
+ * posix/tst-getaddrinfo5.c: New.
+ * posix/Makefile (tests): Add it.
+
+2014-11-21 Alexandre Oliva <aoliva@redhat.com>
+
[BZ #14498]
* NEWS: Fixed.
* nss/nss_db/db-XXX.c (_nss_db_get##name##_r): Update hidx
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
+ <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+
+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:"<Nil>", 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);