[ruby-trunk - Bug #5832][Assigned] 意図しないブロック渡しが行われる

Issue #5832 has been reported by Kazuki Tsujimoto.


Bug #5832: 意図しないブロック渡しが行われる

Author: Kazuki Tsujimoto
Status: Assigned
Priority: Normal
Assignee: Koichi Sasada
Category: YARV
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]

=begin
辻本です。

invoke_block_from_cの呼び出しの際に渡していたブロックが
VM loopから続けて呼び出される別のメソッドにも渡されてしまうケースがあります。

$ ./ruby -ve "
require ‘pp’
require ‘pathname’

class <<File
alias realpath_orig realpath

def realpath(*args)
yield if block_given?
realpath_orig(*args)
end
end

pathname = Pathname.new(‘.’)
Class.new do
define_method(:foo) {
pathname.realpath
}
end.new.foo { pp caller }
"
ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]
[“-e:9:in realpath'", "-e:17:in realpath’”,
“-e:17:in block (2 levels) in <main>'", "-e:19:in '”]

blockptrはフレームに積まれることになるので、
passed_blockに代入する行は単純に削除してしまって良いと思います。

diff --git a/vm.c b/vm.c
index 2f38eee…3ea190f 100644
— a/vm.c
+++ b/vm.c
@@ -597,7 +597,6 @@ invoke_block_from_c(rb_thread_t *th, const
rb_block_t *block,
iseq->local_size - arg_size);
ncfp->me = th->passed_me;
th->passed_me = 0;

  • th->passed_block = blockptr;

    if (cref) {
    th->cfp->dfp[-1] = (VALUE)cref;
    =end

Issue #5832 has been updated by ko1 (Koichi Sasada).

見落としていてすみません.

良さそうに見えるので,テストが通れば,テストを追加してコミット頂けませんか.


Bug #5832: 意図しないブロック渡しが行われる

Author: ktsj (Kazuki Tsujimoto)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: YARV
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]

=begin
辻本です。

invoke_block_from_cの呼び出しの際に渡していたブロックが
VM loopから続けて呼び出される別のメソッドにも渡されてしまうケースがあります。

$ ./ruby -ve "
require ‘pp’
require ‘pathname’

class <<File
alias realpath_orig realpath

def realpath(*args)
yield if block_given?
realpath_orig(*args)
end
end

pathname = Pathname.new(‘.’)
Class.new do
define_method(:foo) {
pathname.realpath
}
end.new.foo { pp caller }
"
ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]
[“-e:9:in realpath'", "-e:17:in realpath’”,
“-e:17:in block (2 levels) in <main>'", "-e:19:in '”]

blockptrはフレームに積まれることになるので、
passed_blockに代入する行は単純に削除してしまって良いと思います。

diff --git a/vm.c b/vm.c
index 2f38eee…3ea190f 100644
— a/vm.c
+++ b/vm.c
@@ -597,7 +597,6 @@ invoke_block_from_c(rb_thread_t *th, const
rb_block_t *block,
iseq->local_size - arg_size);
ncfp->me = th->passed_me;
th->passed_me = 0;

  • th->passed_block = blockptr;

    if (cref) {
    th->cfp->dfp[-1] = (VALUE)cref;
    =end

Issue #5832 has been updated by ktsj (Kazuki Tsujimoto).

Assignee changed from ko1 (Koichi Sasada) to ktsj (Kazuki Tsujimoto)

レビューありがとうございました。
対応しておきます。

Bug #5832: 意図しないブロック渡しが行われる

Author: ktsj (Kazuki Tsujimoto)
Status: Assigned
Priority: Normal
Assignee: ktsj (Kazuki Tsujimoto)
Category: YARV
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]

=begin
辻本です。

invoke_block_from_cの呼び出しの際に渡していたブロックが
VM loopから続けて呼び出される別のメソッドにも渡されてしまうケースがあります。

$ ./ruby -ve "
require ‘pp’
require ‘pathname’

class <<File
alias realpath_orig realpath

def realpath(*args)
yield if block_given?
realpath_orig(*args)
end
end

pathname = Pathname.new(‘.’)
Class.new do
define_method(:foo) {
pathname.realpath
}
end.new.foo { pp caller }
"
ruby 2.0.0dev (2012-01-01 trunk 34167) [x86_64-linux]
[“-e:9:in realpath'", "-e:17:in realpath’”,
“-e:17:in block (2 levels) in <main>'", "-e:19:in '”]

blockptrはフレームに積まれることになるので、
passed_blockに代入する行は単純に削除してしまって良いと思います。

diff --git a/vm.c b/vm.c
index 2f38eee…3ea190f 100644
— a/vm.c
+++ b/vm.c
@@ -597,7 +597,6 @@ invoke_block_from_c(rb_thread_t *th, const
rb_block_t *block,
iseq->local_size - arg_size);
ncfp->me = th->passed_me;
th->passed_me = 0;

  • th->passed_block = blockptr;

    if (cref) {
    th->cfp->dfp[-1] = (VALUE)cref;
    =end