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>
|
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
|
||||||
|
|
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;
|
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;
|
||||||
|
|
Loading…
Reference in a new issue