[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]