summaryrefslogtreecommitdiff
path: root/src/UriFile.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhsoting.net>2018-09-09 08:50:22 +0200
committerJörg Frings-Fürst <debian@jff-webhsoting.net>2018-09-09 08:50:22 +0200
commitcc175e2048d967ddb8f3e54587938072150bbc7c (patch)
treecc3d2dfdcc29a1a46c6f3cd323edee805c90c437 /src/UriFile.c
parentf10130df30ed342e6064aa60d2a56f5107385d6b (diff)
parent88c5a2de8655da11adc5999be9b2dccc6632f07b (diff)
Merge branch 'release/debian/0.8.6-1'debian/0.8.6-1
Diffstat (limited to 'src/UriFile.c')
-rw-r--r--src/UriFile.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/UriFile.c b/src/UriFile.c
index 332f6a9..303ee49 100644
--- a/src/UriFile.c
+++ b/src/UriFile.c
@@ -104,7 +104,7 @@ static URI_INLINE int URI_FUNC(FilenameToUriString)(const URI_CHAR * filename,
if ((input[0] == _UT('\0'))
|| (fromUnix && input[0] == _UT('/'))
|| (!fromUnix && input[0] == _UT('\\'))) {
- /* Copy text after last seperator */
+ /* Copy text after last separator */
if (lastSep + 1 < input) {
if (!fromUnix && absolute && (firstSegment == URI_TRUE)) {
/* Quick hack to not convert "C:" to "C%3A" */
@@ -148,13 +148,17 @@ static URI_INLINE int URI_FUNC(UriStringToFilename)(const URI_CHAR * uriString,
}
{
- const UriBool file_two_slashes =
- URI_STRNCMP(uriString, _UT("file://"), URI_STRLEN(_UT("file://"))) == 0;
- const UriBool file_three_slashes = file_two_slashes
+ const UriBool file_unknown_slashes =
+ URI_STRNCMP(uriString, _UT("file:"), URI_STRLEN(_UT("file:"))) == 0;
+ const UriBool file_one_or_more_slashes = file_unknown_slashes
+ && (URI_STRNCMP(uriString, _UT("file:/"), URI_STRLEN(_UT("file:/"))) == 0);
+ const UriBool file_two_or_more_slashes = file_one_or_more_slashes
+ && (URI_STRNCMP(uriString, _UT("file://"), URI_STRLEN(_UT("file://"))) == 0);
+ const UriBool file_three_or_more_slashes = file_two_or_more_slashes
&& (URI_STRNCMP(uriString, _UT("file:///"), URI_STRLEN(_UT("file:///"))) == 0);
- const size_t charsToSkip = file_two_slashes
- ? file_three_slashes
+ const size_t charsToSkip = file_two_or_more_slashes
+ ? file_three_or_more_slashes
? toUnix
/* file:///bin/bash */
? URI_STRLEN(_UT("file://"))
@@ -162,13 +166,21 @@ static URI_INLINE int URI_FUNC(UriStringToFilename)(const URI_CHAR * uriString,
: URI_STRLEN(_UT("file:///"))
/* file://Server01/Letter.txt */
: URI_STRLEN(_UT("file://"))
- : 0;
+ : ((file_one_or_more_slashes && toUnix)
+ /* file:/bin/bash */
+ /* https://tools.ietf.org/html/rfc8089#appendix-B */
+ ? URI_STRLEN(_UT("file:"))
+ : ((! toUnix && file_unknown_slashes && ! file_one_or_more_slashes)
+ /* file:c:/path/to/file */
+ /* https://tools.ietf.org/html/rfc8089#appendix-E.2 */
+ ? URI_STRLEN(_UT("file:"))
+ : 0));
const size_t charsToCopy = URI_STRLEN(uriString + charsToSkip) + 1;
const UriBool is_windows_network_with_authority =
(toUnix == URI_FALSE)
- && file_two_slashes
- && ! file_three_slashes;
+ && file_two_or_more_slashes
+ && ! file_three_or_more_slashes;
URI_CHAR * const unescape_target = is_windows_network_with_authority
? (filename + 2)