[ruby-dev:28303] Re: SEGV with zlib
From:
"H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date:
2006-02-06 07:03:10 UTC
List:
ruby-dev #28303
山本です。
>最近、Data オブジェクトの free 関数が気になっているのですが、
>とりあえず次のようにすると SEGV になるようです。
>
>% cat tst.rb
>require 'zlib'
>class C
> def write(str)
> end
>end
>GC.stress = true
>100.times {|i|
>p i
> o = C.new
> 100.times {
> o = Zlib::GzipWriter.new(o)
> }
> o.write "a"
>}
>% ./ruby tst.rb
>0
>1
>tst.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
>tst.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
>tst.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
>zsh: segmentation fault (core dumped) ./ruby tst.rb
よくわからないのですが、こうすると
require 'zlib'
class C
def write(str)
end
end
p o = C.new
100.times {
p o = Zlib::GzipWriter.new(o)
}
o.write "a"
o = nil
GC.start
こうなって
E:\ruby-cvs\win32>ruby \z.rb
#<C:0x2ab4e28>
#<Zlib::GzipWriter:0x2ab4d98>
#<Zlib::GzipWriter:0x2ab4d68>
#<Zlib::GzipWriter:0x2ab4d38>
#<Zlib::GzipWriter:0x2ab4d08>
#<Zlib::GzipWriter:0x2ab4cd8>
#<Zlib::GzipWriter:0x2ab4ca8>
#<Zlib::GzipWriter:0x2ab4c78>
#<Zlib::GzipWriter:0x2ab4c48>
#<Zlib::GzipWriter:0x2ab4c18>
#<Zlib::GzipWriter:0x2ab4be8>
#<Zlib::GzipWriter:0x2ab4bb8>
#<Zlib::GzipWriter:0x2ab4b88>
#<Zlib::GzipWriter:0x2ab4b58>
#<Zlib::GzipWriter:0x2ab4b28>
#<Zlib::GzipWriter:0x2ab4af8>
#<Zlib::GzipWriter:0x2ab4ac8>
#<Zlib::GzipWriter:0x2ab4a98>
#<Zlib::GzipWriter:0x2ab4a68>
#<Zlib::GzipWriter:0x2ab4a38>
#<Zlib::GzipWriter:0x2ab4a08>
#<Zlib::GzipWriter:0x2ab49d8>
#<Zlib::GzipWriter:0x2ab49a8>
#<Zlib::GzipWriter:0x2ab4978>
#<Zlib::GzipWriter:0x2ab4948>
#<Zlib::GzipWriter:0x2ab4918>
#<Zlib::GzipWriter:0x2ab48e8>
#<Zlib::GzipWriter:0x2ab48b8>
#<Zlib::GzipWriter:0x2ab4888>
#<Zlib::GzipWriter:0x2ab4858>
#<Zlib::GzipWriter:0x2ab4828>
#<Zlib::GzipWriter:0x2ab6dd8>
#<Zlib::GzipWriter:0x2ab6c70>
#<Zlib::GzipWriter:0x2ab6bc8>
#<Zlib::GzipWriter:0x2ab6b98>
#<Zlib::GzipWriter:0x2ab6b38>
#<Zlib::GzipWriter:0x2ab6a30>
#<Zlib::GzipWriter:0x2ab6940>
#<Zlib::GzipWriter:0x2ab6838>
#<Zlib::GzipWriter:0x2ab6760>
#<Zlib::GzipWriter:0x2ab6670>
#<Zlib::GzipWriter:0x2ab6640>
#<Zlib::GzipWriter:0x2ab6610>
#<Zlib::GzipWriter:0x2ab65e0>
#<Zlib::GzipWriter:0x2ab65b0>
#<Zlib::GzipWriter:0x2ab4d50>
#<Zlib::GzipWriter:0x2ab4cf0>
#<Zlib::GzipWriter:0x2ab4c90>
#<Zlib::GzipWriter:0x2ab4c30>
#<Zlib::GzipWriter:0x2ab4bd0>
#<Zlib::GzipWriter:0x2ab4b70>
#<Zlib::GzipWriter:0x2ab4b10>
#<Zlib::GzipWriter:0x2ab4ab0>
#<Zlib::GzipWriter:0x2ab4a50>
#<Zlib::GzipWriter:0x2ab49f0>
#<Zlib::GzipWriter:0x2ab4990>
#<Zlib::GzipWriter:0x2ab4930>
#<Zlib::GzipWriter:0x2ab48d0>
#<Zlib::GzipWriter:0x2ab4870>
#<Zlib::GzipWriter:0x2ab47f8>
#<Zlib::GzipWriter:0x2ab47c8>
#<Zlib::GzipWriter:0x2ab6c88>
#<Zlib::GzipWriter:0x2ab6bb0>
#<Zlib::GzipWriter:0x2ab6aa8>
#<Zlib::GzipWriter:0x2ab6928>
#<Zlib::GzipWriter:0x2ab6700>
#<Zlib::GzipWriter:0x2ab6628>
#<Zlib::GzipWriter:0x2ab65c8>
#<Zlib::GzipWriter:0x2ab4d20>
#<Zlib::GzipWriter:0x2ab4c60>
#<Zlib::GzipWriter:0x2ab4ba0>
#<Zlib::GzipWriter:0x2ab4ae0>
#<Zlib::GzipWriter:0x2ab4a20>
#<Zlib::GzipWriter:0x2ab4960>
#<Zlib::GzipWriter:0x2ab48a0>
#<Zlib::GzipWriter:0x2ab4810>
#<Zlib::GzipWriter:0x2ab4798>
#<Zlib::GzipWriter:0x2ab4768>
#<Zlib::GzipWriter:0x2ab4738>
#<Zlib::GzipWriter:0x2ab4708>
#<Zlib::GzipWriter:0x2ab46d8>
#<Zlib::GzipWriter:0x2ab46a8>
#<Zlib::GzipWriter:0x2ab4678>
#<Zlib::GzipWriter:0x2ab4648>
#<Zlib::GzipWriter:0x2ab4618>
#<Zlib::GzipWriter:0x2ab45e8>
#<Zlib::GzipWriter:0x2ab45b8>
#<Zlib::GzipWriter:0x2ab4588>
#<Zlib::GzipWriter:0x2ab4558>
#<Zlib::GzipWriter:0x2ab4528>
#<Zlib::GzipWriter:0x2ab44f8>
#<Zlib::GzipWriter:0x2ab6bf8>
#<Zlib::GzipWriter:0x2ab6988>
#<Zlib::GzipWriter:0x2ab6658>
#<Zlib::GzipWriter:0x2ab4d80>
#<Zlib::GzipWriter:0x2ab4c00>
#<Zlib::GzipWriter:0x2ab4a80>
#<Zlib::GzipWriter:0x2ab4900>
#<Zlib::GzipWriter:0x2ab47e0>
#<Zlib::GzipWriter:0x2ab4780>
#<Zlib::GzipWriter:0x2ab4720>
free ------> 02AB44F8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4528
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4558
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4588
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB45B8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB45E8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4618
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4648
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4678
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB46A8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB46D8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4708
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4720
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4738
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4768
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4780
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4798
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB47C8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB47E0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB47F8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4810
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4828
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4858
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4870
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4888
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB48A0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB48B8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB48D0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB48E8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4900
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4918
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4930
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4948
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4960
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4978
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4990
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB49A8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB49D8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB49F0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A08
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A20
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A38
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A50
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A68
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A80
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4A98
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4AB0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4AC8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4AE0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4AF8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4B10
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4B28
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4B58
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4B70
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4B88
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4BA0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4BB8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4BD0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4BE8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C00
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C18
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C30
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C48
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C60
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C78
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4C90
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4CA8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4CD8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4CF0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D08
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D20
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D38
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D50
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D68
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D80
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB4D98
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB65B0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB65C8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB65E0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6610
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6628
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6640
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6658
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6670
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6700
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6760
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6838
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6928
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6940
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6988
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6A30
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6AA8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6B38
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6B98
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6BB0
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6BC8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
free ------> 02AB6BF8
/z.rb:13: warning: Zlib::GzipWriter object must be closed explicitly.
/z.rb:13: [BUG] Segmentation fault
ruby 1.9.0 (2006-02-06) [i386-mswin32]
abnormal program termination
確保した順番に関係なく、オブジェクトIDの小さいほうから free 関数を
呼んでいるように見えます。つまり
A(0x03) -> B(0x02) -> C(0x04)
のように参照されていると、B が解放されて A の free 関数が解放済みの B
にアクセスしてしまうと。
zlib.c では gzfile_writer_end で一応 OBJ_IS_FREED という形でチェックしている
のですが、flags に出鱈目な値が入っているので、意図したように働いていません。
# それに、同じオブジェクト番号で別のオブジェクトが生成されるかもしれないので、
# こういうチェックはできないはず
でも、これって zlib.c のバグというより GC のバグのような・・・