diff options
author | nagachika <nagachika@ruby-lang.org> | 2021-09-11 13:59:43 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2021-09-11 13:59:43 +0900 |
commit | 13f64b65e0476c2fe416a29274fcc91e3c0cf5d3 (patch) | |
tree | d867b4b485adb9ea441ea4b9e681719f93d24b24 | |
parent | 8e4ed4ed00e8346029953c14dd414a996e37a437 (diff) |
merge revision(s) f336a3eb6c76890f3d8f878725b3d328c8fdcf33: [Backport #18126]
Use free instead of xfree to free altstack
The altstack memory of a thread may be free'ed even after the VM is
destructed. After that, GC is no longer available, so calling xfree
may lead to a segfault.
This changeset uses the bare free function to free the altstack memory
instead of xfree. [Bug #18126]
---
signal.c | 5 ++++-
vm_core.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
-rw-r--r-- | signal.c | 5 | ||||
-rw-r--r-- | version.h | 2 | ||||
-rw-r--r-- | vm_core.h | 2 |
3 files changed, 6 insertions, 3 deletions
@@ -557,10 +557,13 @@ static int rb_sigaltstack_size_value = 0; void * rb_allocate_sigaltstack(void) { + void *altstack; if (!rb_sigaltstack_size_value) { rb_sigaltstack_size_value = rb_sigaltstack_size(); } - return xmalloc(rb_sigaltstack_size_value); + altstack = malloc(rb_sigaltstack_size_value); + if (!altstack) rb_memerror(); + return altstack; } /* alternate stack for SIGSEGV */ @@ -12,7 +12,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 3 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 131 +#define RUBY_PATCHLEVEL 132 #define RUBY_RELEASE_YEAR 2021 #define RUBY_RELEASE_MONTH 9 @@ -136,7 +136,7 @@ void *rb_allocate_sigaltstack(void); void *rb_register_sigaltstack(void *); # define RB_ALTSTACK_INIT(var, altstack) var = rb_register_sigaltstack(altstack) -# define RB_ALTSTACK_FREE(var) xfree(var) +# define RB_ALTSTACK_FREE(var) free(var) # define RB_ALTSTACK(var) var #else /* noop */ # define RB_ALTSTACK_INIT(var, altstack) |