From: Yusuke ENDOH Date: 2009-11-26T00:26:46+09:00 Subject: [ruby-dev:39776] Re: [Bug #2386] r25230 causes SEGV arround Marshal 遠藤です。 2009年11月25日23:08 _ wanabe : > 再現できないのでわかりませんが、これでどうでしょうか。 > > Index: marshal.c > =================================================================== > --- marshal.c (revision 25922) > +++ marshal.c (working copy) > @@ -166,6 +166,7 @@ > return; > rb_mark_set(p->data); > rb_mark_hash(p->compat_tbl); > + rb_gc_mark(p->str); > } > > static void おおすごい。これっぽい予感がしますね。 以下のように marshal_dump の中で GC を起こさせると、 diff --git a/marshal.c b/marshal.c index 7acc495..cd747b8 100644 --- a/marshal.c +++ b/marshal.c @@ -941,6 +941,7 @@ marshal_dump(int argc, VALUE *argv) port = arg->str; } + rb_gc(); w_byte(MARSHAL_MAJOR, arg); w_byte(MARSHAL_MINOR, arg); 以下のコードで SEGV しますので、いずれにせよこのパッチは当てるべきだと 思います。 $ ./miniruby -e ' class C def marshal_dump GC.start "" end end o = Object.new def o.write(s) s end Marshal.dump(C.new, o) ' -e:4: [BUG] rb_gc_mark(): unknown data type 0x0(0x8248bac) corrupted object (snip) -- Yusuke ENDOH