Project

General

Profile

Actions

Bug #14179

closed

Forwardable Segmentation fault ruby 2.2.8p477 (2017-09-14 revision 59906)

Added by dadah89 (Igor Justino) over 6 years ago. Updated about 6 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.8p477 (2017-09-14 revision 59906)
[ruby-core:84245]

Description

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, 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> 
Actions #1

Updated by dadah89 (Igor Justino) over 6 years ago

  • Description updated (diff)

Updated by dadah89 (Igor Justino) about 6 years ago

Bump. Issue still seems to happen on ruby 2.2.9.

Following https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReport, I'm supposed to assign the ticket to the maintainer ( https://github.com/ruby/ruby/blob/trunk/doc/maintainers.rdoc mentions lib/forwardable.rb being maintained by Keiju ISHITSUKA (keiju)), but I don't see a way to assign tickets. Maybe the documentation is a bit outdated?

Updated by wanabe (_ wanabe) about 6 years ago

I guess this issue will be fixed to backport r55372.
But Ruby 2.2 status is "security maintenance" and its EOL date is scheduled for 2018-03-31.
https://www.ruby-lang.org/en/downloads/branches/
So ruby_2_2 branch would not backport but I wish ruby_2_3 would do.

You can avoid the issue with Ruby 2.4 or higher because they already include r55372.

Actions #4

Updated by nobu (Nobuyoshi Nakada) about 6 years ago

  • Status changed from Open to Closed
  • Backport changed from 2.3: UNKNOWN, 2.4: UNKNOWN to 2.3: REQUIRED, 2.4: DONTNEED, 2.5: DONTNEED

Updated by usa (Usaku NAKAMURA) about 6 years ago

  • Backport changed from 2.3: REQUIRED, 2.4: DONTNEED, 2.5: DONTNEED to 2.3: DONE, 2.4: DONTNEED, 2.5: DONTNEED

ruby_2_3 r62820 merged revision(s) 55372.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0