Skip to content

Commit

Permalink
Don't mix unix domain sockets with regular ones
Browse files Browse the repository at this point in the history
When reusing a connection, make sure the unix domain
socket option matches.
  • Loading branch information
iboukris authored and Lekensteyn committed Nov 17, 2016
1 parent 2ece147 commit 0b8d682
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
36 changes: 31 additions & 5 deletions lib/url.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
}

Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
}

/**
Expand Down Expand Up @@ -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

Expand Down
4 changes: 4 additions & 0 deletions lib/urldata.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down

0 comments on commit 0b8d682

Please sign in to comment.