diff options
author | bz <bz@FreeBSD.org> | 2009-11-28 17:44:57 +0000 |
---|---|---|
committer | bz <bz@FreeBSD.org> | 2009-11-28 17:44:57 +0000 |
commit | 7670914da0cc10a422fba58b44dd3390dd048fa0 (patch) | |
tree | a8fd57fcffa6d6aa665211571f210935cddb6fc4 /sys/opencrypto | |
parent | 451e17ae417f8768d8a5830a3a6080a2694b1781 (diff) | |
download | FreeBSD-src-7670914da0cc10a422fba58b44dd3390dd048fa0.zip FreeBSD-src-7670914da0cc10a422fba58b44dd3390dd048fa0.tar.gz |
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 npt seem to cope well with, resulting
in errors when uncompressing exactly fills the outbut buffer without
a Z_STREAM_END and a successive call returns an error.
MFC after: 6 days
Diffstat (limited to 'sys/opencrypto')
-rw-r--r-- | sys/opencrypto/deflate.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/opencrypto/deflate.c b/sys/opencrypto/deflate.c index 239435e..852b66a 100644 --- a/sys/opencrypto/deflate.c +++ b/sys/opencrypto/deflate.c @@ -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); |