ruby-changes:27302
From: kosaki <ko1@a...>
Date: Thu, 21 Feb 2013 14:18:48 +0900 (JST)
Subject: [ruby-changes:27302] kosaki:r39354 (trunk): * signal.c (sigsegv): avoid to use async signal unsafe functions
kosaki 2013-02-21 14:18:38 +0900 (Thu, 21 Feb 2013) New Revision: 39354 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39354 Log: * signal.c (sigsegv): avoid to use async signal unsafe functions when nested sigsegv is happen. [Bug #5014] [ruby-dev:44082] Modified files: trunk/ChangeLog trunk/signal.c Index: ChangeLog =================================================================== --- ChangeLog (revision 39353) +++ ChangeLog (revision 39354) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Thu Feb 21 14:14:13 2013 KOSAKI Motohiro <kosaki.motohiro@g...> + + * signal.c (sigsegv): avoid to use async signal unsafe functions + when nested sigsegv is happen. + [Bug #5014] [ruby-dev:44082] + Thu Feb 21 13:47:59 2013 KOSAKI Motohiro <kosaki.motohiro@g...> * file.c (rb_group_member): added an error check. SUS says, Index: signal.c =================================================================== --- signal.c (revision 39353) +++ signal.c (revision 39354) @@ -626,10 +626,31 @@ sigbus(int sig SIGINFO_ARG) https://github.com/ruby/ruby/blob/trunk/signal.c#L626 #endif #ifdef SIGSEGV +static void ruby_abort(void) +{ +#ifdef __sun + /* Solaris's abort() is async signal unsafe. Of course, it is not + * POSIX compliant. + */ + raise(SIGABRT) +#else + abort(); +#endif + +} + static int segv_received = 0; +extern int ruby_disable_gc_stress; + static RETSIGTYPE sigsegv(int sig SIGINFO_ARG) { + if (segv_received) { + char msg[] = "SEGV received in SEGV handler\n"; + write(2, msg, sizeof(msg)); + ruby_abort(); + } + #ifdef USE_SIGALTSTACK int ruby_stack_overflowed_p(const rb_thread_t *, const void *); NORETURN(void ruby_thread_stack_overflow(rb_thread_t *th)); @@ -638,16 +659,10 @@ sigsegv(int sig SIGINFO_ARG) https://github.com/ruby/ruby/blob/trunk/signal.c#L659 ruby_thread_stack_overflow(th); } #endif - if (segv_received) { - fprintf(stderr, "SEGV received in SEGV handler\n"); - abort(); - } - else { - extern int ruby_disable_gc_stress; - segv_received = 1; - ruby_disable_gc_stress = 1; - rb_bug("Segmentation fault"); - } + + segv_received = 1; + ruby_disable_gc_stress = 1; + rb_bug("Segmentation fault"); } #endif -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/