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:
parent
9e9fcfeef4
commit
e303785dde
2 changed files with 20 additions and 1 deletions
|
@ -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>
|
||||
|
||||
* lib/tempfile.rb (Tempfile#inspect): Show "(closed)" if the tempfile
|
||||
|
|
14
signal.c
14
signal.c
|
@ -826,6 +826,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) {
|
||||
|
@ -977,7 +986,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:
|
||||
|
@ -1058,11 +1067,14 @@ 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 == SIG_DFL) oldcmd = rb_str_new2("SYSTEM_DEFAULT");
|
||||
else if (oldfunc == sighandler) oldcmd = rb_str_new2("DEFAULT");
|
||||
else oldcmd = Qnil;
|
||||
break;
|
||||
case Qnil:
|
||||
break;
|
||||
case Qundef:
|
||||
oldcmd = rb_str_new2("EXIT");
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue