diff mbox

Fix locale memmem namespace (bug 17585)

Message ID alpine.DEB.2.10.1411120041280.12642@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Nov. 12, 2014, 12:41 a.m. UTC
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).

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.

Comments

Roland McGrath Nov. 12, 2014, 9:58 p.m. UTC | #1
Looks OK.
diff mbox

Patch

diff --git a/include/string.h b/include/string.h
index 8323412..93087ef 100644
--- a/include/string.h
+++ b/include/string.h
@@ -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)
diff --git a/locale/findlocale.c b/locale/findlocale.c
index 22e8b53..b64352c 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -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;
diff --git a/string/memmem.c b/string/memmem.c
index b2842fe..bafac03 100644
--- a/string/memmem.c
+++ b/string/memmem.c
@@ -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