From 370e1969d82f57d117e388f89b6ebd4474d74a5a Mon Sep 17 00:00:00 2001 From: Marius Gerbershagen Date: Thu, 11 Jun 2020 15:07:52 +0200 Subject: [PATCH] stacks: introduce sensible behaviour if getrlimit fails If getrlimit fails, new_size may be zero. Furthermore, getrlimit may also return RLIM_INFINITY in which case new_size is way to large. In both cases the real stack size is unknown and we can only use some sensible default. --- src/c/stacks.d | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/c/stacks.d b/src/c/stacks.d index 217dfb4bd..c0125ed2b 100644 --- a/src/c/stacks.d +++ b/src/c/stacks.d @@ -40,13 +40,22 @@ cs_set_size(cl_env_ptr env, cl_index new_size) if (setrlimit(RLIMIT_STACK, &rl)) ecl_internal_error("Can't set the size of the C stack"); } - new_size = rl.rlim_cur; -#ifdef ECL_DOWN_STACK - env->cs_barrier = env->cs_org - new_size; -#else - env->cs_barrier = env->cs_org + new_size; -#endif + } else { + rl.rlim_cur = new_size; } + if (rl.rlim_cur == 0 || rl.rlim_cur == RLIM_INFINITY || rl.rlim_cur > (cl_index)(-1)) { + /* Either getrlimit failed or returned nonsense, either way we + * don't know the stack size. Use a default of 1 MB and hope for + * the best. */ + new_size = 1048576; + } else { + new_size = rl.rlim_cur; + } +#ifdef ECL_DOWN_STACK + env->cs_barrier = env->cs_org - new_size; +#else + env->cs_barrier = env->cs_org + new_size; +#endif } #endif env->cs_limit_size = new_size - (2*margin); @@ -64,7 +73,7 @@ cs_set_size(cl_env_ptr env, cl_index new_size) } #endif else - ecl_internal_error("Can't set the size of the C stack"); + ecl_internal_error("Can't set the size of the C stack: sanity check failed"); env->cs_size = new_size; }