[ruby-core:62715] [ruby-trunk - Bug #9835] IGNORE signal handler has possible race condition in Ruby 2.1.2

From: normalperson@...
Date: 2014-05-23 23:41:27 UTC
List: ruby-core #62715
Issue #9835 has been updated by Eric Wong.


 I could not reproduce the race, but I think the following is a fix.
 
 http://bogomips.org/ruby.git/patch?id=3137d8389c32e4
 
   signal.c: fix SIG_IGN race for #9835
 
   A signal may arrive before SIG_IGN is set, but be handled
   after trap_list[sig].cmd is cleared:
 
   1. signal_enque runs on signal arrival
   2. user calls trap(sig, "IGNORE"), setting SIG_IGN
   3. rb_signal_exec runs on queued signal
 
   * signal.c (signal_exec): ignore nil for SIG_IGN
   * signal.c (trap_handler): set cmd to nil for SIG_IGN
   * signal.c (trap): generate "IGNORE" string for nil
 
 Can you please try my patch? Thank you.

----------------------------------------
Bug #9835: IGNORE signal handler has possible race condition in Ruby 2.1.2
https://bugs.ruby-lang.org/issues/9835#change-46838

* Author: Kyle Smith
* Status: Rejected
* Priority: Low
* Assignee: 
* Category: core
* Target version: 
* ruby -v: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
I'm migrating an application from 1.8.7 to 2.1.1/2.1.2, so I'm not sure when this was introduced.  Attached is a demo program with some notes about how the IGNORE option to Signal.trap seems to have a race condition whereby receiving that signal shortly after that call, it raises a SignalException with the message including only the name of the signal it received.  However, if you trap the signal with an empty block, that race does not occur.

I've tested the attached program on 1.8.7 (no issue), 2.1.1 (issue) and 2.1.2 (issue) on a Linux system (Ubuntu lucid).

---Files--------------------------------
test.rb (1.37 KB)


-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next