[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: glibc strstr regression
From: |
Bruno Haible |
Subject: |
Re: glibc strstr regression |
Date: |
Sat, 15 Sep 2018 12:08:28 +0200 |
User-agent: |
KMail/5.1.3 (Linux/4.4.0-134-generic; KDE/5.18.0; x86_64; ; ) |
Indeed, testing on a system with glibc 2.28 (Manjaro Linux 17.1.2), I see:
* In 32-bit mode (gcc -m32), test-strstr and test-c-strstr fail.
This indicates that we don't have a proper test case for the strcasestr
bug, only for the strstr bug.
* In 64-bit mode, the tests pass, apparently because __strstr_sse2_unaligned
was chosen at runtime.
> As for the detection of the bug: I understand from
> https://sourceware.org/ml/libc-alpha/2018-09/msg00118.html
> that the bug may be present or absent, depending on the precise CPU
> model glibc is running on. Therefore, the usual kind of configure
> test won't do it. We need to test whether the glibc version is = 2.28.
I still see no better approach. Done as follows:
2018-09-15 Bruno Haible <address@hidden>
strstr, strcasestr: Add workaround against glibc-2.28 bug.
Reported by Michael Brunnbauer via Siddhesh Poyarekar and Eric Blake.
* m4/strstr.m4 (gl_FUNC_STRSTR_SIMPLE): Set
gl_cv_func_strstr_works_always to 'no' on glibc 2.28.
* m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): Set
gl_cv_func_strcasestr_works_always to 'no' on glibc 2.28.
* doc/posix-functions/strstr.texi: Document the glibc 2.28 bug.
* doc/glibc-functions/strcasestr.texi: Likewise.
diff --git a/doc/glibc-functions/strcasestr.texi
b/doc/glibc-functions/strcasestr.texi
index f87ae1f4..7f38de9 100644
--- a/doc/glibc-functions/strcasestr.texi
+++ b/doc/glibc-functions/strcasestr.texi
@@ -11,15 +11,16 @@ or @code{strcasestr}:
This function is missing on some platforms:
AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x,
mingw, MSVC 14, BeOS.
-
@item
This function can trigger memchr bugs on some platforms:
glibc 2.10.
-
@item
This function can trigger false positives for long periodic needles on
some platforms:
glibc 2.12, Cygwin 1.7.7.
address@hidden
+This function may fail to find matches on some platforms:
+glibc 2.28.
@end itemize
Portability problems fixed by Gnulib module @code{strcasestr}:
diff --git a/doc/posix-functions/strstr.texi b/doc/posix-functions/strstr.texi
index 0863673..ca22660 100644
--- a/doc/posix-functions/strstr.texi
+++ b/doc/posix-functions/strstr.texi
@@ -16,6 +16,9 @@ glibc 2.10.
This function can trigger false positives for long periodic needles on
some platforms:
glibc 2.12, Cygwin 1.7.7.
address@hidden
+This function may fail to find matches on some platforms:
+glibc 2.28.
@end itemize
Portability problems fixed by Gnulib @code{strstr}:
diff --git a/m4/strcasestr.m4 b/m4/strcasestr.m4
index 974aee2..c57ac4f 100644
--- a/m4/strcasestr.m4
+++ b/m4/strcasestr.m4
@@ -1,4 +1,4 @@
-# strcasestr.m4 serial 23
+# strcasestr.m4 serial 24
dnl Copyright (C) 2005, 2007-2018 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -20,25 +20,34 @@ AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
REPLACE_STRCASESTR=1
else
- dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092.
+ dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092
+ dnl and https://sourceware.org/bugzilla/show_bug.cgi?id=23637.
AC_CACHE_CHECK([whether strcasestr works],
[gl_cv_func_strcasestr_works_always],
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
#include <string.h> /* for strcasestr */
+#ifdef __GNU_LIBRARY__
+ #include <features.h>
+ #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28
+ Unlucky user
+ #endif
+#endif
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P
-]], [[return !!strcasestr (HAYSTACK, NEEDLE);
- ]])],
- [gl_cv_func_strcasestr_works_always=yes],
- [gl_cv_func_strcasestr_works_always=no],
- [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not
- dnl affected, since it uses different source code for strcasestr
- dnl than glibc.
- dnl Assume that it works on all other platforms, even if it is not
- dnl linear.
- AC_EGREP_CPP([Lucky user],
- [
+]],
+ [[return !!strcasestr (HAYSTACK, NEEDLE);
+ ]])],
+ [gl_cv_func_strcasestr_works_always=yes],
+ [gl_cv_func_strcasestr_works_always=no],
+ [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not
+ dnl affected, since it uses different source code for strcasestr
+ dnl than glibc.
+ dnl Assume that it works on all other platforms, even if it is not
+ dnl linear.
+ AC_EGREP_CPP([Lucky user],
+ [
#ifdef __GNU_LIBRARY__
#include <features.h>
#if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
@@ -53,10 +62,10 @@ AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
#else
Lucky user
#endif
- ],
- [gl_cv_func_strcasestr_works_always="guessing yes"],
- [gl_cv_func_strcasestr_works_always="guessing no"])
- ])
+ ],
+ [gl_cv_func_strcasestr_works_always="guessing yes"],
+ [gl_cv_func_strcasestr_works_always="guessing no"])
+ ])
])
case "$gl_cv_func_strcasestr_works_always" in
*yes) ;;
diff --git a/m4/strstr.m4 b/m4/strstr.m4
index aa590a9..40dbeac 100644
--- a/m4/strstr.m4
+++ b/m4/strstr.m4
@@ -1,4 +1,4 @@
-# strstr.m4 serial 19
+# strstr.m4 serial 20
dnl Copyright (C) 2008-2018 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -12,25 +12,34 @@ AC_DEFUN([gl_FUNC_STRSTR_SIMPLE],
if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
REPLACE_STRSTR=1
else
- dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092.
+ dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092
+ dnl and https://sourceware.org/bugzilla/show_bug.cgi?id=23637.
AC_CACHE_CHECK([whether strstr works],
[gl_cv_func_strstr_works_always],
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
#include <string.h> /* for strstr */
+#ifdef __GNU_LIBRARY__
+ #include <features.h>
+ #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28
+ Unlucky user
+ #endif
+#endif
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P
-]], [[return !!strstr (HAYSTACK, NEEDLE);
- ]])],
- [gl_cv_func_strstr_works_always=yes],
- [gl_cv_func_strstr_works_always=no],
- [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not
- dnl affected, since it uses different source code for strstr than
- dnl glibc.
- dnl Assume that it works on all other platforms, even if it is not
- dnl linear.
- AC_EGREP_CPP([Lucky user],
- [
+]],
+ [[return !!strstr (HAYSTACK, NEEDLE);
+ ]])],
+ [gl_cv_func_strstr_works_always=yes],
+ [gl_cv_func_strstr_works_always=no],
+ [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not
+ dnl affected, since it uses different source code for strstr than
+ dnl glibc.
+ dnl Assume that it works on all other platforms, even if it is not
+ dnl linear.
+ AC_EGREP_CPP([Lucky user],
+ [
#ifdef __GNU_LIBRARY__
#include <features.h>
#if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
@@ -45,10 +54,10 @@ AC_DEFUN([gl_FUNC_STRSTR_SIMPLE],
#else
Lucky user
#endif
- ],
- [gl_cv_func_strstr_works_always="guessing yes"],
- [gl_cv_func_strstr_works_always="guessing no"])
- ])
+ ],
+ [gl_cv_func_strstr_works_always="guessing yes"],
+ [gl_cv_func_strstr_works_always="guessing no"])
+ ])
])
case "$gl_cv_func_strstr_works_always" in
*yes) ;;