Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Dec 2009 23:25:45 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r201232 - stable/7/sys/opencrypto
Message-ID:  <200912292325.nBTNPjAg039822@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Tue Dec 29 23:25:45 2009
New Revision: 201232
URL: http://svn.freebsd.org/changeset/base/201232

Log:
  MFC r199887:
  
    Z_PARTIAL_FLUSH is marked deprecated. Z_SYNC_FLUSH is the suggested
    replacement but only use it for inflate. For deflate use Z_FINISH
    as Z_SYNC_FLUSH adds a trailing marker in some cases that inflate(),
    despite the comment in zlib, does not seem to cope well with, resulting
    in errors when uncompressing exactly fills the output buffer without
    a Z_STREAM_END and a successive call returns an error.

Modified:
  stable/7/sys/opencrypto/deflate.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/opencrypto/deflate.c
==============================================================================
--- stable/7/sys/opencrypto/deflate.c	Tue Dec 29 23:23:05 2009	(r201231)
+++ stable/7/sys/opencrypto/deflate.c	Tue Dec 29 23:25:45 2009	(r201232)
@@ -138,8 +138,8 @@ deflate_global(data, size, decomp, out)
 		goto bad;
 	}
 	for (;;) {
-		error = decomp ? inflate(&zbuf, Z_PARTIAL_FLUSH) :
-				 deflate(&zbuf, Z_PARTIAL_FLUSH);
+		error = decomp ? inflate(&zbuf, Z_SYNC_FLUSH) :
+				 deflate(&zbuf, Z_FINISH);
 		if (error != Z_OK && error != Z_STREAM_END) {
 			/*
 			 * Unfortunately we are limited to 5 arguments,
@@ -153,9 +153,13 @@ deflate_global(data, size, decomp, out)
 			    zbuf.state->dummy, zbuf.total_out);
 			goto bad;
 		}
-		else if (zbuf.avail_in == 0 && zbuf.avail_out != 0)
-			goto end;
-		else if (zbuf.avail_out == 0 && i < (ZBUF - 1)) {
+		if (decomp && zbuf.avail_in == 0 && error == Z_STREAM_END) {
+			/* Done. */
+			break;
+		} else if (!decomp && error == Z_STREAM_END) {
+			/* Done. */
+			break;
+		} else if (zbuf.avail_out == 0) {
 			/* we need more output space, allocate size */
 			buf[i].out = malloc((u_long) size,
 			    M_CRYPTO_DATA, M_NOWAIT);
@@ -170,6 +174,7 @@ deflate_global(data, size, decomp, out)
 			zbuf.avail_out = buf[i].size;
 			i++;
 		} else {
+			/* Unexpect result. */
 			/*
 			 * Unfortunately we are limited to 5 arguments,
 			 * thus, again, use two probes.
@@ -184,7 +189,6 @@ deflate_global(data, size, decomp, out)
 		}
 	}
 
-end:
 	result = count = zbuf.total_out;
 
 	*out = malloc((u_long) result, M_CRYPTO_DATA, M_NOWAIT);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912292325.nBTNPjAg039822>