[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 メーリングリストの案内