Fixed out of memory problems that caused torture test failures in tests

1021 and 1067.
This commit is contained in:
Dan Fandrich 2008-08-26 21:28:57 +00:00
parent fc09d10560
commit 4b01dfe369
4 changed files with 20 additions and 9 deletions

View File

@ -6,6 +6,10 @@
Changelog 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) Yang Tse (26 Aug 2008)
- Added check and symbol definition for WIN32 file API usage in configure, - Added check and symbol definition for WIN32 file API usage in configure,
supporting configure's --disable-largefile option for WIN32 targets also. supporting configure's --disable-largefile option for WIN32 targets also.

View 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 /* 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, static bool trynextip(struct connectdata *conn,
int sockindex, int sockindex,
bool *connected) bool *connected)
@ -578,8 +578,7 @@ static bool trynextip(struct connectdata *conn,
conn->sock[sockindex] = sockfd; conn->sock[sockindex] = sockfd;
conn->ip_addr = ai; conn->ip_addr = ai;
Curl_store_ip_addr(conn); return Curl_store_ip_addr(conn) != CURLE_OK;
return FALSE;
} }
ai = ai->ai_next; ai = ai->ai_next;
} }
@ -919,6 +918,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
long timeout_ms; long timeout_ms;
long timeout_per_addr; long timeout_per_addr;
DEBUGASSERT(sockconn);
*connected = FALSE; /* default to not connected */ *connected = FALSE; /* default to not connected */
/* get the timeout left */ /* get the timeout left */
@ -967,9 +967,10 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
before = after; before = after;
} /* end of connect-to-each-address loop */ } /* end of connect-to-each-address loop */
*sockconn = sockfd; /* the socket descriptor we've connected */
if(sockfd == CURL_SOCKET_BAD) { if(sockfd == CURL_SOCKET_BAD) {
/* no good connect was made */ /* no good connect was made */
*sockconn = CURL_SOCKET_BAD;
failf(data, "couldn't connect to host"); failf(data, "couldn't connect to host");
return CURLE_COULDNT_CONNECT; return CURLE_COULDNT_CONNECT;
} }
@ -980,10 +981,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
if(addr) if(addr)
*addr = curr_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 */ data->info.numconnects++; /* to track the number of connections made */
return CURLE_OK; return CURLE_OK;

View File

@ -2182,6 +2182,10 @@ CURLcode Curl_follow(struct SessionHandle *data,
free(data->change.referer); free(data->change.referer);
data->change.referer = strdup(data->change.url); 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 */ data->change.referer_alloc = TRUE; /* yes, free this later */
} }
} }

View File

@ -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) if(conn->handler->disconnect)
/* This is set if protocol-specific cleanups should be made */ /* This is set if protocol-specific cleanups should be made */
conn->handler->disconnect(conn); conn->handler->disconnect(conn);
@ -4483,7 +4489,7 @@ static CURLcode setup_conn(struct connectdata *conn,
} }
#endif #endif
return CURLE_OK; return result;
} }
CURLcode Curl_connect(struct SessionHandle *data, CURLcode Curl_connect(struct SessionHandle *data,