summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--signal.c14
-rw-r--r--version.h6
3 files changed, 23 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 86bc471f35..2cd119b741 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Jun 27 16:56:38 2014 Eric Wong <e@80x24.org>
+
+ * signal.c (signal_exec): ignore immediate cmd for SIG_IGN
+ * signal.c (trap_handler): set cmd to true for SIG_IGN
+ * signal.c (trap): handle nil and true values for oldcmd
+ [Bug #9835]
+
Mon Jun 23 18:51:43 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* class.c (rb_mod_init_copy): always clear instance variable,
diff --git a/signal.c b/signal.c
index 39cc5e0f56..31f433baf7 100644
--- a/signal.c
+++ b/signal.c
@@ -680,6 +680,15 @@ signal_exec(VALUE cmd, int safe, int sig)
volatile unsigned long old_interrupt_mask = cur_th->interrupt_mask;
int state;
+ /*
+ * workaround the following race:
+ * 1. signal_enque queues signal for execution
+ * 2. user calls trap(sig, "IGNORE"), setting SIG_IGN
+ * 3. rb_signal_exec runs on queued signal
+ */
+ if (IMMEDIATE_P(cmd))
+ return;
+
cur_th->interrupt_mask |= TRAP_INTERRUPT_MASK;
TH_PUSH_TAG(cur_th);
if ((state = EXEC_TAG()) == 0) {
@@ -831,7 +840,7 @@ trap_handler(VALUE *cmd, int sig)
if (strncmp(RSTRING_PTR(command), "SIG_IGN", 7) == 0) {
sig_ign:
func = SIG_IGN;
- *cmd = 0;
+ *cmd = Qtrue;
}
else if (strncmp(RSTRING_PTR(command), "SIG_DFL", 7) == 0) {
sig_dfl:
@@ -912,10 +921,13 @@ trap(int sig, sighandler_t func, VALUE command)
oldcmd = vm->trap_list[sig].cmd;
switch (oldcmd) {
case 0:
+ case Qtrue:
if (oldfunc == SIG_IGN) oldcmd = rb_str_new2("IGNORE");
else if (oldfunc == sighandler) oldcmd = rb_str_new2("DEFAULT");
else oldcmd = Qnil;
break;
+ case Qnil:
+ break;
case Qundef:
oldcmd = rb_str_new2("EXIT");
break;
diff --git a/version.h b/version.h
index 398c513397..c21160ca90 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.0.0"
-#define RUBY_RELEASE_DATE "2014-06-23"
-#define RUBY_PATCHLEVEL 499
+#define RUBY_RELEASE_DATE "2014-06-27"
+#define RUBY_PATCHLEVEL 500
#define RUBY_RELEASE_YEAR 2014
#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 23
+#define RUBY_RELEASE_DAY 27
#include "ruby/version.h"