mirror of
https://github.com/moparisthebest/curl
synced 2024-11-13 21:15:08 -05:00
file: restore old behavior for file:////foo/bar URLs
curl 7.57.0 and up interpret this according to Appendix E.3.2 of RFC 8089 but then returns an error saying this is unimplemented. This is actually a regression in behavior on both Windows and Unix. Before curl 7.57.0 this URL was treated as a path of "//foo/bar" and then passed to the relevant OS API. This means that the behavior of this case is actually OS dependent. The Unix path resolution rules say that the OS must handle swallowing the extra "/" and so this path is the same as "/foo/bar" The Windows path resolution rules say that this is a UNC path and automatically handles the SMB access for the program. So curl on Windows was already doing Appendix E.3.2 without any special code in curl. Regression Closes #2438
This commit is contained in:
parent
2536e2450b
commit
695e96b3d5
28
lib/url.c
28
lib/url.c
@ -2067,15 +2067,6 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
|
|||||||
return CURLE_URL_MALFORMAT;
|
return CURLE_URL_MALFORMAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(url_has_scheme && path[0] == '/' && path[1] == '/' &&
|
|
||||||
path[2] == '/' && path[3] == '/') {
|
|
||||||
/* This appears to be a UNC string (usually indicating a SMB share).
|
|
||||||
* We don't do SMB in file: URLs. (TODO?)
|
|
||||||
*/
|
|
||||||
failf(data, "SMB shares are not supported in file: URLs.");
|
|
||||||
return CURLE_URL_MALFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extra handling URLs with an authority component (i.e. that start with
|
/* Extra handling URLs with an authority component (i.e. that start with
|
||||||
* "file://")
|
* "file://")
|
||||||
*
|
*
|
||||||
@ -2114,25 +2105,6 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
|
|||||||
ptr += 9; /* now points to the slash after the host */
|
ptr += 9; /* now points to the slash after the host */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* RFC 8089, Appendix D, Section D.1, says:
|
|
||||||
*
|
|
||||||
* > In a POSIX file system, the root of the file system is represented
|
|
||||||
* > as a directory with a zero-length name, usually written as "/"; the
|
|
||||||
* > presence of this root in a file URI can be taken as given by the
|
|
||||||
* > initial slash in the "path-absolute" rule.
|
|
||||||
*
|
|
||||||
* i.e. the first slash is part of the path.
|
|
||||||
*
|
|
||||||
* However in RFC 1738 the "/" between the host (or port) and the
|
|
||||||
* URL-path was NOT part of the URL-path. Any agent that followed the
|
|
||||||
* older spec strictly, and wanted to refer to a file with an absolute
|
|
||||||
* path, would have included a second slash. So if there are two
|
|
||||||
* slashes, swallow one.
|
|
||||||
*/
|
|
||||||
if('/' == ptr[1]) /* note: the only way ptr[0]!='/' is if ptr[1]==':' */
|
|
||||||
ptr++;
|
|
||||||
|
|
||||||
/* This cannot be done with strcpy, as the memory chunks overlap! */
|
/* This cannot be done with strcpy, as the memory chunks overlap! */
|
||||||
memmove(path, ptr, strlen(ptr) + 1);
|
memmove(path, ptr, strlen(ptr) + 1);
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,13 @@ FILE
|
|||||||
</info>
|
</info>
|
||||||
|
|
||||||
<reply>
|
<reply>
|
||||||
|
<data>
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
bar
|
||||||
|
foo
|
||||||
|
moo
|
||||||
|
</data>
|
||||||
</reply>
|
</reply>
|
||||||
|
|
||||||
# Client-side
|
# Client-side
|
||||||
@ -14,12 +21,15 @@ FILE
|
|||||||
file
|
file
|
||||||
</server>
|
</server>
|
||||||
<name>
|
<name>
|
||||||
file:// with SMB path
|
file:// with unix path resolution behavior for the case of extra slashes
|
||||||
</name>
|
</name>
|
||||||
<command>
|
<command>
|
||||||
file:////bad-host%PWD/log/test1145.txt
|
file:////%PWD/log/test2072.txt
|
||||||
</command>
|
</command>
|
||||||
<file name="log/test1145.txt">
|
<precheck>
|
||||||
|
perl -e "print 'Test requires a unix system' if ( $^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'dos');"
|
||||||
|
</precheck>
|
||||||
|
<file name="log/test2072.txt">
|
||||||
foo
|
foo
|
||||||
bar
|
bar
|
||||||
bar
|
bar
|
||||||
@ -30,9 +40,5 @@ moo
|
|||||||
|
|
||||||
# Verify data after the test has been "shot"
|
# Verify data after the test has been "shot"
|
||||||
<verify>
|
<verify>
|
||||||
# CURLE_URL_MALFORMAT is error code 3
|
|
||||||
<errorcode>
|
|
||||||
3
|
|
||||||
</errorcode>
|
|
||||||
</verify>
|
</verify>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
Loading…
Reference in New Issue
Block a user