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
This commit is contained in:
parent
227f66048e
commit
9699afb61b
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user