Backport #6618
closedSeg Fault when printing thread.keys
Description
This is very easy to reproduce:
require 'bigdecimal'
for thr in Thread.list
puts thr.keys
end
Somehow a key is introduced to the thread with the object ID of 8.
Attempting to inspect or to_s this key results in a seg fault.
1.9.3p194 :001 > ObjectSpace._id2ref(8)
RangeError: 0x00000000000008 is not symbol id value
It is not clear how this object is created or inserted into the Thread.
Updated by cantregister (Why Cantiregister) almost 12 years ago
threadtest.rb
puts ">>>>>>>>>>>>>>>> starting"
require 'bigdecimal'
for thr in Thread.list
puts thr.keys
end
mac:code user$ ruby threadtest.rb
starting
threadtest.rb:6: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.3.0]
-- Control frame information -----------------------------------------------
c:0009 p:---- s:0023 b:0023 l:000022 d:000022 CFUNC :to_s
c:0008 p:---- s:0021 b:0021 l:000020 d:000020 CFUNC :puts
c:0007 p:---- s:0019 b:0019 l:000018 d:000018 CFUNC :puts
c:0006 p:0024 s:0015 b:0015 l:001948 d:000014 BLOCK threadtest.rb:6
c:0005 p:---- s:0012 b:0012 l:000011 d:000011 FINISH
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :each
c:0003 p:0045 s:0007 b:0007 l:001948 d:000a00 EVAL threadtest.rb:5
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:001948 d:001948 TOP
-- Ruby level backtrace information ----------------------------------------
threadtest.rb:5:in <main>' threadtest.rb:5:in
each'
threadtest.rb:6:in block in <main>' threadtest.rb:6:in
puts'
threadtest.rb:6:in puts' threadtest.rb:6:in
to_s'
-- C level backtrace information -------------------------------------------
See Crash Report log file under ~/Library/Logs/CrashReporter or
/Library/Logs/CrashReporter, for the more detail of.
-- Other runtime information -----------------------------------------------
-
Loaded script: threadtest.rb
-
Loaded features:
0 enumerator.so
1 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/enc/encdb.bundle
2 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/enc/trans/transdb.bundle
3 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/defaults.rb
4 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/rbconfig.rb
5 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/deprecate.rb
6 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/exceptions.rb
7 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
8 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems.rb
9 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/bigdecimal.bundle
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
Abort trap: 6
Updated by cantregister (Why Cantiregister) almost 12 years ago
sorry about the strange username, i tried to register 3 times before this one worked.
Updated by naruse (Yui NARUSE) almost 12 years ago
- Tracker changed from Bug to Backport
- Project changed from Ruby master to Backport193
- Target version deleted (
1.9.3)
Updated by naruse (Yui NARUSE) almost 12 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r36159.
Why, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
merge revision(s) 35625: [Backport #6618]
* thread.c (rb_threadptr_execute_interrupts_common):
test_signal_requiring of test/ruby/test_signal.rb fail if the sub
process is killed on waiting IO in lex_io_gets in rb_load_file in
rb_load_internal in require.
This is because
(1) the process receive the killing signal in
rb_thread_io_blocking_region in rb_read_internal in lex_io_gets.
(2) set th->errinfo as INT2FIX(TAG_FATAL) at
rb_threadptr_execute_interrupts_common.
(3) escape rb_load_file in rb_load_internal and jump to EXEC_TAG()
without set loaded as TRUE.
(4) call first rb_exc_raise(GET_THREAD()->errinfo); because loaded
is FALSE as above. this errinfo should be an exception object
but this is INT2FIX(TAG_FATAL).
Don't call first rb_exc_raise if GET_THREAD()->errinfo is Fixnum.