diff options
Diffstat (limited to 'gl/m4/memchr.m4')
-rw-r--r-- | gl/m4/memchr.m4 | 74 |
1 files changed, 46 insertions, 28 deletions
diff --git a/gl/m4/memchr.m4 b/gl/m4/memchr.m4 index 2d8abe75..4f1aed01 100644 --- a/gl/m4/memchr.m4 +++ b/gl/m4/memchr.m4 | |||
@@ -1,35 +1,30 @@ | |||
1 | # memchr.m4 serial 12 | 1 | # memchr.m4 serial 18 |
2 | dnl Copyright (C) 2002-2004, 2009-2013 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2004, 2009-2023 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl with or without modifications, as long as this notice is preserved. |
6 | 6 | ||
7 | AC_DEFUN_ONCE([gl_FUNC_MEMCHR], | 7 | AC_DEFUN_ONCE([gl_FUNC_MEMCHR], |
8 | [ | 8 | [ |
9 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | ||
10 | |||
9 | dnl Check for prerequisites for memory fence checks. | 11 | dnl Check for prerequisites for memory fence checks. |
10 | gl_FUNC_MMAP_ANON | 12 | gl_FUNC_MMAP_ANON |
11 | AC_CHECK_HEADERS_ONCE([sys/mman.h]) | 13 | AC_CHECK_HEADERS_ONCE([sys/mman.h]) |
12 | AC_CHECK_FUNCS_ONCE([mprotect]) | 14 | AC_CHECK_FUNCS_ONCE([mprotect]) |
13 | 15 | ||
14 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | 16 | AC_REQUIRE([gl_STRING_H_DEFAULTS]) |
15 | m4_ifdef([gl_FUNC_MEMCHR_OBSOLETE], [ | 17 | # Detect platform-specific bugs in some versions of glibc: |
16 | dnl These days, we assume memchr is present. But if support for old | 18 | # memchr should not dereference anything with length 0 |
17 | dnl platforms is desired: | 19 | # https://bugzilla.redhat.com/show_bug.cgi?id=499689 |
18 | AC_CHECK_FUNCS_ONCE([memchr]) | 20 | # memchr should not dereference overestimated length after a match |
19 | if test $ac_cv_func_memchr = no; then | 21 | # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 |
20 | HAVE_MEMCHR=0 | 22 | # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 |
21 | fi | 23 | # memchr should cast the second argument to 'unsigned char'. |
22 | ]) | 24 | # This bug exists in Android 4.3. |
23 | if test $HAVE_MEMCHR = 1; then | 25 | # Assume that memchr works on platforms that lack mprotect. |
24 | # Detect platform-specific bugs in some versions of glibc: | 26 | AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], |
25 | # memchr should not dereference anything with length 0 | 27 | [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ |
26 | # http://bugzilla.redhat.com/499689 | ||
27 | # memchr should not dereference overestimated length after a match | ||
28 | # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 | ||
29 | # http://sourceware.org/bugzilla/show_bug.cgi?id=10162 | ||
30 | # Assume that memchr works on platforms that lack mprotect. | ||
31 | AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], | ||
32 | [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ | ||
33 | #include <string.h> | 28 | #include <string.h> |
34 | #if HAVE_SYS_MMAN_H | 29 | #if HAVE_SYS_MMAN_H |
35 | # include <fcntl.h> | 30 | # include <fcntl.h> |
@@ -64,6 +59,7 @@ AC_DEFUN_ONCE([gl_FUNC_MEMCHR], | |||
64 | #endif | 59 | #endif |
65 | if (fence) | 60 | if (fence) |
66 | { | 61 | { |
62 | /* Test against bugs on glibc systems. */ | ||
67 | if (memchr (fence, 0, 0)) | 63 | if (memchr (fence, 0, 0)) |
68 | result |= 1; | 64 | result |= 1; |
69 | strcpy (fence - 9, "12345678"); | 65 | strcpy (fence - 9, "12345678"); |
@@ -71,15 +67,37 @@ AC_DEFUN_ONCE([gl_FUNC_MEMCHR], | |||
71 | result |= 2; | 67 | result |= 2; |
72 | if (memchr (fence - 1, 0, 3) != fence - 1) | 68 | if (memchr (fence - 1, 0, 3) != fence - 1) |
73 | result |= 4; | 69 | result |= 4; |
70 | /* Test against bug on AIX 7.2. */ | ||
71 | if (memchr (fence - 4, '6', 16) != fence - 4) | ||
72 | result |= 8; | ||
74 | } | 73 | } |
74 | /* Test against bug on Android 4.3. */ | ||
75 | { | ||
76 | char input[3]; | ||
77 | input[0] = 'a'; | ||
78 | input[1] = 'b'; | ||
79 | input[2] = 'c'; | ||
80 | if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) | ||
81 | result |= 16; | ||
82 | } | ||
75 | return result; | 83 | return result; |
76 | ]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no], | 84 | ]])], |
77 | [dnl Be pessimistic for now. | 85 | [gl_cv_func_memchr_works=yes], |
78 | gl_cv_func_memchr_works="guessing no"])]) | 86 | [gl_cv_func_memchr_works=no], |
79 | if test "$gl_cv_func_memchr_works" != yes; then | 87 | [case "$host_os" in |
80 | REPLACE_MEMCHR=1 | 88 | # Guess no on Android. |
81 | fi | 89 | linux*-android*) gl_cv_func_memchr_works="guessing no" ;; |
82 | fi | 90 | # Guess yes on native Windows. |
91 | mingw*) gl_cv_func_memchr_works="guessing yes" ;; | ||
92 | # If we don't know, obey --enable-cross-guesses. | ||
93 | *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; | ||
94 | esac | ||
95 | ]) | ||
96 | ]) | ||
97 | case "$gl_cv_func_memchr_works" in | ||
98 | *yes) ;; | ||
99 | *) REPLACE_MEMCHR=1 ;; | ||
100 | esac | ||
83 | ]) | 101 | ]) |
84 | 102 | ||
85 | # Prerequisites of lib/memchr.c. | 103 | # Prerequisites of lib/memchr.c. |