1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

signal: remove window for SignalException on IGNORE

* 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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46194 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2014-05-28 00:53:11 +00:00
parent 9e9fcfeef4
commit e303785dde
2 changed files with 20 additions and 1 deletions

View file

@ -1,3 +1,10 @@
Wed May 28 09:30:51 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]
Wed May 28 01:02:54 2014 Tanaka Akira <akr@fsij.org> Wed May 28 01:02:54 2014 Tanaka Akira <akr@fsij.org>
* lib/tempfile.rb (Tempfile#inspect): Show "(closed)" if the tempfile * lib/tempfile.rb (Tempfile#inspect): Show "(closed)" if the tempfile

View file

@ -826,6 +826,15 @@ signal_exec(VALUE cmd, int safe, int sig)
volatile unsigned long old_interrupt_mask = cur_th->interrupt_mask; volatile unsigned long old_interrupt_mask = cur_th->interrupt_mask;
int state; 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; cur_th->interrupt_mask |= TRAP_INTERRUPT_MASK;
TH_PUSH_TAG(cur_th); TH_PUSH_TAG(cur_th);
if ((state = EXEC_TAG()) == 0) { if ((state = EXEC_TAG()) == 0) {
@ -977,7 +986,7 @@ trap_handler(VALUE *cmd, int sig)
if (strncmp(RSTRING_PTR(command), "SIG_IGN", 7) == 0) { if (strncmp(RSTRING_PTR(command), "SIG_IGN", 7) == 0) {
sig_ign: sig_ign:
func = SIG_IGN; func = SIG_IGN;
*cmd = 0; *cmd = Qtrue;
} }
else if (strncmp(RSTRING_PTR(command), "SIG_DFL", 7) == 0) { else if (strncmp(RSTRING_PTR(command), "SIG_DFL", 7) == 0) {
sig_dfl: sig_dfl:
@ -1058,11 +1067,14 @@ trap(int sig, sighandler_t func, VALUE command)
oldcmd = vm->trap_list[sig].cmd; oldcmd = vm->trap_list[sig].cmd;
switch (oldcmd) { switch (oldcmd) {
case 0: case 0:
case Qtrue:
if (oldfunc == SIG_IGN) oldcmd = rb_str_new2("IGNORE"); if (oldfunc == SIG_IGN) oldcmd = rb_str_new2("IGNORE");
else if (oldfunc == SIG_DFL) oldcmd = rb_str_new2("SYSTEM_DEFAULT"); else if (oldfunc == SIG_DFL) oldcmd = rb_str_new2("SYSTEM_DEFAULT");
else if (oldfunc == sighandler) oldcmd = rb_str_new2("DEFAULT"); else if (oldfunc == sighandler) oldcmd = rb_str_new2("DEFAULT");
else oldcmd = Qnil; else oldcmd = Qnil;
break; break;
case Qnil:
break;
case Qundef: case Qundef:
oldcmd = rb_str_new2("EXIT"); oldcmd = rb_str_new2("EXIT");
break; break;