diff options
author | Daniel Stenberg <daniel@haxx.se> | 2008-12-29 22:25:50 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2008-12-29 22:25:50 +0000 |
commit | 83640b2ee5e41292eab2ff3e722c5ac4caea17c9 (patch) | |
tree | 4fccfd74f9db1725e5ffcd3a914f9dbaf60f91a9 /lib | |
parent | 9aea3e265d8919aea04bb6791673d5718399936d (diff) |
- 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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/url.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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 */ |