gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnurl] 61/116: content_encoding: fix inflate_stream for no


From: gnunet
Subject: [GNUnet-SVN] [gnurl] 61/116: content_encoding: fix inflate_stream for no bytes available
Date: Tue, 05 Dec 2017 14:51:31 +0100

This is an automated email from the git hooks/post-receive script.

ng0 pushed a commit to branch master
in repository gnurl.

commit fa64b0fc4bb8e25fd831db8b9328eeec5cc209c1
Author: Jay Satiro <address@hidden>
AuthorDate: Tue Nov 7 00:46:59 2017 -0500

    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
---
 lib/content_encoding.c | 10 ++++++----
 1 file 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

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]