]> granicus.if.org Git - curl/commitdiff
Fixed out of memory problems that caused torture test failures in tests
authorDan Fandrich <dan@coneharvesters.com>
Tue, 26 Aug 2008 21:28:57 +0000 (21:28 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Tue, 26 Aug 2008 21:28:57 +0000 (21:28 +0000)
1021 and 1067.

CHANGES
lib/connect.c
lib/transfer.c
lib/url.c

diff --git a/CHANGES b/CHANGES
index fdc2a33077ec843cab5aa8acca64d8ae2e398627..181dec8a332a1bda8c901b73cab4ed4a82febe2d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,10 @@
 
                                   Changelog
 
+Daniel Fandrich (26 Aug 2008)
+- Fixed out of memory problems that caused torture test failures in tests
+  1021 and 1067.
+
 Yang Tse (26 Aug 2008)
 - Added check and symbol definition for WIN32 file API usage in configure,
   supporting configure's --disable-largefile option for WIN32 targets also.
index 4018eb0427fdaffcc42483f132cb14a45605f346..860111f56b415cec36af0c53f6ed22f072e956c0 100644 (file)
@@ -552,7 +552,7 @@ CURLcode Curl_store_ip_addr(struct connectdata *conn)
 }
 
 /* Used within the multi interface. Try next IP address, return TRUE if no
-   more address exists */
+   more address exists or error */
 static bool trynextip(struct connectdata *conn,
                       int sockindex,
                       bool *connected)
@@ -578,8 +578,7 @@ static bool trynextip(struct connectdata *conn,
       conn->sock[sockindex] = sockfd;
       conn->ip_addr = ai;
 
-      Curl_store_ip_addr(conn);
-      return FALSE;
+      return Curl_store_ip_addr(conn) != CURLE_OK;
     }
     ai = ai->ai_next;
   }
@@ -919,6 +918,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
   long timeout_ms;
   long timeout_per_addr;
 
+  DEBUGASSERT(sockconn);
   *connected = FALSE; /* default to not connected */
 
   /* get the timeout left */
@@ -967,9 +967,10 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
     before = after;
   }  /* end of connect-to-each-address loop */
 
+  *sockconn = sockfd;    /* the socket descriptor we've connected */
+
   if(sockfd == CURL_SOCKET_BAD) {
     /* no good connect was made */
-    *sockconn = CURL_SOCKET_BAD;
     failf(data, "couldn't connect to host");
     return CURLE_COULDNT_CONNECT;
   }
@@ -980,10 +981,6 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
   if(addr)
     *addr = curr_addr;
 
-  /* allow NULL-pointers to get passed in */
-  if(sockconn)
-    *sockconn = sockfd;    /* the socket descriptor we've connected */
-
   data->info.numconnects++; /* to track the number of connections made */
 
   return CURLE_OK;
index dae8599b9d2af033ccbdba70abebaee0cf1c37f1..3294ba530dfc1f738d3bedd758aa9177704f08d5 100644 (file)
@@ -2182,6 +2182,10 @@ CURLcode Curl_follow(struct SessionHandle *data,
         free(data->change.referer);
 
       data->change.referer = strdup(data->change.url);
+      if (!data->change.referer) {
+        data->change.referer_alloc = FALSE;
+        return CURLE_OUT_OF_MEMORY;
+      }
       data->change.referer_alloc = TRUE; /* yes, free this later */
     }
   }
index 6da9c9ea024258a01010a46e0c5448cefdf35e3e..41222f0ecd60d912b0ce5016cdad9b1538997657 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -2206,6 +2206,12 @@ CURLcode Curl_disconnect(struct connectdata *conn)
     }
   }
 
+  /* Cleanup possible redirect junk */
+  if(data->req.newurl) {
+    free(data->req.newurl);
+    data->req.newurl = NULL;
+  }
+
   if(conn->handler->disconnect)
     /* This is set if protocol-specific cleanups should be made */
     conn->handler->disconnect(conn);
@@ -4483,7 +4489,7 @@ static CURLcode setup_conn(struct connectdata *conn,
   }
 #endif
 
-  return CURLE_OK;
+  return result;
 }
 
 CURLcode Curl_connect(struct SessionHandle *data,