From 0f23341953d1000ef55949519fa58d5f00759bbb Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 8 Aug 2022 12:36:41 +0200 Subject: [PATCH] connect: set socktype/protocol correctly MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit So that an address used from the DNS cache that was previously used for QUIC can be reused for TCP and vice versa. To make this possible, set conn->transport to "unix" for unix domain connections ... and store the transport struct field in an unsigned char to use less space. Reported-by: ウさん Fixes #9274 Closes #9276 --- lib/connect.c | 17 ++++++++++++++--- lib/url.c | 1 + lib/urldata.h | 12 ++++++------ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/connect.c b/lib/connect.c index 68cfe72ef1..38f75e09f2 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -1604,9 +1604,20 @@ CURLcode Curl_socket(struct Curl_easy *data, */ addr->family = ai->ai_family; - addr->socktype = (conn->transport == TRNSPRT_TCP) ? SOCK_STREAM : SOCK_DGRAM; - addr->protocol = conn->transport != TRNSPRT_TCP ? IPPROTO_UDP : - ai->ai_protocol; + switch(conn->transport) { + case TRNSPRT_TCP: + addr->socktype = SOCK_STREAM; + addr->protocol = IPPROTO_TCP; + break; + case TRNSPRT_UNIX: + addr->socktype = SOCK_STREAM; + addr->protocol = IPPROTO_IP; + break; + default: /* UDP and QUIC */ + addr->socktype = SOCK_DGRAM; + addr->protocol = IPPROTO_UDP; + break; + } addr->addrlen = ai->ai_addrlen; if(addr->addrlen > sizeof(struct Curl_sockaddr_storage)) diff --git a/lib/url.c b/lib/url.c index 426528fb5e..a57c8da9fa 100644 --- a/lib/url.c +++ b/lib/url.c @@ -3477,6 +3477,7 @@ static CURLcode resolve_server(struct Curl_easy *data, free(hostaddr); hostaddr = NULL; } + conn->transport = TRNSPRT_UNIX; } } else diff --git a/lib/urldata.h b/lib/urldata.h index 34967fb28a..d8c3f6f593 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -879,6 +879,11 @@ struct connstate { unsigned char *outp; /* send from this pointer */ }; +#define TRNSPRT_TCP 3 +#define TRNSPRT_UDP 4 +#define TRNSPRT_QUIC 5 +#define TRNSPRT_UNIX 6 + /* * The connectdata struct contains all fields and variables that should be * unique for an entire connection. @@ -919,12 +924,7 @@ struct connectdata { #ifdef ENABLE_IPV6 unsigned int scope_id; /* Scope id for IPv6 */ #endif - - enum { - TRNSPRT_TCP = 3, - TRNSPRT_UDP = 4, - TRNSPRT_QUIC = 5 - } transport; + unsigned char transport; /* one of the TRNSPRT_* defines */ #ifdef ENABLE_QUIC struct quicsocket hequic[2]; /* two, for happy eyeballs! */ -- 2.47.3