Project

General

Profile

Bug #14196

Updated by shayonj (Shayon Mukherjee) over 6 years ago

Came across while debugging an issue with bundler https://github.com/bundler/bundler/issues/6150 

 The issue is, if a process already has a `SIG_IGN` / `IGNORE` present on it, then doing a `Signal.trap` overrides the handler on the same process. I believe, if a process already has a `SIG_IGN` then the same should be respected/restore. 

 This is how I am able to replicate the issue (from a linux machine where `/proc` is mounted). 


 Sample ruby file for testing (**test.rb**) 

 ~~~ ruby 
 p Signal.trap("SIGHUP", "IGNORE") 
 p Signal.trap("SIGHUP", "SYSTEM_DEFAULT") # This returns the correct string, `IGNORE`, but does not update the signal handler. 

 sleep 100 
 ~~~ 

 Here we are replicating a scenario where a process first gets a trap from `SIG_IGN` and then a `SYSTEM_DEFAULT` / `DEFAULT`. Next, run it 

 ~~~ ruby 
 ruby test.rb 2>&2 & 

 [1] 23156 
 ~~~ 

 Now, lets see what signals are reserved on this status: 

 ~~~ 
 cat /proc/23156/status 
 Name: 	 ruby 
 Umask: 	 0022 
 State: 	 S (sleeping) 
 Tgid: 	 23156 
 Ngid: 	 0 
 Pid: 	 23156 
 PPid: 	 52 
 TracerPid: 	 0 
 Uid: 	 0 	 0 	 0 	 0 
 Gid: 	 0 	 0 	 0 	 0 
 FDSize: 	 256 
 Groups: 
 NStgid: 	 23156 
 NSpid: 	 23156 
 NSpgid: 	 23156 
 NSsid: 	 52 
 VmPeak: 	    40508 kB 
 VmSize: 	    40508 kB 
 VmLck: 	        0 kB 
 VmPin: 	        0 kB 
 VmHWM: 	     8036 kB 
 VmRSS: 	     8036 kB 
 RssAnon: 	     3596 kB 
 RssFile: 	     4440 kB 
 RssShmem: 	        0 kB 
 VmData: 	     5192 kB 
 VmStk: 	     8188 kB 
 VmExe: 	        4 kB 
 VmLib: 	     6624 kB 
 VmPTE: 	       88 kB 
 VmPMD: 	       12 kB 
 VmSwap: 	        0 kB 
 HugetlbPages: 	        0 kB 
 Threads: 	 2 
 SigQ: 	 0/7753 
 SigPnd: 	 0000000000000000 
 ShdPnd: 	 0000000000000000 
 SigBlk: 	 0000000000000000 
 SigIgn: 	 0000000000000000 
 SigCgt: 	 00000001c2007e4e 
 CapInh: 	 00000000a80425fb 
 CapPrm: 	 00000000a80425fb 
 CapEff: 	 00000000a80425fb 
 CapBnd: 	 00000000a80425fb 
 CapAmb: 	 0000000000000000 
 Seccomp: 	 2 
 Cpus_allowed: 	 f 
 Cpus_allowed_list: 	 0-3 
 Mems_allowed: 	 1 
 Mems_allowed_list: 	 0 
 voluntary_ctxt_switches: 	 1 
 nonvoluntary_ctxt_switches: 	 8 
 ~~~ 

 You'll notice that `SigIgn` is `0000000000000000` which a bitmask and is indicating no IGNORE handlers on the process is reserved. 

 ---- 

 I have a fix/patch with specs, which I will share soon on Github for further insight. I would love to learn thoughts on this :).

Back