]> granicus.if.org Git - curl/commitdiff
call Curl_done() in Curl_perform() after Transfer() was called, even it it
authorDaniel Stenberg <daniel@haxx.se>
Wed, 17 Oct 2001 12:24:51 +0000 (12:24 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 17 Oct 2001 12:24:51 +0000 (12:24 +0000)
returned an error as there might be stuff in there we must free/cleanup.
This fixes the memory leak Yanick Pelletier posted about 16 Oct 2001

lib/transfer.c

index 80a2a75f9f78e6a4572f586b20fed2650efdeac2..90033a7bf192c7f23b1d14968788dc567b8513cc 100644 (file)
@@ -926,6 +926,8 @@ CURLcode Curl_perform(struct SessionHandle *data)
     if(res == CURLE_OK) {
       res = Curl_do(conn);
       if(res == CURLE_OK) {
+        CURLcode res2; /* just a local extra result container */
+
         if(conn->protocol&PROT_FTPS)
           /* FTPS, disable ssl while transfering data */
           conn->ssl.use = FALSE;
@@ -934,15 +936,19 @@ CURLcode Curl_perform(struct SessionHandle *data)
           /* FTPS, enable ssl again after havving transferred data */
           conn->ssl.use = TRUE;
 
-        if(res == CURLE_OK) {
+        if(res == CURLE_OK)
           /*
            * We must duplicate the new URL here as the connection data
            * may be free()ed in the Curl_done() function.
            */
           newurl = conn->newurl?strdup(conn->newurl):NULL;
 
-          res = Curl_done(conn);
-        }
+        /* Always run Curl_done(), even if some of the previous calls
+           failed, but return the previous (original) error code */
+        res2 = Curl_done(conn);
+
+        if(CURLE_OK == res)
+          res = res2;
       }
 
       /*