diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-17 00:10:45 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-17 00:10:45 +0000 |
commit | b0d36494797b08d7cc7a9c62c2c1a748297a7aaf (patch) | |
tree | afc93dda1de472462594790b2589f71c1dd3846d /gc.c | |
parent | d2b68234debc54644d5ff1a3f706e54798cac42d (diff) |
gc.c: PREVENT_STACK_OVERFLOW
* gc.c (PREVENT_STACK_OVERFLOW): define TRUE to try preventing
stack overflow before actually happens.
* gc.c (stack_check): parameterize thread pointer.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58374 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -3937,12 +3937,18 @@ ruby_stack_length(VALUE **p) return STACK_LENGTH; } +#ifndef PREVENT_STACK_OVERFLOW #if !(defined(POSIX_SIGNAL) && defined(SIGSEGV) && defined(HAVE_SIGALTSTACK)) +# define PREVENT_STACK_OVERFLOW 1 +#else +# define PREVENT_STACK_OVERFLOW 0 +#endif +#endif +#if PREVENT_STACK_OVERFLOW static int -stack_check(int water_mark) +stack_check(rb_thread_t *th, int water_mark) { int ret; - rb_thread_t *th = GET_THREAD(); SET_STACK_END; ret = STACK_LENGTH > STACK_LEVEL_MAX - water_mark; #ifdef __ia64 @@ -3953,6 +3959,8 @@ stack_check(int water_mark) #endif return ret; } +#else +#define stack_check(th, water_mark) FALSE #endif #define STACKFRAME_FOR_CALL_CFUNC 512 @@ -3960,11 +3968,7 @@ stack_check(int water_mark) int ruby_stack_check(void) { -#if defined(POSIX_SIGNAL) && defined(SIGSEGV) && defined(HAVE_SIGALTSTACK) - return 0; -#else - return stack_check(STACKFRAME_FOR_CALL_CFUNC); -#endif + return stack_check(GET_THREAD(), STACKFRAME_FOR_CALL_CFUNC); } ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS |