From: UENO Katsuhiro Date: 2003-06-18T23:16:10+09:00 Subject: [ruby-list:37797] Re: Zlib::BufError with Zlib::GzipReader うえのです。 On Wed, 18 Jun 2003 21:11:40 +0900 Tanaka Akira wrote: > とあるデータに対し、Zlib::GzipReader が Zlib::BufError を返すことに気 > がつきました。(そのデータは最後に添付します。) snip.. > この sites.lirs.gz というものは gzip -d や zlib 付属の minigzip ではと > くに問題なく展開できますし、次のようにして Zlib::Inflate を使っても問 > 題なく展開でき、gzip -d の出力と一致します。 snip.. > というわけで、この Zlib::BufError が出るというのは Zlib::GzipReader の > 問題なのではないかと思うんですが、実際のところどうなんでしょう? Zlib::Inflate 側の問題でした。このようにすると Zlib::Inflate でも Zlib::BufError が発生します。 % ruby -r./zlib -e 's = File.read("sites.lirs.gz") i = Zlib::Inflate.new(-Zlib::MAX_WBITS) i.inflate s[10...2048] i.inflate s[2048..-9] i.finish' -e:3:in `inflate': buffer error (Zlib::BufError) from -e:3 Index: zlib.c =================================================================== RCS file: /src/shim/ruby16/ext/zlib/zlib.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -p -r1.14 -r1.15 --- zlib.c 6 Apr 2003 09:14:49 -0000 1.14 +++ zlib.c 18 Jun 2003 14:10:02 -0000 1.15 @@ -3,7 +3,7 @@ * * Copyright (C) UENO Katsuhiro 2000-2003 * - * $Id: zlib.c,v 1.14 2003/04/06 09:14:49 katsu Exp $ + * $Id: zlib.c,v 1.15 2003/06/18 14:10:02 katsu Exp $ */ #include @@ -788,6 +788,11 @@ zstream_run(z, src, len, flush) break; } if (err != Z_OK) { + if (flush != Z_FINISH && err == Z_BUF_ERROR + && z->stream.avail_out > 0) { + z->flags |= ZSTREAM_FLAG_IN_STREAM; + break; + } zstream_reset_input(z); if (z->stream.avail_in > 0) { zstream_append_input(z, z->stream.next_in, z->stream.avail_in); -- ---- - - - -- - うえの かつひろ