~ubuntu-branches/ubuntu/utopic/gettext/utopic

« back to all changes in this revision

Viewing changes to gettext-runtime/gnulib-m4/memchr.m4

  • Committer: Colin Watson
  • Date: 2010-08-01 21:36:08 UTC
  • mfrom: (2.1.10 sid)
  • Revision ID: cjwatson@canonical.com-20100801213608-yy7vkm8lpatep3ci
merge from Debian 0.18.1.1-1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# memchr.m4 serial 4
2
 
dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
 
1
# memchr.m4 serial 8
 
2
dnl Copyright (C) 2002-2004, 2009-2010 Free Software Foundation, Inc.
3
3
dnl This file is free software; the Free Software Foundation
4
4
dnl gives unlimited permission to copy and/or distribute it,
5
5
dnl with or without modifications, as long as this notice is preserved.
6
6
 
7
 
AC_DEFUN([gl_FUNC_MEMCHR],
 
7
AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
8
8
[
9
 
  AC_REPLACE_FUNCS(memchr)
10
 
  if test $ac_cv_func_memchr = no; then
 
9
  dnl Check for prerequisites for memory fence checks.
 
10
  gl_FUNC_MMAP_ANON
 
11
  AC_CHECK_HEADERS_ONCE([sys/mman.h])
 
12
  AC_CHECK_FUNCS_ONCE([mprotect])
 
13
 
 
14
  dnl These days, we assume memchr is present.  But just in case...
 
15
  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
 
16
  AC_CHECK_FUNCS_ONCE([memchr])
 
17
  if test $ac_cv_func_memchr = yes; then
 
18
    # Detect platform-specific bugs in some versions of glibc:
 
19
    # memchr should not dereference anything with length 0
 
20
    #   http://bugzilla.redhat.com/499689
 
21
    # memchr should not dereference overestimated length after a match
 
22
    #   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
 
23
    #   http://sourceware.org/bugzilla/show_bug.cgi?id=10162
 
24
    # Assume that memchr works on platforms that lack mprotect.
 
25
    AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
 
26
      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 
27
#include <string.h>
 
28
#if HAVE_SYS_MMAN_H
 
29
# include <fcntl.h>
 
30
# include <unistd.h>
 
31
# include <sys/types.h>
 
32
# include <sys/mman.h>
 
33
# ifndef MAP_FILE
 
34
#  define MAP_FILE 0
 
35
# endif
 
36
#endif
 
37
]], [[
 
38
  char *fence = NULL;
 
39
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
 
40
# if HAVE_MAP_ANONYMOUS
 
41
  const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
 
42
  const int fd = -1;
 
43
# else /* !HAVE_MAP_ANONYMOUS */
 
44
  const int flags = MAP_FILE | MAP_PRIVATE;
 
45
  int fd = open ("/dev/zero", O_RDONLY, 0666);
 
46
  if (fd >= 0)
 
47
# endif
 
48
    {
 
49
      int pagesize = getpagesize ();
 
50
      char *two_pages =
 
51
        (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
 
52
                       flags, fd, 0);
 
53
      if (two_pages != (char *)(-1)
 
54
          && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
 
55
        fence = two_pages + pagesize;
 
56
    }
 
57
#endif
 
58
  if (fence)
 
59
    {
 
60
      if (memchr (fence, 0, 0))
 
61
        return 1;
 
62
      strcpy (fence - 9, "12345678");
 
63
      if (memchr (fence - 9, 0, 79) != fence - 1)
 
64
        return 2;
 
65
    }
 
66
  return 0;
 
67
]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no],
 
68
      [dnl Be pessimistic for now.
 
69
       gl_cv_func_memchr_works="guessing no"])])
 
70
    if test "$gl_cv_func_memchr_works" != yes; then
 
71
      REPLACE_MEMCHR=1
 
72
    fi
 
73
  else
 
74
    HAVE_MEMCHR=0
 
75
  fi
 
76
  if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
 
77
    AC_LIBOBJ([memchr])
11
78
    gl_PREREQ_MEMCHR
12
79
  fi
13
80
])
14
81
 
15
82
# Prerequisites of lib/memchr.c.
16
83
AC_DEFUN([gl_PREREQ_MEMCHR], [
17
 
  AC_CHECK_HEADERS(bp-sym.h)
 
84
  AC_CHECK_HEADERS([bp-sym.h])
18
85
])