]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix resolver if_* namespace (bug 17717).
authorJoseph Myers <joseph@codesourcery.com>
Tue, 16 Dec 2014 18:18:49 +0000 (18:18 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 16 Dec 2014 18:18:49 +0000 (18:18 +0000)
Resolver code, brought in by pthreads (at least), uses if_* interfaces
that weren't in POSIX before 2001, resulting in linknamespace
failures.  This patch changes those interfaces to be weak aliases of
__if_* and makes the resolver use __if_* directly.

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

[BZ #17717]
* inet/if_index.c (if_nametoindex): Rename to __if_nametoindex and
define as weak alias of __if_nametoindex.  Use libc_hidden_weak.
(if_indextoname): Rename to __if_indextoname and define as weak
alias of __if_indextoname.  Use libc_hidden_weak.
(if_freenameindex): Rename to __if_freenameindex and define as
weak alias of __if_freenameindex.
(if_nameindex): Rename to __if_nameindex and define as weak alias
of __if_nameindex.
* sysdeps/mach/hurd/if_index.c (if_nametoindex): Rename to
__if_nametoindex and define as weak alias of __if_nametoindex.
Use libc_hidden_weak.
(if_freenameindex): Rename to __if_freenameindex and define as
weak alias of __if_freenameindex.
(if_nameindex): Rename to __if_nameindex and define as weak alias
of __if_nameindex.
(if_indextoname): Rename to __if_indextoname and define as weak
alias of __if_indextoname.  Use libc_hidden_weak.
* sysdeps/unix/sysv/linux/if_index.c (if_nametoindex): Rename to
__if_nametoindex and define as weak alias of __if_nametoindex.
Use libc_hidden_weak.
(if_freenameindex): Rename to __if_freenameindex and define as
weak alias of __if_freenameindex.  Use libc_hidden_weak.
(if_nameindex_netlink): Use __if_freenameindex instead of
if_freenameindex.
(if_nameindex): Rename to __if_nameindex and define as weak alias
of __if_nameindex.  Use libc_hidden_weak.
(if_indextoname): Rename to __if_indextoname and define as weak
alias of __if_indextoname.  Use libc_hidden_weak.
* include/net/if.h [!_ISOMAC] (__if_nametoindex): Declare and use
libc_hidden_proto.
[!_ISOMAC] (__if_freenameindex): Likewise.
* resolv/res_init.c (__res_vinit): Use __if_nametoindex instead of
if_nametoindex.
* conform/Makefile (test-xfail-XPG4/grp.h/linknamespace): Remove
variable.
(test-xfail-XPG4/pwd.h/linknamespace): Likewise.
(test-xfail-UNIX98/aio.h/linknamespace): Likewise.
(test-xfail-UNIX98/grp.h/linknamespace): Likewise.
(test-xfail-UNIX98/pthread.h/linknamespace): Likewise.
(test-xfail-UNIX98/pwd.h/linknamespace): Likewise.
(test-xfail-UNIX98/sched.h/linknamespace): Likewise.
(test-xfail-UNIX98/time.h/linknamespace): Likewise.

ChangeLog
NEWS
conform/Makefile
include/net/if.h
inet/if_index.c
resolv/res_init.c
sysdeps/mach/hurd/if_index.c
sysdeps/unix/sysv/linux/if_index.c

index 5b9a4a57c5d81b5a7d5e9344bf27f30710678715..eb60f80606a062e6136048612e731ae7e1789ee2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,49 @@
 2014-12-16  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #17717]
+       * inet/if_index.c (if_nametoindex): Rename to __if_nametoindex and
+       define as weak alias of __if_nametoindex.  Use libc_hidden_weak.
+       (if_indextoname): Rename to __if_indextoname and define as weak
+       alias of __if_indextoname.  Use libc_hidden_weak.
+       (if_freenameindex): Rename to __if_freenameindex and define as
+       weak alias of __if_freenameindex.
+       (if_nameindex): Rename to __if_nameindex and define as weak alias
+       of __if_nameindex.
+       * sysdeps/mach/hurd/if_index.c (if_nametoindex): Rename to
+       __if_nametoindex and define as weak alias of __if_nametoindex.
+       Use libc_hidden_weak.
+       (if_freenameindex): Rename to __if_freenameindex and define as
+       weak alias of __if_freenameindex.
+       (if_nameindex): Rename to __if_nameindex and define as weak alias
+       of __if_nameindex.
+       (if_indextoname): Rename to __if_indextoname and define as weak
+       alias of __if_indextoname.  Use libc_hidden_weak.
+       * sysdeps/unix/sysv/linux/if_index.c (if_nametoindex): Rename to
+       __if_nametoindex and define as weak alias of __if_nametoindex.
+       Use libc_hidden_weak.
+       (if_freenameindex): Rename to __if_freenameindex and define as
+       weak alias of __if_freenameindex.  Use libc_hidden_weak.
+       (if_nameindex_netlink): Use __if_freenameindex instead of
+       if_freenameindex.
+       (if_nameindex): Rename to __if_nameindex and define as weak alias
+       of __if_nameindex.  Use libc_hidden_weak.
+       (if_indextoname): Rename to __if_indextoname and define as weak
+       alias of __if_indextoname.  Use libc_hidden_weak.
+       * include/net/if.h [!_ISOMAC] (__if_nametoindex): Declare and use
+       libc_hidden_proto.
+       [!_ISOMAC] (__if_freenameindex): Likewise.
+       * resolv/res_init.c (__res_vinit): Use __if_nametoindex instead of
+       if_nametoindex.
+       * conform/Makefile (test-xfail-XPG4/grp.h/linknamespace): Remove
+       variable.
+       (test-xfail-XPG4/pwd.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/aio.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/grp.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/pthread.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/pwd.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/sched.h/linknamespace): Likewise.
+       (test-xfail-UNIX98/time.h/linknamespace): Likewise.
+
        * conform/Makefile (test-xfail-UNIX98/semaphore.h/linknamespace):
        Remove variable.
        (test-xfail-XOPEN2K/semaphore.h/linknamespace): Likewise.
diff --git a/NEWS b/NEWS
index 11121cacb0664a3548328b1ee842f4edcc123020..443475980adad050a62fe3363471990c8cd8108a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,7 @@ 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.
+  17634, 17647, 17653, 17657, 17664, 17665, 17668, 17682, 17717.
 
 * 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 19335656b44361ab5b5e1f5d3bfb245ee3e1a575..e0412de1a482231b32ed3a072ffec5bd75d5aa8b 100644 (file)
@@ -359,10 +359,8 @@ test-xfail-XPG4/ctype.h/linknamespace = yes
 test-xfail-XPG4/fmtmsg.h/linknamespace = yes
 test-xfail-XPG4/fnmatch.h/linknamespace = yes
 test-xfail-XPG4/glob.h/linknamespace = yes
-test-xfail-XPG4/grp.h/linknamespace = yes
 test-xfail-XPG4/libgen.h/linknamespace = yes
 test-xfail-XPG4/netdb.h/linknamespace = yes
-test-xfail-XPG4/pwd.h/linknamespace = yes
 test-xfail-XPG4/regex.h/linknamespace = yes
 test-xfail-XPG4/search.h/linknamespace = yes
 test-xfail-XPG4/stdio.h/linknamespace = yes
@@ -381,24 +379,18 @@ 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/aio.h/linknamespace = yes
 test-xfail-UNIX98/ctype.h/linknamespace = yes
 test-xfail-UNIX98/fmtmsg.h/linknamespace = yes
 test-xfail-UNIX98/fnmatch.h/linknamespace = yes
 test-xfail-UNIX98/glob.h/linknamespace = yes
-test-xfail-UNIX98/grp.h/linknamespace = yes
 test-xfail-UNIX98/libgen.h/linknamespace = yes
 test-xfail-UNIX98/mqueue.h/linknamespace = yes
 test-xfail-UNIX98/netdb.h/linknamespace = yes
-test-xfail-UNIX98/pthread.h/linknamespace = yes
-test-xfail-UNIX98/pwd.h/linknamespace = yes
 test-xfail-UNIX98/regex.h/linknamespace = yes
-test-xfail-UNIX98/sched.h/linknamespace = yes
 test-xfail-UNIX98/search.h/linknamespace = yes
 test-xfail-UNIX98/stdio.h/linknamespace = yes
 test-xfail-UNIX98/stdlib.h/linknamespace = yes
 test-xfail-UNIX98/syslog.h/linknamespace = yes
-test-xfail-UNIX98/time.h/linknamespace = yes
 test-xfail-UNIX98/unistd.h/linknamespace = yes
 test-xfail-UNIX98/wchar.h/linknamespace = yes
 test-xfail-UNIX98/wordexp.h/linknamespace = yes
index 1d862260c7e8397742e7db3404df88ab7f55faf4..6c4cbc96c3733a01552f8f4cfdf2abdb67954c15 100644 (file)
@@ -4,9 +4,13 @@
 
 #ifndef _ISOMAC
 libc_hidden_proto (if_nametoindex)
+extern __typeof (if_nametoindex) __if_nametoindex;
+libc_hidden_proto (__if_nametoindex)
 libc_hidden_proto (if_indextoname)
 libc_hidden_proto (if_nameindex)
 libc_hidden_proto (if_freenameindex)
+extern __typeof (if_freenameindex) __if_freenameindex;
+libc_hidden_proto (__if_freenameindex)
 #endif
 
 #endif
index 98b01d1ff4e96915cebf8e2227c282dd60327fd1..8b30d0190c4a2f0518c06d9958f4df16c902c523 100644 (file)
 #include <stddef.h>
 
 unsigned int
-if_nametoindex (const char *ifname)
+__if_nametoindex (const char *ifname)
 {
   __set_errno (ENOSYS);
   return 0;
 }
-libc_hidden_def (if_nametoindex)
+libc_hidden_def (__if_nametoindex)
+weak_alias (__if_nametoindex, if_nametoindex)
+libc_hidden_weak (if_nametoindex)
 stub_warning (if_nametoindex)
 
 char *
-if_indextoname (unsigned int ifindex, char *ifname)
+__if_indextoname (unsigned int ifindex, char *ifname)
 {
   __set_errno (ENOSYS);
   return NULL;
 }
-libc_hidden_def (if_indextoname)
+weak_alias (__if_indextoname, if_indextoname)
+libc_hidden_weak (if_indextoname)
 stub_warning (if_indextoname)
 
 void
-if_freenameindex (struct if_nameindex *ifn)
+__if_freenameindex (struct if_nameindex *ifn)
 {
 }
+weak_alias (__if_freenameindex, if_freenameindex)
 stub_warning (if_freenameindex)
 
 struct if_nameindex *
-if_nameindex (void)
+__if_nameindex (void)
 {
   __set_errno (ENOSYS);
   return NULL;
 }
+weak_alias (__if_nameindex, if_nameindex)
 stub_warning (if_nameindex)
 
 #if 0
index 90760ec8e65d73894edfc7ed7bf3ba2cb9ebc9bf..6eddcdd0b24e954a4ee8107c0467d567c6a72336 100644 (file)
@@ -341,7 +341,7 @@ __res_vinit(res_state statp, int preinit) {
                                    if (IN6_IS_ADDR_LINKLOCAL (&a6)
                                        || IN6_IS_ADDR_MC_LINKLOCAL (&a6)) {
                                        sa6->sin6_scope_id
-                                         = if_nametoindex (el + 1);
+                                         = __if_nametoindex (el + 1);
                                        if (sa6->sin6_scope_id != 0)
                                            try_numericscope = 0;
                                    }
index 9d0ca62fa12a8f47fdc4a936a8055feb7eca7e06..11d21146ae760b86271fdbf65f6670b2e4c21bf8 100644 (file)
@@ -29,7 +29,7 @@
 /* Return the interface index corresponding to interface IFNAME.
    On error, return 0.  */
 unsigned int
-if_nametoindex (const char *ifname)
+__if_nametoindex (const char *ifname)
 {
   struct ifreq ifr;
   int fd = __opensock ();
@@ -49,11 +49,13 @@ if_nametoindex (const char *ifname)
   __close (fd);
   return ifr.ifr_ifindex;
 }
-libc_hidden_def (if_nametoindex)
+libc_hidden_def (__if_nametoindex)
+weak_alias (__if_nametoindex, if_nametoindex)
+libc_hidden_weak (if_nametoindex)
 
 /* Free the structure IFN returned by if_nameindex.  */
 void
-if_freenameindex (struct if_nameindex *ifn)
+__if_freenameindex (struct if_nameindex *ifn)
 {
   struct if_nameindex *ptr = ifn;
   while (ptr->if_name || ptr->if_index)
@@ -63,12 +65,13 @@ if_freenameindex (struct if_nameindex *ifn)
     }
   free (ifn);
 }
+weak_alias (__if_freenameindex, if_freenameindex)
 
 /* Return an array of if_nameindex structures, one for each network
    interface present, plus one indicating the end of the array.  On
    error, return NULL.  */
 struct if_nameindex *
-if_nameindex (void)
+__if_nameindex (void)
 {
   error_t err = 0;
   char data[2048];
@@ -148,12 +151,13 @@ if_nameindex (void)
   __set_errno (err);
   return idx;
 }
+weak_alias (__if_nameindex, if_nameindex)
 
 /* Store the name of the interface corresponding to index IFINDEX in
    IFNAME (which has space for at least IFNAMSIZ characters).  Return
    IFNAME, or NULL on error.  */
 char *
-if_indextoname (unsigned int ifindex, char *ifname)
+__if_indextoname (unsigned int ifindex, char *ifname)
 {
   struct ifreq ifr;
   int fd = __opensock ();
@@ -175,7 +179,8 @@ if_indextoname (unsigned int ifindex, char *ifname)
   __close (fd);
   return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
 }
-libc_hidden_def (if_indextoname)
+weak_alias (__if_indextoname, if_indextoname)
+libc_hidden_weak (if_indextoname)
 
 #if 0
 void
index 0fac763f9f9a9d272203b49f4f7026a8904740d0..b0644f2f9d4655ea055c9e37f0cb4ecb8339a5ca 100644 (file)
@@ -31,7 +31,7 @@
 
 
 unsigned int
-if_nametoindex (const char *ifname)
+__if_nametoindex (const char *ifname)
 {
 #ifndef SIOCGIFINDEX
   __set_errno (ENOSYS);
@@ -56,11 +56,13 @@ if_nametoindex (const char *ifname)
   return ifr.ifr_ifindex;
 #endif
 }
-libc_hidden_def (if_nametoindex)
+libc_hidden_def (__if_nametoindex)
+weak_alias (__if_nametoindex, if_nametoindex)
+libc_hidden_weak (if_nametoindex)
 
 
 void
-if_freenameindex (struct if_nameindex *ifn)
+__if_freenameindex (struct if_nameindex *ifn)
 {
   struct if_nameindex *ptr = ifn;
   while (ptr->if_name || ptr->if_index)
@@ -70,7 +72,9 @@ if_freenameindex (struct if_nameindex *ifn)
     }
   free (ifn);
 }
-libc_hidden_def (if_freenameindex)
+libc_hidden_def (__if_freenameindex)
+weak_alias (__if_freenameindex, if_freenameindex)
+libc_hidden_weak (if_freenameindex)
 
 
 static struct if_nameindex *
@@ -162,7 +166,7 @@ if_nameindex_netlink (void)
                      if (idx[nifs].if_name == NULL)
                        {
                          idx[nifs].if_index = 0;
-                         if_freenameindex (idx);
+                         __if_freenameindex (idx);
                          idx = NULL;
                          goto nomem;
                        }
@@ -189,7 +193,7 @@ if_nameindex_netlink (void)
 
 
 struct if_nameindex *
-if_nameindex (void)
+__if_nameindex (void)
 {
 #ifndef SIOCGIFINDEX
   __set_errno (ENOSYS);
@@ -199,11 +203,12 @@ if_nameindex (void)
   return result;
 #endif
 }
-libc_hidden_def (if_nameindex)
+weak_alias (__if_nameindex, if_nameindex)
+libc_hidden_weak (if_nameindex)
 
 
 char *
-if_indextoname (unsigned int ifindex, char *ifname)
+__if_indextoname (unsigned int ifindex, char *ifname)
 {
   /* We may be able to do the conversion directly, rather than searching a
      list.  This ioctl is not present in kernels before version 2.1.50.  */
@@ -232,4 +237,5 @@ if_indextoname (unsigned int ifindex, char *ifname)
   else
     return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
 }
-libc_hidden_def (if_indextoname)
+weak_alias (__if_indextoname, if_indextoname)
+libc_hidden_weak (if_indextoname)