From: Daniel Stenberg Date: Mon, 8 Aug 2022 10:36:41 +0000 (+0200) Subject: connect: set socktype/protocol correctly X-Git-Tag: curl-7_85_0~96 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0f23341953d1000ef55949519fa58d5f00759bbb;p=thirdparty%2Fcurl.git connect: set socktype/protocol correctly 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 --- 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! */