Allow gzread() and related to continue after gzclearerr().

Before this fix, gzread() would lose data if a premature end of file
was encountered.  This prevented gzread() from being used on a file
that was being written concurrently.  Now gzread() returns all of the
data it has available before indicating a premature end of file.

This also changes the error returned on a premature end of file from
Z_DATA_ERROR to Z_BUF_ERROR.  This allows the user to determine if
the error is recoverable, which it is if Z_BUF_ERROR is returned.  If
a Z_DATA_ERROR is returned, then the error is not recoverable.

This patch replaces the functionality of a previous patch that fixed
reading through an empty gzip stream in a concatenation of gzip
streams.

To implement this fix, a noticeable rewrite of gzread.c was needed.
The patch has the added advantage of using inflate's gzip processing
instead of replicating the functionality in gzread.c.  This makes the
gz code a little simpler.
This commit is contained in:
Mark Adler
2011-09-26 00:57:26 -07:00
parent a9ae24b653
commit 5ad116abda
2 changed files with 93 additions and 179 deletions

View File

@@ -247,8 +247,8 @@ int ZEXPORT gzbuffer(file, size)
return -1;
/* check and set requested size */
if (size == 0)
return -1;
if (size < 2)
size = 2; /* need two bytes to check magic header */
state->want = size;
return 0;
}