]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
connect: set socktype/protocol correctly
authorDaniel Stenberg <daniel@haxx.se>
Mon, 8 Aug 2022 10:36:41 +0000 (12:36 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 8 Aug 2022 11:26:11 +0000 (13:26 +0200)
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
lib/url.c
lib/urldata.h

index 68cfe72ef144f1f716100bf9491bb768ac6f8fcf..38f75e09f2eee0925f3868f0609e968a7fcfe441 100644 (file)
@@ -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))
index 426528fb5e8c7092d8aca3e24f4660b36d4fd196..a57c8da9faa40851eea1d5515fb3820e5790085d 100644 (file)
--- 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
index 34967fb28ac22c6622cf97eeba7914c459956bb0..d8c3f6f593831834b796217eff934198d7e5ce33 100644 (file)
@@ -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! */