summaryrefslogtreecommitdiff
path: root/m4/c-stack.m4
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-02-19 08:39:55 +0000
committerJim Meyering <jim@meyering.net>2003-02-19 08:39:55 +0000
commit3ef0832f7a8cb8fe2ab688c09f740f6564ae9617 (patch)
tree7d37e655df230a40bfaca3480b2a6dd09fbacbbb /m4/c-stack.m4
parent3ac28e3deef78ba6b90fe74be11ba28e8a37f877 (diff)
downloadcoreutils-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.m416
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");
}