[Ruby 1.9 - Bug #5083][Open] cref/cbase取得時にSEGV

Issue #5083 has been reported by Kazuki Tsujimoto.


Bug #5083: cref/cbase取得時にSEGV

Author: Kazuki Tsujimoto
Status: Open
Priority: Normal
Assignee: Kazuki Tsujimoto
Category: core
Target version:
ruby -v: ruby 1.9.4dev (2011-07-23 trunk 32632) [x86_64-linux]

=begin
辻本です。

以下のコードでSEGVします。

$ ./ruby -e ‘Thread.new(&Module.method(:nesting)).join’
$ ./ruby -e ‘Thread.new(:to_s, &Module.method(:undef_method)).join’

それぞれrb_vm_cref/rb_vm_cbaseの中でrb_vm_get_ruby_level_next_cfpが0を返すケースに
対応できていないのが原因です。

類似の事例として[ruby-dev:34128]があるのですが、その際の対策にあわせて
Rubyレベルのcfpが存在しない場合はRuntimeErrorとする変更を取り込んでしまいたいと思います。
(パッチを添付します)

懸念点として、上記のコードは1.8系の場合はエラーが出ることなく動くので
このパッチを適用することで非互換が生じることになりますが、
すでに

$ ruby1.8 -e ‘Thread.new(“$“, &Object.method(:eval)).join’ # => No
error
$ ruby1.9 -e 'Thread.new(”$
”, &Object.method(:eval)).join’ # => Can’t
eval on top of Fiber or Thread (RuntimeError)

という状況なので問題ないと思いますがどうでしょうか。
=end

Issue #5083 has been updated by Kazuki Tsujimoto.

trunkと1.9.3にコミットしました。

Bug #5083: cref/cbase取得時にSEGV

Author: Kazuki Tsujimoto
Status: Closed
Priority: Normal
Assignee: Kazuki Tsujimoto
Category: core
Target version:
ruby -v: ruby 1.9.4dev (2011-07-23 trunk 32632) [x86_64-linux]

=begin
辻本です。

以下のコードでSEGVします。

$ ./ruby -e ‘Thread.new(&Module.method(:nesting)).join’
$ ./ruby -e ‘Thread.new(:to_s, &Module.method(:undef_method)).join’

それぞれrb_vm_cref/rb_vm_cbaseの中でrb_vm_get_ruby_level_next_cfpが0を返すケースに
対応できていないのが原因です。

類似の事例として[ruby-dev:34128]があるのですが、その際の対策にあわせて
Rubyレベルのcfpが存在しない場合はRuntimeErrorとする変更を取り込んでしまいたいと思います。
(パッチを添付します)

懸念点として、上記のコードは1.8系の場合はエラーが出ることなく動くので
このパッチを適用することで非互換が生じることになりますが、
すでに

$ ruby1.8 -e ‘Thread.new(“$“, &Object.method(:eval)).join’ # => No
error
$ ruby1.9 -e 'Thread.new(”$
”, &Object.method(:eval)).join’ # => Can’t
eval on top of Fiber or Thread (RuntimeError)

という状況なので問題ないと思いますがどうでしょうか。
=end