summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Piekarski <ppiekarski@cinemo.com>2020-01-20 18:02:09 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-01-24 17:00:58 +0100
commit34e6bc42b0650c48504a286020dcda85180e05e2 (patch)
tree34c863c0c111282885276ebbb571431b134ecfa7
parentc0d7b05c41cc58144d78db022212b8d4d248c9bf (diff)
downloadcurl-34e6bc42b0650c48504a286020dcda85180e05e2.tar.gz
conn: do not reuse connection if SOCKS proxy credentials differ
Closes #4835
-rw-r--r--lib/url.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/lib/url.c b/lib/url.c
index d73eede16..689668e04 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -882,9 +882,37 @@ proxy_info_matches(const struct proxy_info* data,
return FALSE;
}
+
+static bool
+socks_proxy_info_matches(const struct proxy_info* data,
+ const struct proxy_info* needle)
+{
+ if(!proxy_info_matches(data, needle))
+ return FALSE;
+
+ /* the user information is case-sensitive
+ or at least it is not defined as case-insensitive
+ see https://tools.ietf.org/html/rfc3986#section-3.2.1 */
+ if((data->user == NULL) != (needle->user == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->user &&
+ needle->user &&
+ strcmp(data->user, needle->user) != 0)
+ return FALSE;
+ if((data->passwd == NULL) != (needle->passwd == NULL))
+ return FALSE;
+ /* curl_strequal does a case insentive comparison, so do not use it here! */
+ if(data->passwd &&
+ needle->passwd &&
+ strcmp(data->passwd, needle->passwd) != 0)
+ return FALSE;
+ return TRUE;
+}
#else
/* disabled, won't get called */
#define proxy_info_matches(x,y) FALSE
+#define socks_proxy_info_matches(x,y) FALSE
#endif
/* A connection has to have been idle for a shorter time than 'maxage_conn' to
@@ -1143,8 +1171,9 @@ ConnectionExists(struct Curl_easy *data,
needle->bits.socksproxy != check->bits.socksproxy)
continue;
- if(needle->bits.socksproxy && !proxy_info_matches(&needle->socks_proxy,
- &check->socks_proxy))
+ if(needle->bits.socksproxy &&
+ !socks_proxy_info_matches(&needle->socks_proxy,
+ &check->socks_proxy))
continue;
if(needle->bits.conn_to_host != check->bits.conn_to_host)