summaryrefslogtreecommitdiff
path: root/lib/content_encoding.c
diff options
context:
space:
mode:
authorJay Satiro <raysatiro@yahoo.com>2017-11-07 00:46:59 -0500
committerJay Satiro <raysatiro@yahoo.com>2017-11-09 01:36:50 -0500
commitfa64b0fc4bb8e25fd831db8b9328eeec5cc209c1 (patch)
treeaaeb3ccabd84d3f43f5bf1a98add42e4c2b7389e /lib/content_encoding.c
parent19e66e53629de4e320a0ceafef687a861ec22fab (diff)
downloadcurl-fa64b0fc4bb8e25fd831db8b9328eeec5cc209c1.tar.gz
content_encoding: fix inflate_stream for no bytes available
- Don't call zlib's inflate() when avail_in stream bytes is 0. This is a follow up to the parent commit 19e66e5. Prior to that change libcurl's inflate_stream could call zlib's inflate even when no bytes were available, causing inflate to return Z_BUF_ERROR, and then inflate_stream would treat that as a hard error and return CURLE_BAD_CONTENT_ENCODING. According to the zlib FAQ, Z_BUF_ERROR is not fatal. This bug would happen randomly since packet sizes are arbitrary. A test of 10,000 transfers had 55 fail (ie 0.55%). Ref: https://zlib.net/zlib_faq.html#faq05 Closes https://github.com/curl/curl/pull/2060
Diffstat (limited to 'lib/content_encoding.c')
-rw-r--r--lib/content_encoding.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/content_encoding.c b/lib/content_encoding.c
index 904dff526..626bb8ec9 100644
--- a/lib/content_encoding.c
+++ b/lib/content_encoding.c
@@ -139,6 +139,11 @@ inflate_stream(struct connectdata *conn, contenc_writer *writer)
/* because the buffer size is fixed, iteratively decompress and transfer to
the client via client_write. */
for(;;) {
+ if(z->avail_in == 0) {
+ free(decomp);
+ return result;
+ }
+
/* (re)set buffer for decompressed output for every iteration */
z->next_out = (Bytef *) decomp;
z->avail_out = DSIZ;
@@ -163,10 +168,7 @@ inflate_stream(struct connectdata *conn, contenc_writer *writer)
/* Done with these bytes, exit */
/* status is always Z_OK at this point! */
- if(z->avail_in == 0) {
- free(decomp);
- return result;
- }
+ continue;
}
else if(allow_restart && status == Z_DATA_ERROR) {
/* some servers seem to not generate zlib headers, so this is an attempt