strstr, strcasestr: replace on platforms with broken memchr
authorEric Blake <ebb9@byu.net>
Tue, 16 Jun 2009 12:14:05 +0000 (06:14 -0600)
committerEric Blake <ebb9@byu.net>
Wed, 17 Jun 2009 13:24:16 +0000 (07:24 -0600)
* modules/strstr: Split into...
* modules/strstr-simple: ...new module that does not care about
performance, but does care about glibc bug.
* m4/strstr.m4 (gl_FUNC_STRSTR): Split...
(gl_FUNC_STRSTR_SIMPLE): ...into new macro, which replaces strstr
if platform memchr is broken, per Debian bug 521737.
* m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): React to broken
memchr.
* m4/memchr.m4 (gl_FUNC_MEMCHR): Only expand once.
* doc/posix-functions/strstr.texi (strstr): Document the fix.
* doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
* modules/mountlist (Depends-on): Add strstr-simple.
* modules/gen-uni-tables (Depends-on): Likewise.
* modules/argz (Depends-on): Add strstr.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
doc/glibc-functions/strcasestr.texi
doc/posix-functions/strstr.texi
m4/memchr.m4
m4/strcasestr.m4
m4/strstr.m4
modules/argz
modules/gen-uni-tables
modules/mountlist
modules/strstr
modules/strstr-simple [new file with mode: 0644]

index dc851055cbdd63fefadffc474dd15e720beb9355..f5c0497d1a22ca57b753751bb9b645d44ccdf94d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2009-06-17  Eric Blake  <ebb9@byu.net>
+
+       strstr, strcasestr: replace on platforms with broken memchr
+       * modules/strstr: Split into...
+       * modules/strstr-simple: ...new module that does not care about
+       performance, but does care about glibc bug.
+       * m4/strstr.m4 (gl_FUNC_STRSTR): Split...
+       (gl_FUNC_STRSTR_SIMPLE): ...into new macro, which replaces strstr
+       if platform memchr is broken, per Debian bug 521737.
+       * m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): React to broken
+       memchr.
+       * m4/memchr.m4 (gl_FUNC_MEMCHR): Only expand once.
+       * doc/posix-functions/strstr.texi (strstr): Document the fix.
+       * doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
+       * modules/mountlist (Depends-on): Add strstr-simple.
+       * modules/gen-uni-tables (Depends-on): Likewise.
+       * modules/argz (Depends-on): Add strstr.
+
 2009-06-17  Bruno Haible  <bruno@clisp.org>
 
        * modules/posix_spawn-internal (Depends-on): Add errno.
index feb51041ab7fa1fd33ee57e95e3e418077016895..7ce39f42e72d51c4f75a66a848b913308c707f49 100644 (file)
@@ -9,7 +9,12 @@ or @code{strcasestr}:
 @itemize
 @item
 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, BeOS.
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x,
+mingw, BeOS.
+
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
 @end itemize
 
 Portability problems fixed by Gnulib module @code{strcasestr}:
index ffd2ad7631403fbcf68366f25d8f339a05835fdd..f92ba1b68acaefe26ff4f69c43fd35183fa1308e 100644 (file)
@@ -4,14 +4,23 @@
 
 POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html}
 
-Gnulib module: strstr
+Gnulib module: strstr or strstr-simple
 
-Portability problems fixed by Gnulib:
+Portability problems fixed by either Gnulib module @code{strstr-simple}
+or @code{strstr}:
+@itemize
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
+@end itemize
+
+Portability problems fixed by Gnulib @code{strstr}:
 @itemize
 @item
 This function has quadratic instead of linear worst-case complexity on some
 platforms:
-glibc 2.8, MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+glibc 2.8, MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
 @end itemize
 
 Portability problems not fixed by Gnulib:
index 0f899d21ea0bbf08f851ae5360c5549804d1c6e0..1194bac2e81dbadeb030ed946d00f2304bd000c0 100644 (file)
@@ -1,10 +1,10 @@
-# memchr.m4 serial 6
+# memchr.m4 serial 7
 dnl Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_FUNC_MEMCHR],
+AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
 [
   dnl Check for prerequisites for memory fence checks.
   gl_FUNC_MMAP_ANON
index e1e5390542483c4458405584c84fae8470793928..d641958ee090c95ec159b63dbc54da094ea0687a 100644 (file)
@@ -1,20 +1,25 @@
-# strcasestr.m4 serial 12
-dnl Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
+# strcasestr.m4 serial 13
+dnl Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-dnl Check that strcasestr is present.
+dnl Check that strcasestr is present and works.
 AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
 [
   dnl Persuade glibc <string.h> to declare strcasestr().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_MEMCHR])
   AC_REPLACE_FUNCS([strcasestr])
   if test $ac_cv_func_strcasestr = no; then
     HAVE_STRCASESTR=0
     gl_PREREQ_STRCASESTR
+  elif test "$gl_cv_func_memchr_works" != yes; then
+    REPLACE_STRCASESTR=1
+    AC_LIBOBJ([strcasestr])
+    gl_PREREQ_STRCASESTR
   fi
 ]) # gl_FUNC_STRCASESTR_SIMPLE
 
index f48bebb6dd143cec4d890caa28bb05b0d2d5fa0f..c8beb9c88f419a4fddd715823697ba836c8a373e 100644 (file)
@@ -1,13 +1,24 @@
-# strstr.m4 serial 5
-dnl Copyright (C) 2008 Free Software Foundation, Inc.
+# strstr.m4 serial 6
+dnl Copyright (C) 2008, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-dnl Check that strstr is efficient.
-AC_DEFUN([gl_FUNC_STRSTR],
+dnl Check that strstr works.
+AC_DEFUN([gl_FUNC_STRSTR_SIMPLE],
 [
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_MEMCHR])
+  if test "$gl_cv_func_memchr_works" != yes; then
+    REPLACE_STRSTR=1
+    AC_LIBOBJ([strstr])
+  fi
+]) # gl_FUNC_STRSTR_SIMPLE
+
+dnl Additionally, check that strstr is efficient.
+AC_DEFUN([gl_FUNC_STRSTR],
+[
+  AC_REQUIRE([gl_FUNC_STRSTR_SIMPLE])
   AC_CACHE_CHECK([whether strstr works in linear time],
     [gl_cv_func_strstr_linear],
     [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
index 8217ff831eb1dadb1c5c14d73d42dc0941f12c06..7ef73d5f5468ded4f9f19784164aaa04cc85c481 100644 (file)
@@ -12,6 +12,7 @@ mempcpy
 stpcpy
 strndup
 strnlen
+strstr
 
 configure.ac:
 gl_FUNC_ARGZ
index fd2735ab8ee2bc8a43af10a89f70d4576a6d09f7..115853a0242edc3e1ce01c25b0b047e351db59f0 100644 (file)
@@ -10,6 +10,7 @@ lib/unictype/3levelbit.h
 Depends-on:
 memcmp
 strdup
+strstr-simple
 
 configure.ac:
 
index 526022ca5a346b3dd35f956de660c7e7dda837e3..65af9c1edcc3d774396bbd71708d0fa8eddbbbf3 100644 (file)
@@ -11,6 +11,7 @@ m4/mountlist.m4
 Depends-on:
 stdbool
 stdint
+strstr-simple
 xalloc
 
 configure.ac:
index 251b2d76eb97f69418be986b8aa761553cce248f..dc33bd2952206aee1ba9420a690cece40f6a336a 100644 (file)
@@ -2,19 +2,12 @@ Description:
 strstr() function: efficiently locate first substring in a buffer.
 
 Files:
-lib/str-two-way.h
-lib/strstr.c
-m4/strstr.m4
 
 Depends-on:
-string
-stdbool
-memchr
-memcmp
+strstr-simple
 
 configure.ac:
 gl_FUNC_STRSTR
-gl_STRING_MODULE_INDICATOR([strstr])
 
 Makefile.am:
 
diff --git a/modules/strstr-simple b/modules/strstr-simple
new file mode 100644 (file)
index 0000000..9ebf5da
--- /dev/null
@@ -0,0 +1,28 @@
+Description:
+strstr() function: locate first substring in a buffer.
+
+Files:
+lib/str-two-way.h
+lib/strstr.c
+m4/strstr.m4
+
+Depends-on:
+string
+stdbool
+memchr
+memcmp
+
+configure.ac:
+gl_FUNC_STRSTR_SIMPLE
+gl_STRING_MODULE_INDICATOR([strstr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, Eric Blake