From 5dcf1a777b3edf1290d7285ca2ac8792a6403891 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 21 Jul 2014 13:33:01 +0200 Subject: [PATCH] Fix stack rlimit problem fixes #6450 --- lib/base/application.cpp | 57 ++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index e62a1a6e1..0d47989a7 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -182,37 +182,42 @@ void Application::SetResourceLimits(void) } } - if (set_stack_rlimit) { - rl.rlim_cur = 1024 * 1024; - rl.rlim_max = rl.rlim_cur; + if (getrlimit(RLIMIT_STACK, &rl) < 0) { + Log(LogWarning, "Application", "Could not determine resource limit for stack size (RLIMIT_STACK)"); + rl.rlim_max = RLIM_INFINITY; + } - if (setrlimit(RLIMIT_STACK, &rl) < 0) - Log(LogNotice, "Application", "Could not adjust resource limit for stack size (RLIMIT_STACK)"); - else { - char **new_argv = static_cast(malloc(sizeof(char *) * (argc + 2))); + if (set_stack_rlimit) + rl.rlim_cur = 256 * 1024; + else + rl.rlim_cur = rl.rlim_max; - if (!new_argv) { - perror("malloc"); - exit(1); - } - - for (int i = 0; i < argc; i++) - new_argv[i] = argv[i]; - - new_argv[argc] = strdup("--no-stack-rlimit"); - - if (!new_argv[argc]) { - perror("strdup"); - exit(1); - } - - new_argv[argc + 1] = NULL; - - if (execvp(new_argv[0], new_argv) < 0) - perror("execvp"); + if (setrlimit(RLIMIT_STACK, &rl) < 0) + Log(LogNotice, "Application", "Could not adjust resource limit for stack size (RLIMIT_STACK)"); + else if (set_stack_rlimit) { + char **new_argv = static_cast(malloc(sizeof(char *) * (argc + 2))); + if (!new_argv) { + perror("malloc"); exit(1); } + + for (int i = 0; i < argc; i++) + new_argv[i] = argv[i]; + + new_argv[argc] = strdup("--no-stack-rlimit"); + + if (!new_argv[argc]) { + perror("strdup"); + exit(1); + } + + new_argv[argc + 1] = NULL; + + if (execvp(new_argv[0], new_argv) < 0) + perror("execvp"); + + exit(1); } # else /* RLIMIT_STACK */ Log(LogNotice, "Application", "System does not support adjusting the resource limit for stack size (RLIMIT_STACK)");