diff options
author | Jim Meyering <jim@meyering.net> | 2003-02-19 08:39:55 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-02-19 08:39:55 +0000 |
commit | 3ef0832f7a8cb8fe2ab688c09f740f6564ae9617 (patch) | |
tree | 7d37e655df230a40bfaca3480b2a6dd09fbacbbb /m4/c-stack.m4 | |
parent | 3ac28e3deef78ba6b90fe74be11ba28e8a37f877 (diff) | |
download | coreutils-3ef0832f7a8cb8fe2ab688c09f740f6564ae9617.tar.xz |
(AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Limit stack size
to 1MB, so as not to render systems with no stack size limit (e.g.,
linux-2.2.x) unusable. Suggestion and code from Bruno Haible.
Diffstat (limited to 'm4/c-stack.m4')
-rw-r--r-- | m4/c-stack.m4 | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/m4/c-stack.m4 b/m4/c-stack.m4 index a58cde009..666a8ee06 100644 --- a/m4/c-stack.m4 +++ b/m4/c-stack.m4 @@ -22,6 +22,7 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], [# for STACK_DIRECTION AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_CHECK_FUNCS(setrlimit) AC_CACHE_CHECK([for working C stack overflow detection], ac_cv_sys_xsi_stack_overflow_heuristic, @@ -30,6 +31,11 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], #include <unistd.h> #include <signal.h> #include <ucontext.h> + #if HAVE_SETRLIMIT + # include <sys/types.h> + # include <sys/time.h> + # include <sys/resource.h> + #endif static union { @@ -102,6 +108,16 @@ AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], int main (void) { + #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 + is no stack limit for user processes at all. We don't want + to kill such systems. */ + struct rlimit rl; + rl.rlim_cur = rl.rlim_max = 0x100000; /* 1 MB */ + setrlimit (RLIMIT_STACK, &rl); + #endif + c_stack_action (); return recurse ("\1"); } |