]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix strftime wcschr namespace (bug 17634).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 10 Dec 2014 16:59:02 +0000 (16:59 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 10 Dec 2014 16:59:02 +0000 (16:59 +0000)
Use of strftime, a C90 function, ends up bringing in wcschr, which is
not a C90 function.  Although not a conformance bug (C90 reserves
wcs*), this is still contrary to glibc practice of avoiding relying on
those reservations; this patch arranges for the internal uses to use
__wcschr instead, with wcschr being a weak alias.  This is more
complicated than some such patches because of the various IFUNC
definitions of wcschr (which include code redefining libc_hidden_def
in a way that involves creating __GI_wcschr manually and so also needs
to create __GI___wcschr after the change of internal uses to use
__wcschr).

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

2014-12-10  Joseph Myers  <joseph@codesourcery.com>
    Adhemerval Zanella  <azanella@linux.vnet.ibm.com>

[BZ #17634]
* wcsmbs/wcschr.c [!WCSCHR] (wcschr): Define as __wcschr.
Undefine after defining function.  Define as weak alias of
__wcschr.  Use libc_hidden_weak.
* include/wchar.h (__wcschr): Declare.  Use libc_hidden_proto.
* sysdeps/i386/i686/multiarch/wcschr-c.c [IS_IN (libc) && SHARED]
(libc_hidden_def): Also define __GI___wcschr alias.
* sysdeps/i386/i686/multiarch/wcschr.S (wcschr): Rename to
__wcschr and define as weak alias of __wcschr.
* sysdeps/powerpc/power6/wcschr.c [!WCSCHR] (WCSCHR): Define as
__wcschr.
[!WCSCHR] (DEFAULT_WCSCHR): Define.
[DEFAULT_WCSCHR] (__wcschr): Use libc_hidden_def.
[DEFAULT_WCSCHR] (wcschr): Define as weak alias of __wcschr.  Use
libc_hidden_weak.  Do not use libc_hidden_def.
* sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
[IS_IN (libc) && SHARED] (libc_hidden_def): Also define
__GI___wcschr alias.
* sysdeps/powerpc/powerpc32/power4/multiarch/wcschr.c
[IS_IN (libc)] (wcschr): Define as macro expanding to
__redirect_wcschr.
[IS_IN (libc)] (__wcschr_ppc): Use __redirect_wcschr in typeof.
[IS_IN (libc)] (__wcschr_power6): Likewise.
[IS_IN (libc)] (__wcschr_power7): Likewise.
[IS_IN (libc)] (__libc_wcschr): New.  Define with libc_ifunc
instead of wcschr.
[IS_IN (libc)] (wcschr): Undefine and define as weak alias of
__libc_wcschr.
[!IS_IN (libc)] (libc_hidden_def): Do not undefine and redefine.
* sysdeps/powerpc/powerpc64/multiarch/wcschr.c (wcschr): Rename to
__wcschr and define as weak alias of __wcschr.  Use
libc_hidden_builtin_def.
* sysdeps/x86_64/wcschr.S (wcschr): Rename to __wcschr and define
as weak alias of __wcschr.  Use libc_hidden_weak.
* time/alt_digit.c (_nl_get_walt_digit): Use __wcschr instead of
wcschr.
* time/era.c (_nl_init_era_entries): Likewise.
* conform/Makefile (test-xfail-ISO/time.h/linknamespace): Remove
variable.
(test-xfail-XPG3/time.h/linknamespace): Likewise.
(test-xfail-XPG4/time.h/linknamespace): Likewise.

14 files changed:
ChangeLog
NEWS
conform/Makefile
include/wchar.h
sysdeps/i386/i686/multiarch/wcschr-c.c
sysdeps/i386/i686/multiarch/wcschr.S
sysdeps/powerpc/power6/wcschr.c
sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
sysdeps/powerpc/powerpc32/power4/multiarch/wcschr.c
sysdeps/powerpc/powerpc64/multiarch/wcschr.c
sysdeps/x86_64/wcschr.S
time/alt_digit.c
time/era.c
wcsmbs/wcschr.c

index ac8f6391e621659468d738b13a055d653d3363ad..0199461c5f163a433f6c744ec420d80c40f8729a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,48 @@
+2014-12-10  Joseph Myers  <joseph@codesourcery.com>
+           Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       [BZ #17634]
+       * wcsmbs/wcschr.c [!WCSCHR] (wcschr): Define as __wcschr.
+       Undefine after defining function.  Define as weak alias of
+       __wcschr.  Use libc_hidden_weak.
+       * include/wchar.h (__wcschr): Declare.  Use libc_hidden_proto.
+       * sysdeps/i386/i686/multiarch/wcschr-c.c [IS_IN (libc) && SHARED]
+       (libc_hidden_def): Also define __GI___wcschr alias.
+       * sysdeps/i386/i686/multiarch/wcschr.S (wcschr): Rename to
+       __wcschr and define as weak alias of __wcschr.
+       * sysdeps/powerpc/power6/wcschr.c [!WCSCHR] (WCSCHR): Define as
+       __wcschr.
+       [!WCSCHR] (DEFAULT_WCSCHR): Define.
+       [DEFAULT_WCSCHR] (__wcschr): Use libc_hidden_def.
+       [DEFAULT_WCSCHR] (wcschr): Define as weak alias of __wcschr.  Use
+       libc_hidden_weak.  Do not use libc_hidden_def.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
+       [IS_IN (libc) && SHARED] (libc_hidden_def): Also define
+       __GI___wcschr alias.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/wcschr.c
+       [IS_IN (libc)] (wcschr): Define as macro expanding to
+       __redirect_wcschr.
+       [IS_IN (libc)] (__wcschr_ppc): Use __redirect_wcschr in typeof.
+       [IS_IN (libc)] (__wcschr_power6): Likewise.
+       [IS_IN (libc)] (__wcschr_power7): Likewise.
+       [IS_IN (libc)] (__libc_wcschr): New.  Define with libc_ifunc
+       instead of wcschr.
+       [IS_IN (libc)] (wcschr): Undefine and define as weak alias of
+       __libc_wcschr.
+       [!IS_IN (libc)] (libc_hidden_def): Do not undefine and redefine.
+       * sysdeps/powerpc/powerpc64/multiarch/wcschr.c (wcschr): Rename to
+       __wcschr and define as weak alias of __wcschr.  Use
+       libc_hidden_builtin_def.
+       * sysdeps/x86_64/wcschr.S (wcschr): Rename to __wcschr and define
+       as weak alias of __wcschr.  Use libc_hidden_weak.
+       * time/alt_digit.c (_nl_get_walt_digit): Use __wcschr instead of
+       wcschr.
+       * time/era.c (_nl_init_era_entries): Likewise.
+       * conform/Makefile (test-xfail-ISO/time.h/linknamespace): Remove
+       variable.
+       (test-xfail-XPG3/time.h/linknamespace): Likewise.
+       (test-xfail-XPG4/time.h/linknamespace): Likewise.
+
 2014-12-10  Joseph Myers  <joseph@codesourcery.com>
 
        * libio/tst-ftell-active-handler.c (do_ftruncate_test): Use %ld
diff --git a/NEWS b/NEWS
index 4235d37c62d621b37f3b232cad55c3ac50cd804b..480e3b1333c12a298190696e2645eef4c58dd9cf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,8 +13,8 @@ Version 2.21
   15884, 16469, 16619, 16740, 16857, 17192, 17266, 17344, 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, 17633, 17647, 17653, 17664,
-  17665, 17668, 17682.
+  17589, 17594, 17601, 17608, 17616, 17625, 17633, 17634, 17647, 17653,
+  17664, 17665, 17668, 17682.
 
 * 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 f99c30c7d5bb7bee660e8ebdec382f484669e7a7..848aae751b231506eb4b8173d44e0ba4750a4931 100644 (file)
@@ -345,7 +345,6 @@ test-xfail-XOPEN2K/ndbm.h/linknamespace = yes
 test-xfail-XOPEN2K8/ndbm.h/linknamespace = yes
 
 # Unsorted expected failures.
-test-xfail-ISO/time.h/linknamespace = yes
 test-xfail-ISO99/ctype.h/linknamespace = yes
 test-xfail-ISO11/ctype.h/linknamespace = yes
 test-xfail-XPG3/ctype.h/linknamespace = yes
@@ -354,7 +353,6 @@ test-xfail-XPG3/glob.h/linknamespace = yes
 test-xfail-XPG3/regex.h/linknamespace = yes
 test-xfail-XPG3/search.h/linknamespace = yes
 test-xfail-XPG3/stdio.h/linknamespace = yes
-test-xfail-XPG3/time.h/linknamespace = yes
 test-xfail-XPG3/unistd.h/linknamespace = yes
 test-xfail-XPG3/wordexp.h/linknamespace = yes
 test-xfail-XPG4/ctype.h/linknamespace = yes
@@ -370,7 +368,6 @@ test-xfail-XPG4/search.h/linknamespace = yes
 test-xfail-XPG4/stdio.h/linknamespace = yes
 test-xfail-XPG4/stdlib.h/linknamespace = yes
 test-xfail-XPG4/syslog.h/linknamespace = yes
-test-xfail-XPG4/time.h/linknamespace = yes
 test-xfail-XPG4/unistd.h/linknamespace = yes
 test-xfail-XPG4/wordexp.h/linknamespace = yes
 test-xfail-POSIX/aio.h/linknamespace = yes
index 8207a532820830991844eaac8ad480a9e39db045..7b5e1a16a3d5382b86e68342d0986fb0aca75af7 100644 (file)
@@ -85,6 +85,12 @@ libc_hidden_proto (wcscmp)
 libc_hidden_proto (wcsftime)
 libc_hidden_proto (wcsspn)
 libc_hidden_proto (wcschr)
+/* The C++ overloading of wcschr means we have to repeat the type to
+   declare __wcschr instead of using typeof, to avoid errors in C++
+   tests.  */
+extern wchar_t *__wcschr (const wchar_t *__wcs, wchar_t __wc)
+     __THROW __attribute_pure__;
+libc_hidden_proto (__wcschr)
 libc_hidden_proto (wcscoll)
 libc_hidden_proto (wcspbrk)
 
index 4c5f0f6b25b4bbecfd6072dfa6b6b04f51d3ecdc..786c132fcd4c0e3274176b663d9f45e77c3f63d6 100644 (file)
@@ -4,7 +4,9 @@
 # ifdef SHARED
 #  undef libc_hidden_def
 #  define libc_hidden_def(name) \
-   __hidden_ver1 (__wcschr_ia32, __GI_wcschr, __wcschr_ia32);
+   __hidden_ver1 (__wcschr_ia32, __GI_wcschr, __wcschr_ia32); \
+   strong_alias (__wcschr_ia32, __wcschr_ia32_1); \
+   __hidden_ver1 (__wcschr_ia32_1, __GI___wcschr, __wcschr_ia32_1);
 # endif
 # define WCSCHR  __wcschr_ia32
 #endif
index 9a80a3361811533ae574b108c8eaf07c8c0660b2..ccbc0580012dc50af83e428e34a190209319ab22 100644 (file)
@@ -23,7 +23,7 @@
 
 #if IS_IN (libc)
        .text
-ENTRY(wcschr)
+ENTRY(__wcschr)
        .type   wcschr, @gnu_indirect_function
        pushl   %ebx
        cfi_adjust_cfa_offset (4)
@@ -40,5 +40,6 @@ ENTRY(wcschr)
        cfi_adjust_cfa_offset (-4);
        cfi_restore (ebx)
        ret
-END(wcschr)
+END(__wcschr)
+weak_alias (__wcschr, wcschr)
 #endif
index 7045677b5105e932003c105432e7a04c11ab1321..af5dc8caaeaafc95742aba7149406ee2373fd89f 100644 (file)
@@ -19,7 +19,8 @@
 #include <wchar.h>
 
 #ifndef WCSCHR
-# define WCSCHR wcschr
+# define WCSCHR __wcschr
+# define DEFAULT_WCSCHR
 #endif
 
 /* Find the first occurrence of WC in WCS.  */
@@ -86,4 +87,10 @@ WCSCHR (const wchar_t *wcs, const wchar_t wc)
 
   return NULL;
 }
+#ifdef DEFAULT_WCSCHR
+libc_hidden_def (__wcschr)
+weak_alias (__wcschr, wcschr)
+libc_hidden_weak (wcschr)
+#else
 libc_hidden_def (wcschr)
+#endif
index 9a067afacd19566872bd303b1e94ccc2de0fe2bc..d698efc9a9ab692f7735552322dfc0d041953c79 100644 (file)
@@ -21,7 +21,9 @@
 # ifdef SHARED
 #   undef libc_hidden_def
 #   define libc_hidden_def(name)  \
-    __hidden_ver1 (__wcschr_ppc, __GI_wcschr, __wcschr_ppc);
+    __hidden_ver1 (__wcschr_ppc, __GI_wcschr, __wcschr_ppc); \
+    strong_alias (__wcschr_ppc, __wcschr_ppc_1); \
+    __hidden_ver1 (__wcschr_ppc_1, __GI___wcschr, __wcschr_ppc_1);
 # endif
 # define WCSCHR  __wcschr_ppc
 #endif
index 6b8cd9c528680d65f696c0f706b758b98c150092..ae5c517ae1de5ba796ff5fd97998a3b18ac02b5a 100644 (file)
    <http://www.gnu.org/licenses/>.  */
 
 #if IS_IN (libc)
+# define wcschr __redirect_wcschr
 # include <wchar.h>
 # include <shlib-compat.h>
 # include "init-arch.h"
 
-extern __typeof (wcschr) __wcschr_ppc attribute_hidden;
-extern __typeof (wcschr) __wcschr_power6 attribute_hidden;
-extern __typeof (wcschr) __wcschr_power7 attribute_hidden;
+extern __typeof (__redirect_wcschr) __wcschr_ppc attribute_hidden;
+extern __typeof (__redirect_wcschr) __wcschr_power6 attribute_hidden;
+extern __typeof (__redirect_wcschr) __wcschr_power7 attribute_hidden;
 
-libc_ifunc (wcschr,
+extern __typeof (__redirect_wcschr) __libc_wcschr;
+
+libc_ifunc (__libc_wcschr,
             (hwcap & PPC_FEATURE_HAS_VSX)
              ? __wcschr_power7 :
               (hwcap & PPC_FEATURE_ARCH_2_05)
               ? __wcschr_power6
              : __wcschr_ppc);
+#undef wcschr
+weak_alias (__libc_wcschr, wcschr)
 #else
-#undef libc_hidden_def
-#define libc_hidden_def(a)
 #include <wcsmbs/wcschr.c>
 #endif
index 6b8cd9c528680d65f696c0f706b758b98c150092..658cd9306f89be24289a6ad30df697ff50c7804c 100644 (file)
@@ -25,12 +25,14 @@ extern __typeof (wcschr) __wcschr_ppc attribute_hidden;
 extern __typeof (wcschr) __wcschr_power6 attribute_hidden;
 extern __typeof (wcschr) __wcschr_power7 attribute_hidden;
 
-libc_ifunc (wcschr,
+libc_ifunc (__wcschr,
             (hwcap & PPC_FEATURE_HAS_VSX)
              ? __wcschr_power7 :
               (hwcap & PPC_FEATURE_ARCH_2_05)
               ? __wcschr_power6
              : __wcschr_ppc);
+weak_alias (__wcschr, wcschr)
+libc_hidden_builtin_def (wcschr)
 #else
 #undef libc_hidden_def
 #define libc_hidden_def(a)
index faca7594673d4450c656b4a56afb073c5291fd71..5c2f2d401018003222be40d5cd5e8cc40c84128d 100644 (file)
@@ -20,7 +20,7 @@
 #include <sysdep.h>
 
        .text
-ENTRY (wcschr)
+ENTRY (__wcschr)
 
        movd    %rsi, %xmm1
        pxor    %xmm2, %xmm2
@@ -149,6 +149,8 @@ L(return_null):
        xor     %rax, %rax
        ret
 
-END (wcschr)
+END (__wcschr)
 
-libc_hidden_def(wcschr)
+libc_hidden_def(__wcschr)
+weak_alias (__wcschr, wcschr)
+libc_hidden_weak (wcschr)
index bd13abdd9c11a87d3e44f90b76821d4d90826945..36859a98c30a92c1d6bf6f8c1741766b2010bd3e 100644 (file)
@@ -132,7 +132,7 @@ _nl_get_walt_digit (unsigned int number, struct __locale_data *current)
                data->walt_digits[cnt] = ptr;
 
                /* Skip digit format. */
-               ptr = wcschr (ptr, L'\0') + 1;
+               ptr = __wcschr (ptr, L'\0') + 1;
              }
        }
     }
index fd311c625f98ccab9e11abf45d4edf6b9d4a3ccf..5ac75e0c42e56f9cb1e4aad40c00f1b4695d9bd0 100644 (file)
@@ -122,11 +122,11 @@ _nl_init_era_entries (struct __locale_data *current)
 
                  /* Set and skip wide era name.  */
                  new_eras[cnt].era_wname = (wchar_t *) ptr;
-                 ptr = (char *) (wcschr ((wchar_t *) ptr, L'\0') + 1);
+                 ptr = (char *) (__wcschr ((wchar_t *) ptr, L'\0') + 1);
 
                  /* Set and skip wide era format.  */
                  new_eras[cnt].era_wformat = (wchar_t *) ptr;
-                 ptr = (char *) (wcschr ((wchar_t *) ptr, L'\0') + 1);
+                 ptr = (char *) (__wcschr ((wchar_t *) ptr, L'\0') + 1);
                }
            }
        }
index 1a35b8044d45d1c5a349ba6dbb1dc543af8f0e94..bed66a7033f5f9b863ce629b001dace44e89f8dd 100644 (file)
@@ -20,6 +20,8 @@
 /* Find the first occurrence of WC in WCS.  */
 #ifdef WCSCHR
 # define wcschr WCSCHR
+#else
+# define wcschr __wcschr
 #endif
 
 wchar_t *
@@ -35,3 +37,8 @@ wcschr (wcs, wc)
   return NULL;
 }
 libc_hidden_def (wcschr)
+#ifndef WCSCHR
+# undef wcschr
+weak_alias (__wcschr, wcschr)
+libc_hidden_weak (wcschr)
+#endif