[ruby-dev:47922] [Backport93 - Backport #7825] [Closed] VM/envのマーク漏れによるSEGV

From: usa@...
Date: 2014-01-29 03:43:09 UTC
List: ruby-dev #47922
Issue #7825 has been updated by Usaku NAKAMURA.

Status changed from Assigned to Closed

Applied in changeset r44736.

----------
merge revision(s) 39276: [Backport #7825]

	* vm.c (rb_thread_mark): mark a working Proc of bmethod
	  (a method defined by define_method) even if the method was removed.
	  We could not trace working Proc object which represents the body
	  of bmethod if the method was removed (alias/undef/overridden).
	  Simply, it was mark miss.
	  This patch by Kazuki Tsujimoto. [Bug #7825]
	  NOTE: We can brush up this marking because we do not need to mark
	  `me' on each living control frame. We need to mark `me's
	  only if `me' was free'ed. This is future work after Ruby 2.0.0.

	* test/ruby/test_method.rb: add a test.

----------------------------------------
Backport #7825: VM/env=E3=81=AE=E3=83=9E=E3=83=BC=E3=82=AF=E6=BC=8F=E3=82=
=8C=E3=81=AB=E3=82=88=E3=82=8BSEGV
https://bugs.ruby-lang.org/issues/7825#change-44670

* Author: Kazuki Tsujimoto
* Status: Closed
* Priority: Normal
* Assignee: Usaku NAKAMURA
* Category:=20
* Target version:=20
* ruby -v: ruby 2.0.0dev (2013-02-10 trunk 39197) [x86_64-linux]
----------------------------------------
=E8=BE=BB=E6=9C=AC=E3=81=A7=E3=81=99=E3=80=82

trunk/rc2=E3=81=A7=E6=AC=A1=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=81=A7SEG=
V=E3=81=97=E3=81=BE=E3=81=99(Ubuntu 12.04 x86_64)=E3=80=82

    require 'irb'
    IRB::Irb.module_eval do
      define_method(:eval_input) do
        IRB::Irb.module_eval { alias_method :eval_input, :to_s }
        # (A)
        GC.start
        Kernel
      end
    end
    IRB.start

=E4=BB=A5=E4=B8=8B=E3=81=8CGC=E5=89=8D(A)=E3=81=AE=E3=83=95=E3=83=AC=E3=83=
=BC=E3=83=A0=E3=81=AE=E6=A7=8B=E9=80=A0=E3=81=A7=E3=81=99=E3=80=82
(0x555555e078c8=E3=81=AF2=E8=A1=8C=E7=9B=AE=E3=81=AEmodule_eval=E3=81=AEBLO=
CK=E3=83=95=E3=83=AC=E3=83=BC=E3=83=A0=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=99=
=E3=82=8Bep)

    c:0006 (0x7ffff6b08e30) p:0046 s:0018 e:000017 LAMBDA test.rb:5 [FINISH]
      -- prev ep(s) --
      ep: 0x7ffff6a09098
      ep: 0x555555e078c8
      ep: 0x555555b74360
      ep: 0x555555b26a88
    c:0002 (0x7ffff6b08f70) p:0044 s:0005 E:0012d0 EVAL   test.rb:10 [FINIS=
H]
      -- prev ep(s) --
      ep: 0x555555b74360
      ep: 0x555555b26a88
    c:0001 (0x7ffff6b08fc0) p:0000 s:0002 E:001bf8 TOP    [FINISH]
      -- prev ep(s) --
      ep: 0x555555b26a88
=20
=E3=81=93=E3=82=8C=E3=81=8CGC=E5=BE=8C=E3=81=AB=E6=AC=A1=E3=81=AE=E3=82=88=
=E3=81=86=E3=81=AB=E3=81=AA=E3=82=8A=E3=80=81ep=E3=81=8C=E8=BE=BF=E3=82=8C=
=E3=81=AA=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=81=BE=E3=81=99=E3=
=80=82
=20
    c:0006 (0x7ffff6b08e30) p:0062 s:0018 e:000017 LAMBDA test.rb:7 [FINISH]
      -- prev ep(s) --
      ep: 0x7ffff6a09098
      ep: 0x555555e078c8
      ep: 0x555555e0da20
      ep: (nil)

ep=E3=81=8C=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=82=92=E6=8C=87=E3=81=97=
=E3=81=A6=E3=81=84=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=AB=E3=80=81=E4=B8=8A=E4=
=BD=8D(PREV)=E3=81=AEep=E3=81=8C=E3=83=92=E3=83=BC=E3=83=97=E3=81=AB=E3=81=
=82=E3=82=8B=E3=81=A8
=E3=81=9D=E3=81=AEennval=E3=81=8C=E3=83=9E=E3=83=BC=E3=82=AF=E3=81=95=E3=82=
=8C=E3=81=9A=E3=81=ABGC=E3=81=95=E3=82=8C=E3=82=8B=E3=81=A8=E3=81=84=E3=81=
=86=E3=81=93=E3=81=A8=E3=81=AE=E3=82=88=E3=81=86=E3=81=A7=E3=81=99=E3=80=82

=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8=E8=87=AA=E4=BF=A1=E3=81=8C=E3=81=82=E3=
=82=8A=E3=81=BE=E3=81=9B=E3=82=93=E3=81=8C=E3=80=81=E4=BB=A5=E4=B8=8B=E3=81=
=AE=E3=83=91=E3=83=83=E3=83=81=E3=81=A7=E7=9B=B4=E3=82=8A=E3=81=BE=E3=81=99=
=E3=80=82

    diff --git a/vm.c b/vm.c
    index 36def2c..fea4a57 100644
    --- a/vm.c
    +++ b/vm.c
    @@ -1775,10 +1775,22 @@ rb_thread_mark(void *ptr)
     	    rb_gc_mark_locations(p, p + th->mark_stack_len);
=20=20=20=20=20
     	    while (cfp !=3D limit_cfp) {
    +		VALUE *ep =3D cfp->ep;
    +		VALUE *lep =3D VM_CF_LEP(cfp);
     		rb_iseq_t *iseq =3D cfp->iseq;
     		rb_gc_mark(cfp->proc);
     		rb_gc_mark(cfp->self);
     		rb_gc_mark(cfp->klass);
    +		while (1) {
    +		    if (ENV_IN_HEAP_P(th, ep)) {
    +			rb_gc_mark(ep[1]); /* envval */
    +			break;
    +		    }
    +		    if (ep =3D=3D lep) {
    +			break;
    +		    }
    +		    ep =3D VM_EP_PREV_EP(ep);
    +		}
     		if (iseq) {
     		    rb_gc_mark(RUBY_VM_NORMAL_ISEQ_P(iseq) ? iseq->self : (VALUE)ise=
q);
     		}

showstopper=E6=89=B1=E3=81=84=E3=81=AB=E3=81=AA=E3=82=8B=E3=81=AE=E3=81=A7=
=E3=81=AF=E3=81=AA=E3=81=84=E3=81=8B=E3=81=A8=E6=80=9D=E3=81=84=E3=81=BE=E3=
=81=99=E3=81=8C=E3=80=81=E3=81=84=E3=81=8B=E3=81=8C=E3=81=A7=E3=81=97=E3=82=
=87=E3=81=86=E3=81=8B=E3=80=82

---Files--------------------------------
backtrace.txt (4.24 KB)


--=20
http://bugs.ruby-lang.org/

In This Thread

Prev Next