]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
parse_proxy: use the IPv6 zone id if given
authorDaniel Stenberg <daniel@haxx.se>
Tue, 21 May 2019 13:02:41 +0000 (15:02 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 22 May 2019 07:45:43 +0000 (09:45 +0200)
If the proxy string is given as an IPv6 numerical address with a zone
id, make sure to use that for the connect to the proxy.

Reported-by: Edmond Yu
Fixes #3482
Closes #3918

lib/url.c

index c441ae7165a8fb15b31c4492babfd7faa1c35906..16d910b71f3b3f3b29c6d4cf8ff809763c114ea5 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1883,6 +1883,40 @@ CURLcode Curl_uc_to_curlcode(CURLUcode uc)
   }
 }
 
+/*
+ * If the URL was set with an IPv6 numerical address with a zone id part, set
+ * the scope_id based on that!
+ */
+
+static void zonefrom_url(CURLU *uh, struct connectdata *conn)
+{
+  char *zoneid;
+  CURLUcode uc;
+
+  uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
+
+  if(!uc && zoneid) {
+    char *endp;
+    unsigned long scope = strtoul(zoneid, &endp, 10);
+    if(!*endp && (scope < UINT_MAX))
+      /* A plain number, use it direcly as a scope id. */
+      conn->scope_id = (unsigned int)scope;
+#ifdef HAVE_IF_NAMETOINDEX
+    else {
+      /* Zone identifier is not numeric */
+      unsigned int scopeidx = 0;
+      scopeidx = if_nametoindex(zoneid);
+      if(!scopeidx)
+        infof(conn->data, "Invalid zoneid: %s; %s\n", zoneid,
+              strerror(errno));
+      else
+        conn->scope_id = scopeidx;
+    }
+#endif /* HAVE_IF_NAMETOINDEX */
+    free(zoneid);
+  }
+}
+
 /*
  * Parse URL and fill in the relevant members of the connection struct.
  */
@@ -2004,38 +2038,14 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
   if(hostname[0] == '[') {
     /* This looks like an IPv6 address literal. See if there is an address
        scope. */
-    char *zoneid;
     size_t hlen;
-    uc = curl_url_get(uh, CURLUPART_ZONEID, &zoneid, 0);
     conn->bits.ipv6_ip = TRUE;
-
     /* cut off the brackets! */
     hostname++;
     hlen = strlen(hostname);
     hostname[hlen - 1] = 0;
-    if(!uc && zoneid) {
-      char *endp;
-      unsigned long scope;
-      scope = strtoul(zoneid, &endp, 10);
-      if(!*endp && (scope < UINT_MAX)) {
-        /* A plain number, use it direcly as a scope id. */
-        conn->scope_id = (unsigned int)scope;
-      }
-#ifdef HAVE_IF_NAMETOINDEX
-      else {
-        /* Zone identifier is not numeric */
-        unsigned int scopeidx = 0;
-        scopeidx = if_nametoindex(zoneid);
-        if(!scopeidx)
-          infof(data, "Invalid zoneid id: %s; %s\n", zoneid,
-                strerror(errno));
-        else
-          conn->scope_id = scopeidx;
 
-      }
-#endif /* HAVE_IF_NAMETOINDEX */
-      free(zoneid);
-    }
+    zonefrom_url(uh, conn);
   }
 
   /* make sure the connect struct gets its own copy of the host name */
@@ -2422,6 +2432,7 @@ static CURLcode parse_proxy(struct Curl_easy *data,
     size_t len = strlen(host);
     host[len-1] = 0; /* clear the trailing bracket */
     host++;
+    zonefrom_url(uhp, conn);
   }
   proxyinfo->host.name = host;