aboutsummaryrefslogtreecommitdiffstats
path: root/m4/strnlen.m4
blob: 764a84dc4978f52387856179bee01cd3bcd604ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# strnlen.m4
# serial 15
dnl Copyright (C) 2002-2003, 2005-2007, 2009-2026 Free Software
dnl 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 This file is offered as-is, without any warranty.

m4_version_prereq([2.73], [], [
# Replace AC_FUNC_STRNLEN from Autoconf 2.72 and earlier,
# which does not check for Android strnlen bugs.

AC_DEFUN([AC_FUNC_STRNLEN],
[AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])dnl
AC_CACHE_CHECK([for working strnlen], [ac_cv_func_strnlen_working],
[AC_RUN_IFELSE(
   [AC_LANG_PROGRAM(
      [AC_INCLUDES_DEFAULT
       [/* Use pstrnlen to test; 'volatile' prevents the compiler
           from optimizing the strnlen calls away.  */
        size_t (*volatile pstrnlen) (char const *, size_t) = strnlen;
        char const s[] = "foobar";
        int s_len = sizeof s - 1;
       ]],
      [[
        /* AIX 4.3 is buggy: strnlen (S, 1) == 3.  */
        int i;
        for (i = 0; i < s_len + 1; ++i)
          {
            int expected = i <= s_len ? i : s_len;
            if (pstrnlen (s, i) != expected)
              return 1;
          }

        /* Android 5.0 (API 21) strnlen ("", SIZE_MAX) incorrectly crashes.  */
        if (pstrnlen ("", -1) != 0)
          return 1;]])],
   [ac_cv_func_strnlen_working=yes],
   [ac_cv_func_strnlen_working=no],
   [AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
         [[#if defined _AIX && !defined _AIX51
            #error "AIX pre 5.1 is buggy"
           #endif
           #ifdef __ANDROID__
            #include <android/api-level.h>
            #if __ANDROID_API__ < 22
             #error "Android API < 22 is buggy"
            #endif
           #endif
         ]])],
      [ac_cv_func_strnlen_working=yes],
      [ac_cv_func_strnlen_working=no])])])
test $ac_cv_func_strnlen_working = no && AC_LIBOBJ([strnlen])
])# AC_FUNC_STRNLEN
])

AC_DEFUN([gl_FUNC_STRNLEN],
[
  AC_REQUIRE([gl_STRING_H_DEFAULTS])

  dnl Persuade glibc <string.h> to declare strnlen().
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])

  AC_CHECK_DECLS_ONCE([strnlen])
  if test $ac_cv_have_decl_strnlen = no; then
    HAVE_DECL_STRNLEN=0
  else
    m4_pushdef([AC_LIBOBJ], [:])
    dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]).
    AC_FUNC_STRNLEN
    m4_popdef([AC_LIBOBJ])
    if test $ac_cv_func_strnlen_working = no; then
      REPLACE_STRNLEN=1
    fi
  fi
])

# Prerequisites of lib/strnlen.c.
AC_DEFUN([gl_PREREQ_STRNLEN], [:])