bug-gnulib
[Top][All Lists]
Advanced

[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) ;;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]