Fix resolver inet_* namespace (bug 17722).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 17 Dec 2014 18:09:11 +0000 (18:09 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 17 Dec 2014 18:09:11 +0000 (18:09 +0000)
Parts of the resolver brought in by pthreads (at least) use inet_*
functions that aren't in the 1995/6 edition of POSIX that introduced
pthreads (or in one case, use __inet_aton which is then defined in the
same file as non-weak inet_addr).  This patch fixes this by making the
affected functions into weak alias for __inet_* and using those names
in the problematic resolver code.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).

[BZ #17722]
* inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and
define as weak alias of __inet_makeaddr.
* resolv/inet_addr.c (inet_addr): Rename to __inet_addr and define
as weak alias of __inet_addr.
* resolv/inet_pton.c (inet_pton): Rename to __inet_pton and define
as weak alias of __inet_pton.  Use libc_hidden_weak.
* include/arpa/inet.h (__inet_pton): Declare.  Use
libc_hidden_proto.
(inet_makeaddr): Don't use libc_hidden_proto.
(__inet_makeaddr): Declare.  Use libc_hidden_proto.
* resolv/res_init.c (__res_vinit): Use __inet_pton instead of
inet_pton.  Use __inet_makeaddr instead of inet_makeaddr.
* conform/Makefile (test-xfail-POSIX/pthread.h/linknamespace):
Remove variable.
(test-xfail-POSIX/sched.h/linknamespace): Likewise.
(test-xfail-POSIX/time.h/linknamespace): Likewise.

ChangeLog
NEWS
conform/Makefile
include/arpa/inet.h
inet/inet_mkadr.c
resolv/inet_addr.c
resolv/inet_pton.c
resolv/res_init.c

index a7cb40e3b607213b882568f708246568f54b22c0..2fc8cde873310f4c03728e1cc43d134ad6111780 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2014-12-17  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #17722]
+       * inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and
+       define as weak alias of __inet_makeaddr.
+       * resolv/inet_addr.c (inet_addr): Rename to __inet_addr and define
+       as weak alias of __inet_addr.
+       * resolv/inet_pton.c (inet_pton): Rename to __inet_pton and define
+       as weak alias of __inet_pton.  Use libc_hidden_weak.
+       * include/arpa/inet.h (__inet_pton): Declare.  Use
+       libc_hidden_proto.
+       (inet_makeaddr): Don't use libc_hidden_proto.
+       (__inet_makeaddr): Declare.  Use libc_hidden_proto.
+       * resolv/res_init.c (__res_vinit): Use __inet_pton instead of
+       inet_pton.  Use __inet_makeaddr instead of inet_makeaddr.
+       * conform/Makefile (test-xfail-POSIX/pthread.h/linknamespace):
+       Remove variable.
+       (test-xfail-POSIX/sched.h/linknamespace): Likewise.
+       (test-xfail-POSIX/time.h/linknamespace): Likewise.
+
 2014-12-17  Steve Ellcey  <sellcey@imgtec.com>
 
        * inet/getnetgrent_r.c: Move while loop to be inside if statement.
diff --git a/NEWS b/NEWS
index c46f51ade3659d496267edf2f475bc6f51b4bce8..d4ccd37dfa3194a6c069c3d8412c74db08af5d04 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,8 @@ Version 2.21
   17363, 17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, 17508,
   17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581, 17582, 17583,
   17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630, 17633,
-  17634, 17647, 17653, 17657, 17664, 17665, 17668, 17682, 17717, 17719.
+  17634, 17647, 17653, 17657, 17664, 17665, 17668, 17682, 17717, 17719,
+  17722.
 
 * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
   under certain input conditions resulting in the execution of a shell for
index 45a17fb525f4809528bbf7e38be4a40c3b7db4ff..5e6ac0947ef2c320a074f5d83aecbd4cf4559d04 100644 (file)
@@ -371,11 +371,8 @@ test-xfail-POSIX/aio.h/linknamespace = yes
 test-xfail-POSIX/fnmatch.h/linknamespace = yes
 test-xfail-POSIX/glob.h/linknamespace = yes
 test-xfail-POSIX/mqueue.h/linknamespace = yes
-test-xfail-POSIX/pthread.h/linknamespace = yes
 test-xfail-POSIX/regex.h/linknamespace = yes
-test-xfail-POSIX/sched.h/linknamespace = yes
 test-xfail-POSIX/semaphore.h/linknamespace = yes
-test-xfail-POSIX/time.h/linknamespace = yes
 test-xfail-POSIX/unistd.h/linknamespace = yes
 test-xfail-POSIX/wordexp.h/linknamespace = yes
 test-xfail-UNIX98/ctype.h/linknamespace = yes
index 63ece7029aa1d417f36fd1d923d7f9afe11b68ba..c3f28f2baaa2ed662767d8e2d6262fc90a8f921d 100644 (file)
@@ -7,6 +7,9 @@ libc_hidden_proto (__inet_aton)
 libc_hidden_proto (inet_aton)
 libc_hidden_proto (inet_ntop)
 libc_hidden_proto (inet_pton)
-libc_hidden_proto (inet_makeaddr)
+extern __typeof (inet_pton) __inet_pton;
+libc_hidden_proto (__inet_pton)
+extern __typeof (inet_makeaddr) __inet_makeaddr;
+libc_hidden_proto (__inet_makeaddr)
 libc_hidden_proto (inet_netof)
 #endif
index d8d92da768b2ede0eaa32ea97f60667053ac7763..580a9cd95606d99096b398ab81afef983b6fd0bb 100644 (file)
@@ -40,7 +40,7 @@ static char sccsid[] = "@(#)inet_makeaddr.c   8.1 (Berkeley) 6/4/93";
  * building addresses stored in the ifnet structure.
  */
 struct in_addr
-inet_makeaddr(net, host)
+__inet_makeaddr(net, host)
        in_addr_t net, host;
 {
        struct in_addr in;
@@ -56,4 +56,5 @@ inet_makeaddr(net, host)
        in.s_addr = htonl(in.s_addr);
        return in;
 }
-libc_hidden_def (inet_makeaddr)
+libc_hidden_def (__inet_makeaddr)
+weak_alias (__inet_makeaddr, inet_makeaddr)
index 144b87a74c1aef62779862e78e5f87e18e66ee9e..ee420937549f19e1f88ab9edf53b3e47b63ddf95 100644 (file)
@@ -90,13 +90,14 @@ static const char rcsid[] = "$BINDId: inet_addr.c,v 8.11 1999/10/13 16:39:25 vix
  * The value returned is in network order.
  */
 in_addr_t
-inet_addr(const char *cp) {
+__inet_addr(const char *cp) {
        struct in_addr val;
 
        if (__inet_aton(cp, &val))
                return (val.s_addr);
        return (INADDR_NONE);
 }
+weak_alias (__inet_addr, inet_addr)
 
 /*
  * Check whether "cp" is a valid ascii representation
index c507013e4ea9a90b18c69799ec95d4924e85f832..3d8819512e446f9741abc0a001191d52ebaefec9 100644 (file)
@@ -49,7 +49,7 @@ static int inet_pton6 (const char *src, u_char *dst) internal_function;
  *     Paul Vixie, 1996.
  */
 int
-inet_pton(af, src, dst)
+__inet_pton(af, src, dst)
        int af;
        const char *src;
        void *dst;
@@ -65,7 +65,9 @@ inet_pton(af, src, dst)
        }
        /* NOTREACHED */
 }
-libc_hidden_def (inet_pton)
+libc_hidden_def (__inet_pton)
+weak_alias (__inet_pton, inet_pton)
+libc_hidden_weak (inet_pton)
 
 /* int
  * inet_pton4(src, dst)
index 6eddcdd0b24e954a4ee8107c0467d567c6a72336..d492a08aee36ad8d0837c1bc04c6d07265039250 100644 (file)
@@ -324,7 +324,7 @@ __res_vinit(res_state statp, int preinit) {
                        if ((el = strchr(cp, SCOPE_DELIMITER)) != NULL)
                            *el = '\0';
                        if ((*cp != '\0') &&
-                           (inet_pton(AF_INET6, cp, &a6) > 0)) {
+                           (__inet_pton(AF_INET6, cp, &a6) > 0)) {
                            struct sockaddr_in6 *sa6;
 
                            sa6 = malloc(sizeof(*sa6));
@@ -428,7 +428,7 @@ __res_vinit(res_state statp, int preinit) {
            (void) fclose(fp);
        }
        if (__builtin_expect(statp->nscount == 0, 0)) {
-           statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
+           statp->nsaddr.sin_addr = __inet_makeaddr(IN_LOOPBACKNET, 1);
            statp->nsaddr.sin_family = AF_INET;
            statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
            statp->nscount = 1;