aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Boukris <iboukris@gmail.com>2016-11-07 21:25:44 +0200
committerPeter Wu <peter@lekensteyn.nl>2016-11-17 17:34:02 +0100
commit0b8d682f81ee9acb763dd4c9ad805fe08d1227c0 (patch)
treef6541f17df4607094640e4456d6fc15b48b65f35
parent2ece147cc216b470023448ddcc7f5359465998b2 (diff)
Don't mix unix domain sockets with regular ones
When reusing a connection, make sure the unix domain socket option matches.
-rw-r--r--lib/url.c36
-rw-r--r--lib/urldata.h4
2 files changed, 35 insertions, 5 deletions
diff --git a/lib/url.c b/lib/url.c
index c680534a4..ed74f3e3f 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -2800,6 +2800,10 @@ static void conn_free(struct connectdata *conn)
Curl_safefree(conn->localdev);
Curl_free_ssl_config(&conn->ssl_config);
+#ifdef USE_UNIX_SOCKETS
+ Curl_safefree(conn->unix_domain_socket);
+#endif
+
free(conn); /* free all the connection oriented data */
}
@@ -3329,6 +3333,17 @@ ConnectionExists(struct Curl_easy *data,
}
}
+#ifdef USE_UNIX_SOCKETS
+ if(needle->unix_domain_socket) {
+ if(!check->unix_domain_socket)
+ continue;
+ if(strcmp(needle->unix_domain_socket, check->unix_domain_socket))
+ continue;
+ }
+ else if(check->unix_domain_socket)
+ continue;
+#endif
+
if((needle->handler->flags&PROTOPT_SSL) !=
(check->handler->flags&PROTOPT_SSL))
/* don't do mixed SSL and non-SSL connections */
@@ -5539,11 +5554,11 @@ static CURLcode resolve_server(struct Curl_easy *data,
struct Curl_dns_entry *hostaddr;
#ifdef USE_UNIX_SOCKETS
- if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
+ if(conn->unix_domain_socket) {
/* Unix domain sockets are local. The host gets ignored, just use the
* specified domain socket address. Do not cache "DNS entries". There is
* no DNS involved and we already have the filesystem path available */
- const char *path = data->set.str[STRING_UNIX_SOCKET_PATH];
+ const char *path = conn->unix_domain_socket;
hostaddr = calloc(1, sizeof(struct Curl_dns_entry));
if(!hostaddr)
@@ -5694,6 +5709,10 @@ static void reuse_conn(struct connectdata *old_conn,
old_conn->recv_pipe = NULL;
Curl_safefree(old_conn->master_buffer);
+
+#ifdef USE_UNIX_SOCKETS
+ Curl_safefree(old_conn->unix_domain_socket);
+#endif
}
/**
@@ -5900,9 +5919,16 @@ static CURLcode create_conn(struct Curl_easy *data,
proxy = detect_proxy(conn);
#ifdef USE_UNIX_SOCKETS
- if(proxy && data->set.str[STRING_UNIX_SOCKET_PATH]) {
- free(proxy); /* Unix domain sockets cannot be proxied, so disable it */
- proxy = NULL;
+ if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
+ if(proxy) {
+ free(proxy); /* Unix domain sockets cannot be proxied, so disable it */
+ proxy = NULL;
+ }
+ conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
+ if(conn->unix_domain_socket == NULL) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto out;
+ }
}
#endif
diff --git a/lib/urldata.h b/lib/urldata.h
index 0aed9eaa5..921407354 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1099,6 +1099,10 @@ struct connectdata {
struct connectbundle *bundle; /* The bundle we are member of */
int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
+
+#ifdef USE_UNIX_SOCKETS
+ char *unix_domain_socket;
+#endif
};
/* The end of connectdata. */