[Mew-dist 15530] Re: bug of mewencode -g
Shun-ichi GOTO
gotoh at example.com
2000年 12月 15日 (金) 16:46:54 JST
>>>>> at Fri, 15 Dec 2000 15:30:49 +0900
>>>>> kazu == Kazu Yamamoto (山本和彦) <kazu at example.com> said,
> 1 の結果: 処理は完了。結果比較もOK
> 2 の結果: mewdecode がinfrate error (-5)。
> cmp の結果は "cmp: EOF on file.out2" ですので末尾が欠けてる。
kazu> 再現できました。調べます。
deflate_gzip()の処理で、finalize処理を通らないケースが存在します。
# 予想通りというか
問題が発生するケースでは deflate_gzip() にて
finalize = YES して終了処理をリクエストするが、deflatedも0だった場合。
呼び出し側はEOFと思ってしまう、と。
で、まだ十分は検証していませんが、パッチを添付します。もっと良い方法があ
るとは思いますが、全体のロジックに手を入れたくなかったので最小限の変更で
す。
* finalize処理をしている部分を deflateするメインループの後ろに持ってきた。
* deflateするメインループはfinalize要求がある場合は処理しないように
条件を追加した。
* finalize処理を行なうのは deflated == 0の時に、という条件を追加した。
ってので、現状は少なくとも先に報告した成功ファイル/失敗ファイルのいずれ
もOKになりました。検証してみて下さい。
--- Regards,
Shun-ichi Goto <gotoh at example.com>
R&D Group, TAIYO Corp., Tokyo, JAPAN
-------------- next part --------------
Index: mewencode.c
===================================================================
RCS file: /Master/mew-1.95/bin/mewencode.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 mewencode.c
--- mewencode.c 2000/11/22 09:34:53 1.1.1.1
+++ mewencode.c 2000/12/15 07:35:34
@@ -254,7 +254,32 @@
z.next_out = p;
z.avail_out = max;
- if (finalize == YES) {
+ while ( !finalize && z.avail_out != 0) {
+ if (z.avail_in == 0) {
+ size = (*E_ctx.e_func1)(e_buf1, sizeof(e_buf1));
+ if (size == 0) {
+ finalize = YES;
+ break;
+ }
+ z.next_in = e_buf1;
+ z.avail_in = size;
+ total += size;
+ crc = crc32(crc, e_buf1, (uInt)size);
+ }
+
+ old = z.avail_out;
+ err = deflate(&z, Z_SYNC_FLUSH);
+
+ if (err != Z_OK && err != Z_STREAM_END)
+ warn_exit("deflate error (%d).\n", err);
+
+ deflated = max - z.avail_out;
+
+ if (old == z.avail_out)
+ break;
+ }
+
+ if ((finalize == YES) && (deflated == 0)) {
byte *q;
done = YES;
@@ -277,31 +302,6 @@
*q++ = (int)((total >>= 8) & 0xff);
deflated += 8;
return deflated;
- }
-
- while (z.avail_out != 0) {
- if (z.avail_in == 0) {
- size = (*E_ctx.e_func1)(e_buf1, sizeof(e_buf1));
- if (size == 0) {
- finalize = YES;
- break;
- }
- z.next_in = e_buf1;
- z.avail_in = size;
- total += size;
- crc = crc32(crc, e_buf1, (uInt)size);
- }
-
- old = z.avail_out;
- err = deflate(&z, Z_SYNC_FLUSH);
-
- if (err != Z_OK && err != Z_STREAM_END)
- warn_exit("inflate error (%d).\n", err);
-
- deflated = max - z.avail_out;
-
- if (old == z.avail_out)
- break;
}
return deflated;
Mew-dist メーリングリストの案内