[#46902] [ruby-trunk - Feature #7767][Open] Tempfileで自動的にファイルを削除する — "kyanagi (Kouhei Yanagita)" <redmine@...>
8 messages
2013/02/01
[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>
16 messages
2013/02/03
[#46921] Re: [ruby-dev:46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— SASADA Koichi <ko1@...>
2013/02/05
> Issue #7774 has been reported by ktsj (Kazuki Tsujimoto).
[#46960] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— Kazuki Tsujimoto <kazuki@...>
2013/02/09
辻本です。
[#46929] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278] — Kouhei Sutou <kou@...>
須藤です。
4 messages
2013/02/06
[#46930] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278]
— "U.Nakamura" <usa@...>
2013/02/06
こんにちは、なかむら(う)です。
[#46933] Re: [ruby-cvs:46289] zzak:r39120 (trunk): * doc/security.rb: Translate japanese kanji to english — "Martin J. Dürst" <duerst@...>
Hello Zachary,
3 messages
2013/02/07
[#46990] [ruby-trunk - Bug #7101] 拡張ライブラリの質問 — "mame (Yusuke Endoh)" <mame@...>
1 message
2013/02/15
[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>
15 messages
2013/02/23
[#47088] Test on NetBSD/amd64 6.0_STABLE — Takahiro Kambe <taca@...>
こんにちは。
3 messages
2013/02/24
[ruby-dev:46997] [ruby-trunk - Bug #7825] VM/envのマーク漏れによるSEGV
From:
"mame (Yusuke Endoh)" <mame@...>
Date:
2013-02-16 07:58:43 UTC
List:
ruby-dev #46997
Issue #7825 has been updated by mame (Yusuke Endoh).
Assignee changed from mame (Yusuke Endoh) to ktsj (Kazuki Tsujimoto)
ktsj さんに確認してもらって、よさそうならバックポートしてもらうというのでどうでしょうか。
--
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Bug #7825: VM/envのマーク漏れによるSEGV
https://bugs.ruby-lang.org/issues/7825#change-36339
Author: ktsj (Kazuki Tsujimoto)
Status: Assigned
Priority: High
Assignee: ktsj (Kazuki Tsujimoto)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2013-02-10 trunk 39197) [x86_64-linux]
=begin
辻本です。
trunk/rc2で次のコードでSEGVします(Ubuntu 12.04 x86_64)。
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
以下がGC前(A)のフレームの構造です。
(0x555555e078c8は2行目のmodule_evalのBLOCKフレームに対応するep)
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 [FINISH]
-- prev ep(s) --
ep: 0x555555b74360
ep: 0x555555b26a88
c:0001 (0x7ffff6b08fc0) p:0000 s:0002 E:001bf8 TOP [FINISH]
-- prev ep(s) --
ep: 0x555555b26a88
これがGC後に次のようになり、epが辿れなくなっています。
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がスタックを指している場合に、上位(PREV)のepがヒープにあると
そのennvalがマークされずにGCされるということのようです。
ちょっと自信がありませんが、以下のパッチで直ります。
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);
while (cfp != limit_cfp) {
+ VALUE *ep = cfp->ep;
+ VALUE *lep = VM_CF_LEP(cfp);
rb_iseq_t *iseq = 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 == lep) {
+ break;
+ }
+ ep = VM_EP_PREV_EP(ep);
+ }
if (iseq) {
rb_gc_mark(RUBY_VM_NORMAL_ISEQ_P(iseq) ? iseq->self : (VALUE)iseq);
}
showstopper扱いになるのではないかと思いますが、いかがでしょうか。
=end
--
http://bugs.ruby-lang.org/