From 83640b2ee5e41292eab2ff3e722c5ac4caea17c9 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 29 Dec 2008 22:25:50 +0000 Subject: - Phil Lisiecki filed bug report #2413067 (http://curl.haxx.se/bug/view.cgi?id=2413067) that identified a problem that would cause libcurl to mark a DNS cache entry "in use" eternally if the subsequence TCP connect failed. It would thus never get pruned and refreshed as it should've been. --- lib/url.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'lib/url.c') diff --git a/lib/url.c b/lib/url.c index 4826192ef..24d143420 100644 --- a/lib/url.c +++ b/lib/url.c @@ -4523,22 +4523,28 @@ CURLcode Curl_connect(struct SessionHandle *data, if(CURLE_OK == code) { /* no error */ - if((*in_connect)->send_pipe->size + - (*in_connect)->recv_pipe->size != 0) + if((*in_connect)->send_pipe->size || (*in_connect)->recv_pipe->size) /* pipelining */ *protocol_done = TRUE; else { + if(dns || !*asyncp) /* If an address is available it means that we already have the name resolved, OR it isn't async. if this is a re-used connection 'dns' will be NULL here. Continue connecting from here */ code = setup_conn(*in_connect, dns, protocol_done); - /* else - response will be received and treated async wise */ + + if(dns && code) { + /* We have the dns entry info already but failed to connect to the + * host and thus we must make sure to unlock the dns entry again + * before returning failure from here. + */ + Curl_resolv_unlock(data, dns); + } } } - if(CURLE_OK != code && *in_connect) { + if(code && *in_connect) { /* We're not allowed to return failure with memory left allocated in the connectdata struct, free those here */ Curl_disconnect(*in_connect); /* close the connection */ -- cgit v1.2.3