← Commit list

f1959ae962

tiymat
tiymat
2026-05-28
SUCCESS Duration: 248s

Subject

urlapi: fix an issue parsing file URLs

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

lib/urlapi.c+7 -1
@@ -876,13 +876,19 @@ UNITTEST CURLUcode parse_file(const char *url, size_t urllen, CURLU *u,
path = &url[5];
pathlen = urllen - 5;
+ /* RFC 8089: file-hier-part = ( "//" auth-path ) / local-path, where
+ local-path also starts with a "/". So reject anything that doesn't
+ start with at least one "/" */
+ if(path[0] != '/')
+ return CURLUE_BAD_FILE_URL;
+
/* Extra handling URLs with an authority component (i.e. that start with
* "file://")
*
* We allow omitted hostname (e.g. file:/<path>) -- valid according to
* RFC 8089, but not the (current) WHAT-WG URL spec.
*/
- if(path[0] == '/' && path[1] == '/') {
+ if(path[1] == '/') {
/* swallow the two slashes */
const char *ptr = &path[2];
tests/libtest/lib1560.c+5 -1
@@ -886,7 +886,11 @@ static const struct urltestcase get_url_list[] = {
{"file:///.", "file:///", 0, 0, CURLUE_OK},
{"file:///./", "file:///", 0, 0, CURLUE_OK},
{"file:///a", "file:///a", 0, 0, CURLUE_OK},
- {"file:./", "file://", 0, 0, CURLUE_OK},
+ {"file:./", "", 0, 0, CURLUE_BAD_FILE_URL},
+ {"file:foo", "", 0, 0, CURLUE_BAD_FILE_URL},
+ {"file:foo/bar", "", 0, 0, CURLUE_BAD_FILE_URL},
+ {"file:?q", "", 0, 0, CURLUE_BAD_FILE_URL},
+ {"file:#f", "", 0, 0, CURLUE_BAD_FILE_URL},
{"http://example.com/hello/../here",
"http://example.com/hello/../here",
CURLU_PATH_AS_IS, 0, CURLUE_OK},
tests/unit/unit1675.c+4 -0
@@ -267,6 +267,10 @@ static CURLcode test_unit1675(const char *arg)
{"file:///etc/hosts", "/etc/hosts", TRUE},
{"file://localhost/etc/hosts", "/etc/hosts", TRUE},
{"file://apple/etc/hosts", "/etc/hosts", FALSE},
+ {"file:foo", NULL, FALSE},
+ {"file:./", NULL, FALSE},
+ {"file:?q", NULL, FALSE},
+ {"file:#f", NULL, FALSE},
#ifdef _WIN32
{"file:///c:/windows/system32", "c:/windows/system32", TRUE},
{"file://localhost/c:/windows/system32", "c:/windows/system32", TRUE},