[Ruby 1.9 - Bug #4648][Open] lambda上のclass定義からのreturnでSEGV

Issue #4648 has been reported by Kazuki Tsujimoto.


Bug #4648: lambda上のclass定義からのreturnでSEGV

Author: Kazuki Tsujimoto
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3dev (2011-05-05 trunk 31435) [x86_64-linux]

=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

Issue #4648 has been updated by Koichi Sasada.

Status changed from Open to Assigned
Assignee set to Koichi Sasada


Bug #4648: lambda上のclass定義からのreturnでSEGV

Author: Kazuki Tsujimoto
Status: Assigned
Priority: Normal
Assignee: Koichi Sasada
Category:
Target version:
ruby -v: ruby 1.9.3dev (2011-05-05 trunk 31435) [x86_64-linux]

=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

Issue #4648 has been updated by Hiroshi NAKAMURA.

Target version set to 1.9.3


Bug #4648: lambda上のclass定義からのreturnでSEGV

Author: Kazuki Tsujimoto
Status: Assigned
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]

=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