- I fixed two cases of missing return code checks when handling chunked
authorDaniel Stenberg <daniel@haxx.se>
Wed, 2 Jan 2008 22:30:34 +0000 (22:30 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 2 Jan 2008 22:30:34 +0000 (22:30 +0000)
  decoding where a write error (or abort return from a callback) didn't stop
  libcurl's processing.

CHANGES
lib/http_chunks.c

diff --git a/CHANGES b/CHANGES
index 23dbddb..09c076e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,10 @@
                                   Changelog
 
 Daniel S (2 Jan 2008)
+- I fixed two cases of missing return code checks when handling chunked
+  decoding where a write error (or abort return from a callback) didn't stop
+  libcurl's processing.
+
 - I removed the socklen_t use from the public curl/curl.h header and instead
   made it an unsigned int. The type was only used in the curl_sockaddr struct
   definition (only used by the curl_opensocket_callback). On all platforms I
index 2bf1615..d76586c 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -118,8 +118,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
 
   /* the original data is written to the client, but we go on with the
      chunk read process, to properly calculate the content length*/
-  if(data->set.http_te_skip && !k->ignorebody)
-    Curl_client_write(conn, CLIENTWRITE_BODY, datap,datalen);
+  if(data->set.http_te_skip && !k->ignorebody) {
+    result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, datalen);
+    if(result)
+      return CHUNKE_WRITE_ERROR;
+  }
 
   while(length) {
     switch(ch->state) {
@@ -362,9 +365,12 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
             return(CHUNKE_BAD_CHUNK);
           }
 #endif /* CURL_DOES_CONVERSIONS */
-          if( !data->set.http_te_skip )
-            Curl_client_write(conn, CLIENTWRITE_HEADER,
-                              conn->trailer, conn->trlPos);
+          if(!data->set.http_te_skip) {
+            result = Curl_client_write(conn, CLIENTWRITE_HEADER,
+                                       conn->trailer, conn->trlPos);
+            if(result)
+              return CHUNKE_WRITE_ERROR;
+          }
         }
         ch->state = CHUNK_TRAILER;
         conn->trlPos=0;