From 590adc0cc7dd1927d83f9368984ab77c1aab4a1e Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Fri, 11 Apr 2014 13:37:11 +0200 Subject: [PATCH] Fix comment, and add a runtime warning when stack overflow protection is known to be broken. Also set default value to 0 for contexts/guard_size in this case. --- src/simgrid/sg_config.c | 4 ++++ src/simix/smx_context.c | 22 ++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index ef2a7bbeb0..bd6c7e2ef1 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -696,7 +696,11 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "contexts/guard_size", "Guard size for contexts stacks in memory pages", xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_guard_size, NULL); +#if defined(_XBT_WIN32) || (PTH_STACKGROWTH != -1) + xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 0); +#else xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 1); +#endif /* No, it was not set yet (the above setdefault() changed this to 1). */ smx_context_guard_size_was_set = 0; diff --git a/src/simix/smx_context.c b/src/simix/smx_context.c index b0d7af6661..f222f62f28 100644 --- a/src/simix/smx_context.c +++ b/src/simix/smx_context.c @@ -124,11 +124,21 @@ void *SIMIX_context_stack_new(void) { void *stack; - /* FIXME: current code for stack protection assumes that stacks are growing - * downward (PTH_STACKGROWTH == -1). Protected pages need to be but after the - * stack when PTH_STACKGROWTH == 1. */ + /* FIXME: current code for stack overflow protection assumes that stacks are + * growing downward (PTH_STACKGROWTH == -1). Protected pages need to be put + * after the stack when PTH_STACKGROWTH == 1. */ if (smx_context_guard_size > 0 && !MC_is_active()) { + +#if defined(_XBT_WIN32) || (PTH_STACKGROWTH != -1) + static int warned_once = 0; + if (!warned_once) { + XBT_WARN("Stack overflow protection is known to be broken on your system. Either you're on Windows or PTH_STACKGROWTH != -1 (current value is %d).", + PTH_STACKGROWTH); + warned_once = 1; + } +#endif + size_t size = smx_context_stack_size + smx_context_guard_size; #ifdef HAVE_MC /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the @@ -136,14 +146,14 @@ void *SIMIX_context_stack_new(void) char *alloc = xbt_malloc0(size + xbt_pagesize); stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize; *((void **)stack - 1) = alloc; -#elif !defined(WIN32) +#elif !defined(_XBT_WIN32) if (posix_memalign(&stack, xbt_pagesize, size) != 0) xbt_die("Failed to allocate stack."); #else - stack = _aligned_malloc(size, xbt_pagesize); + stack = _aligned_malloc(size, xbt_pagesize); #endif -#ifndef WIN32 +#ifndef _XBT_WIN32 if (mprotect(stack, smx_context_guard_size, PROT_NONE) == -1) { XBT_WARN("Failed to protect stack: %s", strerror(errno)); /* That's not fatal, pursue anyway. */ -- 2.20.1