Actions
Bug #4648
closedlambda上のclass定義からのreturnでSEGV
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
Files
Updated by ko1 (Koichi Sasada) over 13 years ago
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
Updated by nahi (Hiroshi Nakamura) over 13 years ago
- Target version set to 1.9.3
Updated by ko1 (Koichi Sasada) over 13 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.
- vm_insnhelper.c (vm_throw): check a class frame.
Fixes Bug #4648.
The patch is contributed by Kazuki Tsujimoto. - bootstraptest/test_proc.rb: add tests for above.
Actions
Like0
Like0Like0Like0