diff --git a/CHANGES b/CHANGES index fdc2a33077ec843cab5aa8acca64d8ae2e398627..181dec8a332a1bda8c901b73cab4ed4a82febe2d 100644 --- 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. diff --git a/lib/connect.c b/lib/connect.c index 4018eb0427fdaffcc42483f132cb14a45605f346..860111f56b415cec36af0c53f6ed22f072e956c0 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -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; diff --git a/lib/transfer.c b/lib/transfer.c index dae8599b9d2af033ccbdba70abebaee0cf1c37f1..3294ba530dfc1f738d3bedd758aa9177704f08d5 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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 */ } } diff --git a/lib/url.c b/lib/url.c index 6da9c9ea024258a01010a46e0c5448cefdf35e3e..41222f0ecd60d912b0ce5016cdad9b1538997657 100644 --- 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,