Bug #8964

[BUG](%p is T_NONE) occurs while marking VM stack

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

[ruby-dev:47729]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v:ruby 2.1.0dev (2013-09-28 trunk 43078) [x86_64-linux] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

=begin
以下のコードで (({rb_gc_mark(): 0x00555555a1ff68 is T_NONE})) のような[BUG]となります。

def m(a: [])
end

GC.stress=true
tap { m }
GC.start
tap { m }

フレームを積む際にキーワード引数用のVMスタック領域をCレベルで初期化していないため、
積んだ直後には死んだオブジェクトへの参照がスタックに残ってしまっていることがあります。
その後、Rubyレベルで初期化が行われるまでにマーキング処理が走ると上述の[BUG]となります。

vm_push_frame内で初期化を行うようにするパッチです。

diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 96b624d..6d522b4 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -58,6 +58,15 @@ vm_push_frame(rb_thread_t *th,
*sp++ = Qnil;
}

  • /* initialize keyword arguments */
  • if (iseq && BUILTIN_TYPE(iseq) != T_NODE && iseq->arg_keyword != -1) {
  • VALUE *const argv = sp - iseq->local_size;
  • VALUE ptr = argv + iseq->arg_size - 1 - (iseq->arg_block != -1); / argv+arg_size-(**1)-(&1) */
  • for (i = 0; i < iseq->arg_keywords; i++) {
  • *--ptr = Qnil;
  • }
  • } + /* set special val */ *sp = specval; =end

clear-keyword-args.patch Magnifier (888 Bytes) Kazuki Tsujimoto, 09/29/2013 08:28 AM

Associated revisions

Revision 43081
Added by Kazuki Tsujimoto almost 2 years ago

  • vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
    clear keyword arguments to prevent GC bug which occurs
    while marking VM stack.
    [Bug #8964]

  • test/ruby/test_keyword.rb: tests for the above.

Revision 43081
Added by Kazuki Tsujimoto almost 2 years ago

  • vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
    clear keyword arguments to prevent GC bug which occurs
    while marking VM stack.
    [Bug #8964]

  • test/ruby/test_keyword.rb: tests for the above.

History

#1 Updated by Kazuki Tsujimoto almost 2 years ago

=begin
不要な分岐を避けるために初期化処理はsetup_argでやったほうがよいのでないかと思い直したので、パッチを修正しました。
=end

#2 Updated by Nobuyoshi Nakada almost 2 years ago

これでいいんじゃないでしょうか。
vm_callee_setup_arg_complex()とvm_yield_setup_block_args()は共通化できるところも多そうですが。

#3 Updated by Koichi Sasada almost 2 years ago

(2013/09/29 9:08), nobu (Nobuyoshi Nakada) wrote:

これでいいんじゃないでしょうか。

と思います。

vm_callee_setup_arg_complex()とvm_yield_setup_block_args()は共通化できるところも多そうですが。

共通箇所の括りだしはいるかもしれないですね。

--
// SASADA Koichi at atdot dot net

#4 Updated by Kazuki Tsujimoto almost 2 years ago

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

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


  • vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
    clear keyword arguments to prevent GC bug which occurs
    while marking VM stack.
    [Bug #8964]

  • test/ruby/test_keyword.rb: tests for the above.

#5 Updated by Kazuki Tsujimoto almost 2 years ago

=begin
レビューありがとうございます。
とりあえずのパッチでコミットしておきました。
=end

Also available in: Atom PDF