X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=m4%2Fc-stack.m4;h=e8917e6ad6872001b9581e4d35a18a614ea9763d;hb=21492d6c3ca00ff0827528640804732f2ed66470;hp=1272dadb74ab77eda28b25a79f858e4c144c3450;hpb=441aa3044f43e5572f58c354f01e6bc070acd5c7;p=gnulib.git diff --git a/m4/c-stack.m4 b/m4/c-stack.m4 index 1272dadb7..e8917e6ad 100644 --- a/m4/c-stack.m4 +++ b/m4/c-stack.m4 @@ -1,17 +1,16 @@ # Check prerequisites for compiling lib/c-stack.c. -# Copyright (C) 2002, 2003, 2004, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 2002-2004, 2008-2011 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert. -# serial 10 +# serial 14 AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], - [# for STACK_DIRECTION - AC_REQUIRE([AC_FUNC_ALLOCA]) + [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([setrlimit]) AC_CHECK_HEADERS_ONCE([ucontext.h]) @@ -20,7 +19,7 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], dnl is accessed, or when the stack overflows. dnl Either { SIGSEGV } or { SIGSEGV, SIGBUS }. case "$host_os" in - sunos4* | freebsd* | dragonfly* | openbsd* | netbsd* | kfreebsd* | knetbsd*) # BSD systems + sunos4* | freebsd* | dragonfly* | openbsd* | mirbsd* | netbsd* | kfreebsd* | knetbsd*) # BSD systems FAULT_YIELDS_SIGBUS=1 ;; hpux*) # HP-UX FAULT_YIELDS_SIGBUS=1 ;; @@ -76,16 +75,18 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], st.ss_size = SIGSTKSZ; r = sigaltstack (&st, 0); if (r != 0) - return r; + return 1; sigemptyset (&act.sa_mask); act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND; act.sa_handler = segv_handler; #if FAULT_YIELDS_SIGBUS if (sigaction (SIGBUS, &act, 0) < 0) - return -1; + return 2; #endif - return sigaction (SIGSEGV, &act, 0); + if (sigaction (SIGSEGV, &act, 0) < 0) + return 3; + return 0; } static volatile int * recurse_1 (volatile int n, volatile int *p) @@ -103,6 +104,7 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], int main () { + int result; #if HAVE_SETRLIMIT && defined RLIMIT_STACK /* Before starting the endless recursion, try to be friendly to the user's machine. On some Linux 2.2.x systems, there @@ -113,7 +115,10 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], setrlimit (RLIMIT_STACK, &rl); #endif - return c_stack_action () || recurse (0); + result = c_stack_action (); + if (result != 0) + return result; + return recurse (0); } ]])], [ac_cv_sys_stack_overflow_works=yes], @@ -176,7 +181,7 @@ int main () exit(3); /* Provoke a SIGSEGV. */ raise (SIGSEGV); - exit (3); + exit (4); }]])], [gl_cv_sigaltstack_low_base=yes], [gl_cv_sigaltstack_low_base=no], @@ -244,9 +249,9 @@ int main () s += page_size; if (s < stack_size + page_size) _exit (0); + _exit (4); } - - _exit (1); + _exit (5); } static int @@ -262,16 +267,18 @@ int main () st.ss_size = SIGSTKSZ; r = sigaltstack (&st, 0); if (r != 0) - return r; + return 1; sigemptyset (&act.sa_mask); act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; act.sa_sigaction = segv_handler; #if FAULT_YIELDS_SIGBUS if (sigaction (SIGBUS, &act, 0) < 0) - return -1; + return 2; #endif - return sigaction (SIGSEGV, &act, 0); + if (sigaction (SIGSEGV, &act, 0) < 0) + return 3; + return 0; } static volatile int * recurse_1 (volatile int n, volatile int *p) @@ -289,6 +296,7 @@ int main () int main () { + int result; #if HAVE_SETRLIMIT && defined RLIMIT_STACK /* Before starting the endless recursion, try to be friendly to the user's machine. On some Linux 2.2.x systems, there @@ -299,7 +307,10 @@ int main () setrlimit (RLIMIT_STACK, &rl); #endif - return c_stack_action () || recurse (0); + result = c_stack_action (); + if (result != 0) + return result; + return recurse (0); } ]])], [ac_cv_sys_xsi_stack_overflow_heuristic=yes], @@ -327,7 +338,7 @@ AC_DEFUN([gl_PREREQ_C_STACK], AC_REQUIRE([AC_FUNC_ALLOCA]) AC_CHECK_FUNCS_ONCE([sigaltstack]) - AC_CHECK_DECLS([sigaltstack], , , [#include ]) + AC_CHECK_DECLS([sigaltstack], , , [[#include ]]) AC_CHECK_HEADERS_ONCE([unistd.h ucontext.h])