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

ruby-changes:8787

From: yugui <ko1@a...>
Date: Sat, 22 Nov 2008 23:52:47 +0900 (JST)
Subject: [ruby-changes:8787] Ruby:r20323 (ruby_1_9_1): merges r20293 from trunk into ruby_1_9_1.

yugui	2008-11-22 23:52:21 +0900 (Sat, 22 Nov 2008)

  New Revision: 20323

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20323

  Log:
    merges r20293 from trunk into ruby_1_9_1.
    * signal.c (register_sigaltstack): use alternative stack for
      SIGSEGV to avoid uncaught stack overflow. based on a patch from
      Hiro Yoshioka <hyoshiok at miraclelinux.com> in [ruby-dev:37134].
      [ruby-dev:36993]

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/configure.in
    branches/ruby_1_9_1/signal.c

Index: ruby_1_9_1/configure.in
===================================================================
--- ruby_1_9_1/configure.in	(revision 20322)
+++ ruby_1_9_1/configure.in	(revision 20323)
@@ -786,7 +786,7 @@
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round signbit\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
               mktime timegm gmtime_r clock_gettime gettimeofday\
-              pread sendfile shutdown)
+              pread sendfile shutdown sigaltstack)
 
 AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
 [AC_TRY_LINK([@%:@include <setjmp.h>
Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 20322)
+++ ruby_1_9_1/ChangeLog	(revision 20323)
@@ -1,3 +1,10 @@
+Fri Nov 21 21:50:54 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* signal.c (register_sigaltstack): use alternative stack for
+	  SIGSEGV to avoid uncaught stack overflow. based on a patch from
+	  Hiro Yoshioka <hyoshiok at miraclelinux.com> in [ruby-dev:37134].
+	  [ruby-dev:36993]
+
 Fri Nov 21 16:06:54 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* vm.c (thread_free): th->vm may be NULL when pthread_create
Index: ruby_1_9_1/signal.c
===================================================================
--- ruby_1_9_1/signal.c	(revision 20322)
+++ ruby_1_9_1/signal.c	(revision 20323)
@@ -47,6 +47,11 @@
 # define NSIG (_SIGMAX + 1)      /* For QNX */
 #endif
 
+#if defined(SIGSEGV) && defined(HAVE_SIGALTSTACK)
+#define USE_SIGALTSTACK
+int is_altstack_defined = 0;
+#endif
+
 static const struct signals {
     const char *signm;
     int  signo;
@@ -410,6 +415,28 @@
 typedef RETSIGTYPE (*sighandler_t)(int);
 
 #ifdef POSIX_SIGNAL
+#ifdef USE_SIGALTSTACK
+#define ALT_STACK_SIZE (4*1024)
+/* alternate stack for SIGSEGV */
+static void register_sigaltstack() {
+    stack_t newSS, oldSS;
+
+    if(is_altstack_defined)
+      return;
+
+    newSS.ss_sp = malloc(ALT_STACK_SIZE);
+    if(newSS.ss_sp == NULL)
+      /* should handle error */
+       rb_bug("register_sigaltstack. malloc error\n");
+    newSS.ss_size = ALT_STACK_SIZE;
+    newSS.ss_flags = 0;
+
+    if (sigaltstack(&newSS, &oldSS) < 0) 
+        rb_bug("register_sigaltstack. error\n");
+    is_altstack_defined = 1;
+}
+#endif
+
 static sighandler_t
 ruby_signal(int signum, sighandler_t handler)
 {
@@ -432,7 +459,12 @@
     if (signum == SIGCHLD && handler == SIG_IGN)
 	sigact.sa_flags |= SA_NOCLDWAIT;
 #endif
-    sigaction(signum, &sigact, &old);
+#if defined(SA_ONSTACK) && defined(USE_SIGALTSTACK)
+    if (signum == SIGSEGV)
+        sigact.sa_flags |= SA_ONSTACK;
+#endif
+    if (sigaction(signum, &sigact, &old) < 0)
+        rb_bug("sigaction error.\n");
     return old.sa_handler;
 }
 
@@ -663,6 +695,7 @@
 #ifdef SIGSEGV
       case SIGSEGV:
         func = sigsegv;
+        register_sigaltstack();
         break;
 #endif
 #ifdef SIGPIPE
@@ -1070,6 +1103,7 @@
     install_sighandler(SIGBUS, sigbus);
 #endif
 #ifdef SIGSEGV
+    register_sigaltstack();
     install_sighandler(SIGSEGV, sigsegv);
 #endif
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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