From 9a44d530c464d081e925b1c1af2b8bbe6e7b3207 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 16 Dec 2014 18:18:49 +0000 Subject: [PATCH] Fix resolver if_* namespace (bug 17717). 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 | 44 ++++++++++++++++++++++++++++++ NEWS | 2 +- conform/Makefile | 8 ------ include/net/if.h | 4 +++ inet/if_index.c | 17 ++++++++---- resolv/res_init.c | 2 +- sysdeps/mach/hurd/if_index.c | 17 ++++++++---- sysdeps/unix/sysv/linux/if_index.c | 24 ++++++++++------ 8 files changed, 87 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5b9a4a57c5..eb60f80606 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,49 @@ 2014-12-16 Joseph Myers + [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 11121cacb0..443475980a 100644 --- 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 diff --git a/conform/Makefile b/conform/Makefile index 19335656b4..e0412de1a4 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -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 diff --git a/include/net/if.h b/include/net/if.h index 1d862260c7..6c4cbc96c3 100644 --- a/include/net/if.h +++ b/include/net/if.h @@ -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 diff --git a/inet/if_index.c b/inet/if_index.c index 98b01d1ff4..8b30d0190c 100644 --- a/inet/if_index.c +++ b/inet/if_index.c @@ -20,35 +20,40 @@ #include 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 diff --git a/resolv/res_init.c b/resolv/res_init.c index 90760ec8e6..6eddcdd0b2 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -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; } diff --git a/sysdeps/mach/hurd/if_index.c b/sysdeps/mach/hurd/if_index.c index 9d0ca62fa1..11d21146ae 100644 --- a/sysdeps/mach/hurd/if_index.c +++ b/sysdeps/mach/hurd/if_index.c @@ -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 diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c index 0fac763f9f..b0644f2f9d 100644 --- a/sysdeps/unix/sysv/linux/if_index.c +++ b/sysdeps/unix/sysv/linux/if_index.c @@ -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)