[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnurl] 35/222: urlapi: CURLU_NO_AUTHORITY allows empty authority/host p
From: |
gnunet |
Subject: |
[gnurl] 35/222: urlapi: CURLU_NO_AUTHORITY allows empty authority/host part |
Date: |
Thu, 07 Nov 2019 00:08:51 +0100 |
This is an automated email from the git hooks/post-receive script.
ng0 pushed a commit to branch master
in repository gnurl.
commit 0a4ecbdf1c35de3a0a367db73edbf50fabc0fb0e
Author: Jens Finkhaeuser <address@hidden>
AuthorDate: Thu Sep 19 15:54:53 2019 +0200
urlapi: CURLU_NO_AUTHORITY allows empty authority/host part
CURLU_NO_AUTHORITY is intended for use with unknown schemes (i.e. not
"file:///") to override cURL's default demand that an authority exists.
Closes #4349
---
docs/libcurl/curl_url_set.3 | 6 ++++++
docs/libcurl/symbols-in-versions | 1 +
include/curl/urlapi.h | 2 ++
lib/urlapi.c | 36 +++++++++++++++++++++++++-----------
tests/libtest/lib1560.c | 23 +++++++++++++++++++++++
5 files changed, 57 insertions(+), 11 deletions(-)
diff --git a/docs/libcurl/curl_url_set.3 b/docs/libcurl/curl_url_set.3
index 43d741220..e2e2c1887 100644
--- a/docs/libcurl/curl_url_set.3
+++ b/docs/libcurl/curl_url_set.3
@@ -111,6 +111,12 @@ instead "guesses" which scheme that was intended based on
the host name. If
the outermost sub-domain name matches DICT, FTP, IMAP, LDAP, POP3 or SMTP then
that scheme will be used, otherwise it picks HTTP. Conflicts with the
\fICURLU_DEFAULT_SCHEME\fP option which takes precedence if both are set.
+.IP CURLU_NO_AUTHORITY
+If set, skips authority checks. The RFC allows individual schemes to omit the
+host part (normally the only mandatory part of the authority), but libcurl
+cannot know whether this is permitted for custom schemes. Specifying the flag
+permits empty authority sections, similar to how file scheme is handled.
+
.SH RETURN VALUE
Returns a CURLUcode error value, which is CURLUE_OK (0) if everything went
fine.
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index 9daad949f..ff0dfb238 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -779,6 +779,7 @@ CURLU_DISALLOW_USER 7.62.0
CURLU_GUESS_SCHEME 7.62.0
CURLU_NON_SUPPORT_SCHEME 7.62.0
CURLU_NO_DEFAULT_PORT 7.62.0
+CURLU_NO_AUTHORITY 7.67.0
CURLU_PATH_AS_IS 7.62.0
CURLU_URLDECODE 7.62.0
CURLU_URLENCODE 7.62.0
diff --git a/include/curl/urlapi.h b/include/curl/urlapi.h
index 0f2f152f1..f2d06770d 100644
--- a/include/curl/urlapi.h
+++ b/include/curl/urlapi.h
@@ -77,6 +77,8 @@ typedef enum {
#define CURLU_URLENCODE (1<<7) /* URL encode on set */
#define CURLU_APPENDQUERY (1<<8) /* append a form style part */
#define CURLU_GUESS_SCHEME (1<<9) /* legacy curl-style guessing */
+#define CURLU_NO_AUTHORITY (1<<10) /* Allow empty authority when the
+ scheme is unknown. */
typedef struct Curl_URL CURLU;
diff --git a/lib/urlapi.c b/lib/urlapi.c
index a0ee331da..6e414cf18 100644
--- a/lib/urlapi.c
+++ b/lib/urlapi.c
@@ -784,6 +784,7 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned
int flags)
if(junkscan(schemep))
return CURLUE_MALFORMED_INPUT;
+
}
else {
/* no scheme! */
@@ -804,11 +805,14 @@ static CURLUcode seturl(const char *url, CURLU *u,
unsigned int flags)
p++;
len = p - hostp;
- if(!len)
- return CURLUE_MALFORMED_INPUT;
-
- memcpy(hostname, hostp, len);
- hostname[len] = 0;
+ if(len) {
+ memcpy(hostname, hostp, len);
+ hostname[len] = 0;
+ }
+ else {
+ if(!(flags & CURLU_NO_AUTHORITY))
+ return CURLUE_MALFORMED_INPUT;
+ }
if((flags & CURLU_GUESS_SCHEME) && !schemep) {
/* legacy curl-style guess based on host name */
@@ -889,9 +893,14 @@ static CURLUcode seturl(const char *url, CURLU *u,
unsigned int flags)
if(result)
return result;
- result = hostname_check(u, hostname);
- if(result)
- return result;
+ if(0 == strlen(hostname) && (flags & CURLU_NO_AUTHORITY)) {
+ /* Skip hostname check, it's allowed to be empty. */
+ }
+ else {
+ result = hostname_check(u, hostname);
+ if(result)
+ return result;
+ }
u->host = strdup(hostname);
if(!u->host)
@@ -1432,9 +1441,14 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what,
}
if(what == CURLUPART_HOST) {
- if(hostname_check(u, (char *)newp)) {
- free((char *)newp);
- return CURLUE_MALFORMED_INPUT;
+ if(0 == strlen(newp) && (flags & CURLU_NO_AUTHORITY)) {
+ /* Skip hostname check, it's allowed to be empty. */
+ }
+ else {
+ if(hostname_check(u, (char *)newp)) {
+ free((char *)newp);
+ return CURLUE_MALFORMED_INPUT;
+ }
}
}
diff --git a/tests/libtest/lib1560.c b/tests/libtest/lib1560.c
index 85884474e..d161423e3 100644
--- a/tests/libtest/lib1560.c
+++ b/tests/libtest/lib1560.c
@@ -414,6 +414,18 @@ static struct urltestcase get_url_list[] = {
{"tp://example.com/path/html",
"tp://example.com/path/html",
CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
+ {"custom-scheme://host?expected=test-good",
+ "custom-scheme://host/?expected=test-good",
+ CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
+ {"custom-scheme://?expected=test-bad",
+ "",
+ CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
+ {"custom-scheme://?expected=test-new-good",
+ "custom-scheme:///?expected=test-new-good",
+ CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
+ {"custom-scheme://host?expected=test-still-good",
+ "custom-scheme://host/?expected=test-still-good",
+ CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
{NULL, NULL, 0, 0, 0}
};
@@ -551,6 +563,17 @@ static struct setcase set_parts_list[] = {
"scheme=ftp,",
"ftp://example.com:80/",
0, 0, CURLUE_OK, CURLUE_OK},
+ {"custom-scheme://host",
+ "host=\"\",",
+ "custom-scheme://host/",
+ CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK,
+ CURLUE_MALFORMED_INPUT},
+ {"custom-scheme://host",
+ "host=\"\",",
+ "custom-scheme:///",
+ CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY,
+ CURLUE_OK, CURLUE_OK},
+
{NULL, NULL, NULL, 0, 0, 0, 0}
};
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [gnurl] 36/222: doh: avoid truncating DNS QTYPE to lower octet, (continued)
- [gnurl] 36/222: doh: avoid truncating DNS QTYPE to lower octet, gnunet, 2019/11/06
- [gnurl] 29/222: FTP: remove trailing slash from path for LIST/MLSD, gnunet, 2019/11/06
- [gnurl] 43/222: url: remove dead code, gnunet, 2019/11/06
- [gnurl] 42/222: url: part of expression is always true: (bundle->multiuse == 0), gnunet, 2019/11/06
- [gnurl] 44/222: version: Expression 'left > 1' is always true, gnunet, 2019/11/06
- [gnurl] 34/222: version: next release will be 7.67.0, gnunet, 2019/11/06
- [gnurl] 33/222: RELEASE-NOTES: synced, gnunet, 2019/11/06
- [gnurl] 31/222: README: add OSS-Fuzz badge [skip ci], gnunet, 2019/11/06
- [gnurl] 40/222: ftp: Expression 'ftpc->wait_data_conn' is always false, gnunet, 2019/11/06
- [gnurl] 45/222: netrc: part of conditional expression is always true: !done, gnunet, 2019/11/06
- [gnurl] 35/222: urlapi: CURLU_NO_AUTHORITY allows empty authority/host part,
gnunet <=
- [gnurl] 38/222: ftp: part of conditional expression is always true: !result, gnunet, 2019/11/06
- [gnurl] 37/222: http: fix Expression 'http->postdata' is always false, gnunet, 2019/11/06
- [gnurl] 41/222: ftp: the conditional expression is always true, gnunet, 2019/11/06
- [gnurl] 54/222: urlapi: Expression 'storep' is always true, gnunet, 2019/11/06
- [gnurl] 47/222: multi: value '2L' is assigned to a boolean, gnunet, 2019/11/06
- [gnurl] 55/222: libssh2: part of conditional expression is always true: !result, gnunet, 2019/11/06
- [gnurl] 53/222: urlapi: 'scheme' is always true, gnunet, 2019/11/06
- [gnurl] 58/222: tool_operate: removed unused variable 'done', gnunet, 2019/11/06
- [gnurl] 59/222: travis: use go master, gnunet, 2019/11/06
- [gnurl] 61/222: ngtcp2: compile with latest ngtcp2 + nghttp3 draft-23, gnunet, 2019/11/06