summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-11-12 22:41:03 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-11-12 22:41:03 +0000
commit9975e3d37d8585b41db075321bade3495cf58cdb (patch)
tree416cb16185348b44feb8e0fdb778325a52598e21
parentc4eae75271734f820a7477dbce33f8752af6f003 (diff)
Fix locale memmem namespace (bug 17585).
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.
-rw-r--r--ChangeLog9
-rw-r--r--NEWS2
-rw-r--r--include/string.h2
-rw-r--r--locale/findlocale.c4
-rw-r--r--string/memmem.c9
5 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 90ea96b355..9ef09070b7 100644
--- 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 6ae72dad9c..27969e0e3a 100644
--- 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.
diff --git a/include/string.h b/include/string.h
index 2603e9c0ab..99cc2d3f59 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 22e8b53032..b64352c9d9 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 b2842fe57f..bafac03df9 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