From ea41469b7ab2c8e35b1c10054f7076a95f80003a Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 17 Dec 2014 18:10:37 +0000 Subject: [PATCH] Fix profil_counter namespace (bug 17725). On ARM, where profil_counter is not static, it is brought in by references to various standard functions, as noted in , although it is not a standard function itself. I don't know if this also causes test failures on SPARC, although I see no reason for it not to do so. This patch fixes this namespace issue. profil_counter is renamed to __profil_counter and made a weak alias on ARM and SPARC. Because of the uses in profil.c / sprofil.c it seems simplest to make the rename globally, including on the other architectures for which profil_counter was static and so the change is of no substance. The variant names profil_counter_* used in sprofil.c are also renamed to start with __ so that undesired function names do not get exported in static libc. As I noted in bug 17726, profil_counter should probably be a compat symbol on ARM and SPARC, so it wouldn't exist at all in static libc even as a weak alias. Since defining a compat symbol still requires an internal name as a target of an alias, this patch still seems reasonable as an intermediate step towards that goal: it wouldn't be possible for the function simply to be static profil_counter on ARM and SPARC with profil_counter also being the exported compat symbol name, so profil.c / sprofil.c would still need to be prepared to call the function under another name (here, __profil_counter). Tested for x86_64 (testsuite, and that stripped installed shared libraries are unchanged by the patch) and ARM (ABI and linknamespace tests - this patch reduces the number of linknamespace failures I see on ARM from 227 to 5, the residue being math.h failures for fe* functions and for j0l/j1n/jnl/y0l/y1l/ynl aliases). 2014-12-17 Joseph Myers [BZ #17725] * sysdeps/generic/profil-counter.h (profil_counter): Rename to __profil_counter. * sysdeps/unix/sysv/linux/hppa/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/i386/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/ia64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/sh/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/tile/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/x86_64/profil-counter.h (profil_counter): Likewise. * sysdeps/unix/sysv/linux/arm/profil-counter.h (profil_counter): Likewise. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h (profil_counter): Rename to __profil_counter. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h (profil_counter): Rename to __profil_counter. [!__profil_counter] (profil_counter): Define as weak alias of __profil_counter. * sysdeps/posix/profil.c: Update comment referring to profil_counter. (__profil): Use __profil_counter instead of profil_counter. * sysdeps/posix/sprofil.c (profil_counter): Rename to __profil_counter. Use __profil_counter_ushort and __profil_counter_uint in definitions. (__sprofil): Use __profil_counter_uint and __profil_counter_ushort instead of profil_counter_uint and profil_counter_ushort. --- ChangeLog | 40 +++++++++++++++++++ NEWS | 2 +- sysdeps/generic/profil-counter.h | 2 +- sysdeps/posix/profil.c | 4 +- sysdeps/posix/sprofil.c | 12 +++--- sysdeps/unix/sysv/linux/arm/profil-counter.h | 5 ++- sysdeps/unix/sysv/linux/hppa/profil-counter.h | 2 +- sysdeps/unix/sysv/linux/i386/profil-counter.h | 2 +- sysdeps/unix/sysv/linux/ia64/profil-counter.h | 2 +- .../sysv/linux/s390/s390-32/profil-counter.h | 2 +- .../sysv/linux/s390/s390-64/profil-counter.h | 2 +- sysdeps/unix/sysv/linux/sh/profil-counter.h | 2 +- .../sysv/linux/sparc/sparc32/profil-counter.h | 5 ++- .../sysv/linux/sparc/sparc64/profil-counter.h | 5 ++- sysdeps/unix/sysv/linux/tile/profil-counter.h | 2 +- .../unix/sysv/linux/x86_64/profil-counter.h | 2 +- 16 files changed, 70 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2fc8cde873..7bfd1c9eb0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,45 @@ 2014-12-17 Joseph Myers + [BZ #17725] + * sysdeps/generic/profil-counter.h (profil_counter): Rename to + __profil_counter. + * sysdeps/unix/sysv/linux/hppa/profil-counter.h (profil_counter): + Likewise. + * sysdeps/unix/sysv/linux/i386/profil-counter.h (profil_counter): + Likewise. + * sysdeps/unix/sysv/linux/ia64/profil-counter.h (profil_counter): + Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h + (profil_counter): Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h + (profil_counter): Likewise. + * sysdeps/unix/sysv/linux/sh/profil-counter.h (profil_counter): + Likewise. + * sysdeps/unix/sysv/linux/tile/profil-counter.h (profil_counter): + Likewise. + * sysdeps/unix/sysv/linux/x86_64/profil-counter.h + (profil_counter): Likewise. + * sysdeps/unix/sysv/linux/arm/profil-counter.h (profil_counter): + Likewise. + [!__profil_counter] (profil_counter): Define as weak alias of + __profil_counter. + * sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h + (profil_counter): Rename to __profil_counter. + [!__profil_counter] (profil_counter): Define as weak alias of + __profil_counter. + * sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h + (profil_counter): Rename to __profil_counter. + [!__profil_counter] (profil_counter): Define as weak alias of + __profil_counter. + * sysdeps/posix/profil.c: Update comment referring to + profil_counter. + (__profil): Use __profil_counter instead of profil_counter. + * sysdeps/posix/sprofil.c (profil_counter): Rename to + __profil_counter. Use __profil_counter_ushort and + __profil_counter_uint in definitions. + (__sprofil): Use __profil_counter_uint and __profil_counter_ushort + instead of profil_counter_uint and profil_counter_ushort. + [BZ #17722] * inet/inet_mkadr.c (inet_makeaddr): Rename to __inet_makeaddr and define as weak alias of __inet_makeaddr. diff --git a/NEWS b/NEWS index d4ccd37dfa..05b398ecd6 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,7 @@ Version 2.21 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, - 17722. + 17722, 17725. * 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/sysdeps/generic/profil-counter.h b/sysdeps/generic/profil-counter.h index 4ff9b496cf..52800c8ad1 100644 --- a/sysdeps/generic/profil-counter.h +++ b/sysdeps/generic/profil-counter.h @@ -20,7 +20,7 @@ and the interrupted PC is easily findable in the `struct sigcontext'. */ static void -profil_counter (int signr, int code, struct sigcontext *scp) +__profil_counter (int signr, int code, struct sigcontext *scp) { profil_count ((void *) scp->sc_pc); } diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c index 54ace22537..7128cb7a8b 100644 --- a/sysdeps/posix/profil.c +++ b/sysdeps/posix/profil.c @@ -48,7 +48,7 @@ profil_count (void *pc) ++samples[i]; } -/* Get the machine-dependent definition of `profil_counter', the signal +/* Get the machine-dependent definition of `__profil_counter', the signal handler for SIGPROF. It calls `profil_count' (above) with the PC of the interrupted code. */ #include "profil-counter.h" @@ -103,7 +103,7 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) pc_offset = offset; pc_scale = scale; - act.sa_handler = (sighandler_t) &profil_counter; + act.sa_handler = (sighandler_t) &__profil_counter; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); if (__sigaction (SIGPROF, &act, oact_ptr) < 0) diff --git a/sysdeps/posix/sprofil.c b/sysdeps/posix/sprofil.c index 0e19d16c23..e2b7a4922b 100644 --- a/sysdeps/posix/sprofil.c +++ b/sysdeps/posix/sprofil.c @@ -175,17 +175,17 @@ profil_count_uint (void *pcp) profil_count (pcp, 1); } -/* Get the machine-dependent definition of `profil_counter', the signal +/* Get the machine-dependent definition of `__profil_counter', the signal handler for SIGPROF. It calls `profil_count' (above) with the PC of the interrupted code. */ -#define profil_counter profil_counter_ushort +#define __profil_counter __profil_counter_ushort #define profil_count(pc) profil_count (pc, 0) #include -#undef profil_counter +#undef __profil_counter #undef profil_count -#define profil_counter profil_counter_uint +#define __profil_counter __profil_counter_uint #define profil_count(pc) profil_count (pc, 1) #include @@ -334,9 +334,9 @@ __sprofil (struct prof *profp, int profcnt, struct timeval *tvp, /* Install SIGPROF handler. */ if (flags & PROF_UINT) - act.sa_handler = (sighandler_t) &profil_counter_uint; + act.sa_handler = (sighandler_t) &__profil_counter_uint; else - act.sa_handler = (sighandler_t) &profil_counter_ushort; + act.sa_handler = (sighandler_t) &__profil_counter_ushort; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); if (__sigaction (SIGPROF, &act, &prof_info.saved_action) < 0) diff --git a/sysdeps/unix/sysv/linux/arm/profil-counter.h b/sysdeps/unix/sysv/linux/arm/profil-counter.h index ddf4d41af2..908bd6e05c 100644 --- a/sysdeps/unix/sysv/linux/arm/profil-counter.h +++ b/sysdeps/unix/sysv/linux/arm/profil-counter.h @@ -20,7 +20,7 @@ #include void -profil_counter (int signo, const SIGCONTEXT scp) +__profil_counter (int signo, const SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); @@ -29,3 +29,6 @@ profil_counter (int signo, const SIGCONTEXT scp) the signal context. */ asm volatile (""); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/hppa/profil-counter.h b/sysdeps/unix/sysv/linux/hppa/profil-counter.h index 1561672d94..85c4712391 100644 --- a/sysdeps/unix/sysv/linux/hppa/profil-counter.h +++ b/sysdeps/unix/sysv/linux/hppa/profil-counter.h @@ -17,7 +17,7 @@ . */ static void -profil_counter (int signr, siginfo_t *si, struct ucontext *uctx) +__profil_counter (int signr, siginfo_t *si, struct ucontext *uctx) { unsigned long ip = uctx->uc_mcontext.sc_iaoq[0] & ~0x3; profil_count ((void *) ip); diff --git a/sysdeps/unix/sysv/linux/i386/profil-counter.h b/sysdeps/unix/sysv/linux/i386/profil-counter.h index 0bd60cbce2..c414619630 100644 --- a/sysdeps/unix/sysv/linux/i386/profil-counter.h +++ b/sysdeps/unix/sysv/linux/i386/profil-counter.h @@ -20,7 +20,7 @@ #include static void -profil_counter (int signo, const SIGCONTEXT scp) +__profil_counter (int signo, const SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); diff --git a/sysdeps/unix/sysv/linux/ia64/profil-counter.h b/sysdeps/unix/sysv/linux/ia64/profil-counter.h index 1bd5c218ca..53ad09f745 100644 --- a/sysdeps/unix/sysv/linux/ia64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/ia64/profil-counter.h @@ -20,7 +20,7 @@ and the interrupted PC is easily findable in the `struct sigcontext'. */ static void -profil_counter (int signr, siginfo_t *si, struct sigcontext *scp) +__profil_counter (int signr, siginfo_t *si, struct sigcontext *scp) { unsigned long ip = scp->sc_ip & ~0X3ULL, slot = scp->sc_ip & 0x3ull; diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h b/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h index 7f279072b4..31f9a34302 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/profil-counter.h @@ -20,7 +20,7 @@ #include static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count((void *) ((unsigned long) GET_PC (scp) & 0x7fffffffUL)); } diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h b/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h index b5d243193d..e3c304c34e 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/profil-counter.h @@ -20,7 +20,7 @@ #include static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); } diff --git a/sysdeps/unix/sysv/linux/sh/profil-counter.h b/sysdeps/unix/sysv/linux/sh/profil-counter.h index d7707c0cc8..d1f84413d3 100644 --- a/sysdeps/unix/sysv/linux/sh/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sh/profil-counter.h @@ -19,7 +19,7 @@ #include static void -profil_counter (int signo, int _a2, int _a3, int _a4, struct sigcontext sc) +__profil_counter (int signo, int _a2, int _a3, int _a4, struct sigcontext sc) { void *pc; pc = (void *) sc.sc_pc; diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h index 31b4ddf7ac..b0d9959d90 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h @@ -19,7 +19,10 @@ #include void -profil_counter (int signo, struct sigcontext *si) +__profil_counter (int signo, struct sigcontext *si) { profil_count ((void *) si->si_regs.pc); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h index 38f7270ac2..2745a320aa 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h @@ -19,7 +19,10 @@ #include void -profil_counter (int signo, struct sigcontext *si) +__profil_counter (int signo, struct sigcontext *si) { profil_count ((void *) si->sigc_regs.tpc); } +#ifndef __profil_counter +weak_alias (__profil_counter, profil_counter) +#endif diff --git a/sysdeps/unix/sysv/linux/tile/profil-counter.h b/sysdeps/unix/sysv/linux/tile/profil-counter.h index 4ab1666a12..c509403ddd 100644 --- a/sysdeps/unix/sysv/linux/tile/profil-counter.h +++ b/sysdeps/unix/sysv/linux/tile/profil-counter.h @@ -20,7 +20,7 @@ #include static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp)); } diff --git a/sysdeps/unix/sysv/linux/x86_64/profil-counter.h b/sysdeps/unix/sysv/linux/x86_64/profil-counter.h index 90c5667b53..6f5fd93997 100644 --- a/sysdeps/unix/sysv/linux/x86_64/profil-counter.h +++ b/sysdeps/unix/sysv/linux/x86_64/profil-counter.h @@ -20,7 +20,7 @@ #include static void -profil_counter (int signo, SIGCONTEXT scp) +__profil_counter (int signo, SIGCONTEXT scp) { profil_count ((void *) GET_PC (scp));