From 3d32350be0eb2a477fc179722798bc11ecf8df0d Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Fri, 11 Oct 2013 20:32:36 +0900 Subject: [PATCH] mcexec: add use of MCKERNEL_RLIMIT_STACK MCKERNEL_RLIMIT_STACK is a environment variable which specify RLIMIT_STACK value on McKernel. syntax: MCKERNEL_RLIMIT_STACK=, example: MCKERNEL_RLIMIT_STACK=0x800000,-1 cur=8MiB, max=unlimited --- executer/user/mcexec.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index a9cbd3af..5c85178c 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -82,6 +82,7 @@ int main_loop(int fd, int cpu, pthread_mutex_t *lock); static int fd; static char *altroot; +static const char rlimit_stack_envname[] = "MCKERNEL_RLIMIT_STACK"; struct program_load_desc *load_elf(FILE *fp, char **interp_pathp) { @@ -493,6 +494,9 @@ int main(int argc, char **argv) char *path; int error; struct rlimit rlim_stack; + int n; + unsigned long lcur; + unsigned long lmax; #ifdef USE_SYSCALL_MOD_CALL __glob_argc = argc; @@ -570,6 +574,23 @@ int main(int argc, char **argv) desc->args = args; //print_flat(args); + p = getenv(rlimit_stack_envname); + if (p) { + n = sscanf(p, "%lx,%lx", &lcur, &lmax); + if (n != 2) { + fprintf(stderr, "Error: Failed to parse %s\n", + rlimit_stack_envname); + return 1; + } + if (lmax > rlim_stack.rlim_max) { + lmax = rlim_stack.rlim_max; + } + if (lcur > lmax) { + lcur = lmax; + } + rlim_stack.rlim_cur = lcur; + rlim_stack.rlim_max = lmax; + } desc->rlimit_stack_cur = rlim_stack.rlim_cur; desc->rlimit_stack_max = rlim_stack.rlim_max;