113 lines
2.7 KiB
Diff
113 lines
2.7 KiB
Diff
From 49e244318672c688097c1bf601a110005cd9a6a8 Mon Sep 17 00:00:00 2001
|
|
From: Daniel Stenberg <daniel@haxx.se>
|
|
Date: Mon, 31 Jul 2023 10:07:35 +0200
|
|
Subject: [PATCH] urlapi: make sure zoneid is also duplicated in curl_url_dup
|
|
|
|
Add several curl_url_dup() tests to the general lib1560 test.
|
|
|
|
Reported-by: Rutger Broekhoff
|
|
Bug: https://curl.se/mail/lib-2023-07/0047.html
|
|
Closes #11549
|
|
|
|
Conflict: tests/libtest/lib1560.c for context adapt
|
|
Reference: https://github.com/curl/curl/commit/49e244318672c688097c1bf601a110005cd9a6a8
|
|
---
|
|
lib/urlapi.c | 1 +
|
|
tests/libtest/lib1560.c | 67 +++++++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 68 insertions(+)
|
|
|
|
diff --git a/lib/urlapi.c b/lib/urlapi.c
|
|
index cd423c335d88f..b1a126d548213 100644
|
|
--- a/lib/urlapi.c
|
|
+++ b/lib/urlapi.c
|
|
@@ -1385,6 +1385,7 @@ CURLU *curl_url_dup(const CURLU *in)
|
|
DUP(u, in, path);
|
|
DUP(u, in, query);
|
|
DUP(u, in, fragment);
|
|
+ DUP(u, in, zoneid);
|
|
u->portnum = in->portnum;
|
|
}
|
|
return u;
|
|
diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c
|
|
index 0eca0fda72d0b..ff03bec9391a4 100644
|
|
--- a/tests/libtest/lib1560.c
|
|
+++ b/tests/libtest/lib1560.c
|
|
@@ -1672,10 +1672,77 @@ static int huge(void)
|
|
return error;
|
|
}
|
|
|
|
+static int urldup(void)
|
|
+{
|
|
+ const char *url[] = {
|
|
+ "http://"
|
|
+ "user:pwd@"
|
|
+ "[2a04:4e42:e00::347%25eth0]"
|
|
+ ":80"
|
|
+ "/path"
|
|
+ "?query"
|
|
+ "#fraggie",
|
|
+ "https://example.com",
|
|
+ "https://user@example.com",
|
|
+ "https://user.pwd@example.com",
|
|
+ "https://user.pwd@example.com:1234",
|
|
+ "https://example.com:1234",
|
|
+ "example.com:1234",
|
|
+ "https://user.pwd@example.com:1234/path?query#frag",
|
|
+ NULL
|
|
+ };
|
|
+ CURLU *copy = NULL;
|
|
+ char *h_str = NULL, *copy_str = NULL;
|
|
+ CURLU *h = curl_url();
|
|
+ int i;
|
|
+
|
|
+ if(!h)
|
|
+ goto err;
|
|
+
|
|
+ for(i = 0; url[i]; i++) {
|
|
+ CURLUcode rc = curl_url_set(h, CURLUPART_URL, url[i],
|
|
+ CURLU_GUESS_SCHEME);
|
|
+ if(rc)
|
|
+ goto err;
|
|
+ copy = curl_url_dup(h);
|
|
+
|
|
+ rc = curl_url_get(h, CURLUPART_URL, &h_str, 0);
|
|
+ if(rc)
|
|
+ goto err;
|
|
+
|
|
+ rc = curl_url_get(copy, CURLUPART_URL, ©_str, 0);
|
|
+ if(rc)
|
|
+ goto err;
|
|
+
|
|
+ if(strcmp(h_str, copy_str)) {
|
|
+ printf("Original: %s\nParsed: %s\nCopy: %s\n",
|
|
+ url[i], h_str, copy_str);
|
|
+ goto err;
|
|
+ }
|
|
+ curl_free(copy_str);
|
|
+ curl_free(h_str);
|
|
+ curl_url_cleanup(copy);
|
|
+ copy_str = NULL;
|
|
+ h_str = NULL;
|
|
+ copy = NULL;
|
|
+ }
|
|
+ curl_url_cleanup(h);
|
|
+ return 0;
|
|
+err:
|
|
+ curl_free(copy_str);
|
|
+ curl_free(h_str);
|
|
+ curl_url_cleanup(copy);
|
|
+ curl_url_cleanup(h);
|
|
+ return 1;
|
|
+}
|
|
+
|
|
int test(char *URL)
|
|
{
|
|
(void)URL; /* not used */
|
|
|
|
+ if(urldup())
|
|
+ return 11;
|
|
+
|
|
if(get_url())
|
|
return 3;
|
|
|