From 0256e4f0f5e10f0a15cbba2cd64e252dfa864e4a Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 6 Mar 2020 21:32:42 +0900 Subject: thread_pthread.c: allocate sigaltstack before pthread_create A new (not-initialized-yet) pthread attempts to allocate sigaltstack by using xmalloc. It may cause GC, but because the thread is not initialized yet, ruby_native_thread_p() returns false, which leads to "[FATAL] failed to allocate memory" and exit. In fact, we can observe the error message in the log of OpenBSD CI: https://rubyci.org/logs/rubyci.s3.amazonaws.com/openbsd-current/ruby-master/log/20200306T083005Z.log.html.gz This changeset allocates sigaltstack before pthread is created. --- vm_core.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'vm_core.h') diff --git a/vm_core.h b/vm_core.h index d84e05d99b..754ce981e6 100644 --- a/vm_core.h +++ b/vm_core.h @@ -141,12 +141,13 @@ #if defined(SIGSEGV) && defined(HAVE_SIGALTSTACK) && defined(SA_SIGINFO) && !defined(__NetBSD__) # define USE_SIGALTSTACK -void *rb_register_sigaltstack(void); -# define RB_ALTSTACK_INIT(var) var = rb_register_sigaltstack() +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(var) var #else /* noop */ -# define RB_ALTSTACK_INIT(var) +# define RB_ALTSTACK_INIT(var, altstack) # define RB_ALTSTACK_FREE(var) # define RB_ALTSTACK(var) (0) #endif @@ -974,6 +975,10 @@ typedef struct rb_thread_struct { /* misc */ VALUE name; +#ifdef USE_SIGALTSTACK + void *altstack; +#endif + } rb_thread_t; typedef enum { -- cgit v1.2.3