From 019bde82ce8fd9d0a335edb30441088a96906d1b Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 11 Aug 2008 19:26:01 +0000 Subject: - Constantine Sapuntzakis filed bug report #2042440 (http://curl.haxx.se/bug/view.cgi?id=2042440) with a patch. He identified a problem when using NTLM over a proxy but the end-point does Basic, and then libcurl would do wrong when the host sent "Connection: close" as the proxy's NTLM state was erroneously cleared. --- lib/url.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/url.c b/lib/url.c index c77850794..76603494d 100644 --- a/lib/url.c +++ b/lib/url.c @@ -2179,22 +2179,31 @@ CURLcode Curl_disconnect(struct connectdata *conn) Curl_expire(data, 0); /* shut off timers */ Curl_hostcache_prune(data); /* kill old DNS cache entries */ - if((conn->ntlm.state != NTLMSTATE_NONE) || - (conn->proxyntlm.state != NTLMSTATE_NONE)) { + { + int has_host_ntlm = (conn->ntlm.state != NTLMSTATE_NONE); + int has_proxy_ntlm = (conn->proxyntlm.state != NTLMSTATE_NONE); + /* Authentication data is a mix of connection-related and sessionhandle- related stuff. NTLM is connection-related so when we close the shop we shall forget. */ - data->state.authhost.done = FALSE; - data->state.authhost.picked = - data->state.authhost.want; - data->state.authproxy.done = FALSE; - data->state.authproxy.picked = - data->state.authproxy.want; + if (has_host_ntlm) { + data->state.authhost.done = FALSE; + data->state.authhost.picked = + data->state.authhost.want; + } + + if (has_proxy_ntlm) { + data->state.authproxy.done = FALSE; + data->state.authproxy.picked = + data->state.authproxy.want; + } - data->state.authproblem = FALSE; + if (has_host_ntlm || has_proxy_ntlm) { + data->state.authproblem = FALSE; - Curl_ntlm_cleanup(conn); + Curl_ntlm_cleanup(conn); + } } if(conn->handler->disconnect) -- cgit v1.2.3