]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix locale memmem namespace (bug 17585).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 12 Nov 2014 22:41:03 +0000 (22:41 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 12 Nov 2014 22:41:03 +0000 (22:41 +0000)
Locale code, brought in by ISO C functions, calls memmem, which is not
an ISO C function.  This isn't an ISO C conformance bug, because all
mem* names are reserved, but glibc practice is not to rely on that
reservation (thus, memmem is only declared in string.h if __USE_GNU
even though ISO C would allow it to be declared unconditionally, for
example).  This patch changes that code to use __memmem.

Note: there are uses of memmem elsewhere in glibc that I didn't
change, although it may turn out some of those also need to use
__memmem.

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

[BZ #17585]
* string/memmem.c [!_LIBC] (__memmem): Define to memmem.
(memmem): Rename to __memmem and define as weak alias of
__memmem.  Use libc_hidden_weak.
(__memmem): Use libc_hidden_def.
* include/string.h (__memmem): Declare.  Use libc_hidden_proto.
* locale/findlocale.c (valid_locale_name): Use __memmem instead of
memmem.

ChangeLog
NEWS
include/string.h
locale/findlocale.c
string/memmem.c

index 90ea96b355fe186288eebeb6664370f069da5dd8..9ef09070b778fe85aaa4f6a0976b69dc8afe64f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2014-11-12  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #17585]
+       * string/memmem.c [!_LIBC] (__memmem): Define to memmem.
+       (memmem): Rename to __memmem and define as weak alias of
+       __memmem.  Use libc_hidden_weak.
+       (__memmem): Use libc_hidden_def.
+       * include/string.h (__memmem): Declare.  Use libc_hidden_proto.
+       * locale/findlocale.c (valid_locale_name): Use __memmem instead of
+       memmem.
+
        [BZ #17582]
        * libio/iofgets.c [weak_alias && !_IO_MTSAFE_IO]
        (__fgets_unlocked): Add alias of _IO_fgets.  Use libc_hidden_def.
diff --git a/NEWS b/NEWS
index 6ae72dad9c263273e73d5bd43633cf939e9577f8..27969e0e3ae983e6a354b2fc89771f42c059a19b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,7 +11,7 @@ Version 2.21
 
   6652, 12926, 14132, 14138, 14171, 15215, 15884, 17266, 17344, 17363,
   17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, 17508, 17522,
-  17555, 17570, 17571, 17572, 17573, 17574, 17582, 17583, 17584.
+  17555, 17570, 17571, 17572, 17573, 17574, 17582, 17583, 17584, 17585.
 
 * New locales: tu_IN, bh_IN.
 \f
index 2603e9c0abf4e454ba5ab637b3b95421c9149e0b..99cc2d3f593e6bc21d5ac676f423c4eee3d9d6e5 100644 (file)
@@ -90,6 +90,8 @@ extern char *__strsep_g (char **__stringp, const char *__delim);
 libc_hidden_proto (__strsep_g)
 libc_hidden_proto (strnlen)
 libc_hidden_proto (memmem)
+extern __typeof (memmem) __memmem;
+libc_hidden_proto (__memmem)
 libc_hidden_proto (__ffs)
 
 libc_hidden_builtin_proto (memchr)
index 22e8b530320055ede07ec86929e4a4d549a85494..b64352c9d9f67c0718ab256ce0ecadd4983cc8bd 100644 (file)
@@ -79,8 +79,8 @@ valid_locale_name (const char *name)
     return 0;
   /* Directory traversal attempt.  */
   static const char slashdot[4] = {'/', '.', '.', '/'};
-  if (__glibc_unlikely (memmem (name, namelen,
-                               slashdot, sizeof (slashdot)) != NULL))
+  if (__glibc_unlikely (__memmem (name, namelen,
+                                 slashdot, sizeof (slashdot)) != NULL))
     return 0;
   if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.'))
     return 0;
index b2842fe57f949f94614b7858316938050f80752d..bafac03df969da39c3282c0db120a64477d4fee9 100644 (file)
@@ -26,6 +26,7 @@
 
 #ifndef _LIBC
 # define __builtin_expect(expr, val)   (expr)
+# define __memmem      memmem
 #endif
 
 #define RETURN_TYPE void *
@@ -38,8 +39,8 @@
    if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
    HAYSTACK.  */
 void *
-memmem (const void *haystack_start, size_t haystack_len,
-       const void *needle_start, size_t needle_len)
+__memmem (const void *haystack_start, size_t haystack_len,
+         const void *needle_start, size_t needle_len)
 {
   /* Abstract memory is considered to be an array of 'unsigned char' values,
      not an array of 'char' values.  See ISO C 99 section 6.2.6.1.  */
@@ -73,6 +74,8 @@ memmem (const void *haystack_start, size_t haystack_len,
   else
     return two_way_long_needle (haystack, haystack_len, needle, needle_len);
 }
-libc_hidden_def (memmem)
+libc_hidden_def (__memmem)
+weak_alias (__memmem, memmem)
+libc_hidden_weak (memmem)
 
 #undef LONG_NEEDLE_THRESHOLD