Project

General

Profile

Backport #6618

Seg Fault when printing thread.keys

Added by cantregister (Why Cantiregister) about 7 years ago. Updated almost 7 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
[ruby-core:45741]

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.

Associated revisions

Revision 21e1939d
Added by naruse (Yui NARUSE) about 7 years ago

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.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@36159 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 36159
Added by naruse (Yui NARUSE) about 7 years ago

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.

History

Updated by cantregister (Why Cantiregister) about 7 years ago

threadtest.rb

puts ">>>>>>>>>>>>>>>> starting"

require 'bigdecimal'

for thr in Thread.list
puts thr.keys
end

mac:code user$ ruby threadtest.rb

-- 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) about 7 years ago

sorry about the strange username, i tried to register 3 times before this one worked.

#3

Updated by naruse (Yui NARUSE) about 7 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby master to Backport193
  • Target version deleted (1.9.3)
#4

Updated by naruse (Yui NARUSE) about 7 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.

Also available in: Atom PDF