Bug #4648

lambda上のclass定義からのreturnでSEGV

Added by Kazuki Tsujimoto almost 3 years ago. Updated almost 3 years ago.

[ruby-dev:43464]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
Category:-
Target version:1.9.3
ruby -v:ruby 1.9.3dev (2011-05-05 trunk 31435) [x86_64-linux] Backport:

Description

=begin
辻本といいます。

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

$ ./miniruby -e '->{class A; return; end}.()'
-e:1: [BUG] Segmentation fault

returnの処理(vm_throw)は以下のようになっていますが:

(1) return先の走査中にclass定義用のフレームにあたったらその外側のフレームのlfpを利用して走査処理を続ける。(Bug #1018)
(2) return先の走査中にLAMBDAフレームにあたったら、有効なreturn(lambdaの内側からのreturn)かどうかを調べるために
return時点でのcfp->dfpをlfpまで辿っていく。

問題のコードでは、1.によりlfpが書き換えられたことで2.のdfpを辿る処理が終わらないため
SEGVするという流れになります。

1.の処理を行なった時点で有効なreturnであることの確認は出来ているので、
その場合は2.を行わずそのままLAMBDAフレームからreturnさせることで回避できます。
パッチを添付します。
=end

return_from_class_frame.patch Magnifier (1.56 KB) Kazuki Tsujimoto, 05/05/2011 02:02 PM

Associated revisions

Revision 32495
Added by Koichi Sasada almost 3 years ago

  • vminsnhelper.c (vmthrow): check a class frame. Fixes Bug #4648. The patch is contributed by Kazuki Tsujimoto.
  • bootstraptest/test_proc.rb: add tests for above.

History

#1 Updated by Koichi Sasada almost 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#2 Updated by Hiroshi Nakamura almost 3 years ago

  • Target version set to 1.9.3

#3 Updated by Koichi Sasada almost 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r32495.
Kazuki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vminsnhelper.c (vmthrow): check a class frame. Fixes Bug #4648. The patch is contributed by Kazuki Tsujimoto.
  • bootstraptest/test_proc.rb: add tests for above.

Also available in: Atom PDF