Project

General

Profile

Bug #14179

Updated by dadah89 (Igor Justino) over 6 years ago

Hello, 

 Delegating `backtrace` causes a segmentation fault on ruby 2.2.8. 

 Seems to be related to this change: https://github.com/ruby/ruby/commit/a14ba6e3d58d6f63f47c0549f60306c4989478ba 

 Looking at that change, seems like the `$@` call on line 207 would cause an infinite loop (assuming `$@` $@ would execute something similar `$!.backtrace`, $!.backtrace, but I'm not sure how `$@` $@ is implemented). 

 Example: 

 
 ``` 
 irb(main):052:0> class WrappedException < StandardError 
 irb(main):053:1>     extend Forwardable 
 irb(main):054:1>  
 irb(main):055:1*     def_delegators :@err, :backtrace 
 irb(main):056:1>  
 irb(main):057:1*     def initialize(err) 
 irb(main):058:2>       @err = err 
 irb(main):059:2>     end 
 irb(main):060:1> end 
 => :initialize 
 irb(main):061:0>  
 irb(main):062:0* begin 
 irb(main):063:1*     raise WrappedException, StandardError.new('test') 
 irb(main):064:1> rescue => e 
 irb(main):065:1>     e.backtrace 
 irb(main):066:1> end 
 Segmentation fault 
 ``` 

 ``` 
 irb(main):031:0> class WrappedException < StandardError 
 irb(main):032:1>     extend Forwardable 
 irb(main):033:1>  
 irb(main):034:1*     def_delegators :@err, :backtrace 
 irb(main):035:1>  
 irb(main):036:1*     def initialize(err) 
 irb(main):037:2>       @err = err 
 irb(main):038:2>     end 
 irb(main):039:1> end 
 => :initialize 
 irb(main):040:0>  
 irb(main):041:0* begin 
 irb(main):042:1*     raise WrappedException, StandardError.new('test') 
 irb(main):043:1> rescue => e 
 irb(main):044:1>     e.backtrace 
 irb(main):045:1> end 
 RuntimeError: can't modify frozen SystemStackError 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
 ... 5481 levels... 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from /opt/.rbenv/versions/2.2.8/lib/ruby/2.2.0/forwardable.rb:207:in `backtrace' 
	 from (irb):44:in `rescue in irb_binding' 
	 from (irb):41 
	 from /opt/.rbenv/versions/2.2.8/bin/irb:11:in `<main>' 
 irb(main):046:0>  
 ```

Back