Module: wine Branch: master Commit: b7c68573ae5603ac28d268b52a78bc4b2093e5ee URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7c68573ae5603ac28d268b52a...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Jul 22 09:39:30 2010 +0200
shlwapi: Improved UrlCanonicalizeW implementation.
---
dlls/shlwapi/tests/url.c | 4 +++ dlls/shlwapi/url.c | 50 +++++++++++++++++++++++----------------------- 2 files changed, 29 insertions(+), 25 deletions(-)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 52bba21..adaba9f 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -100,6 +100,8 @@ typedef struct _TEST_URL_CANONICALIZE {
static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = { {"http://www.winehq.org/tests/../tests/../..", 0, S_OK, "http://www.winehq.org/", TRUE}, + {"http://www.winehq.org/..", 0, S_OK, "http://www.winehq.org/..", FALSE}, + {"http://www.winehq.org/tests/tests2/../../tests", 0, S_OK, "http://www.winehq.org/tests", FALSE}, {"http://www.winehq.org/tests/../tests", 0, S_OK, "http://www.winehq.org/tests", FALSE}, {"http://www.winehq.org/tests%5Cn", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, S_OK, "http://www.winehq.org/tests", FALSE}, {"http://www.winehq.org/tests%5Cr", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, S_OK, "http://www.winehq.org/tests", FALSE}, @@ -158,6 +160,8 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = { {"res://c:\tests/res\foo%20bar/strange\sth", URL_FILE_USE_PATHURL, S_OK, "res://c:\tests/res\foo%20bar/strange\sth", FALSE}, {"res://c:\tests/res\foo%20bar/strange\sth", URL_UNESCAPE, S_OK, "res://c:\tests/res\foo bar/strange\sth", FALSE}, {"A", 0, S_OK, "A", FALSE}, + {"../A", 0, S_OK, "../A", FALSE}, + {"A/../B", 0, S_OK, "B", TRUE}, {"/uri-res/N2R?urn:sha1:B3K", URL_DONT_ESCAPE_EXTRA_INFO | URL_WININET_COMPATIBILITY /*0x82000000*/, S_OK, "/uri-res/N2R?urn:sha1:B3K", FALSE} /*LimeWire online installer calls this*/, {"http:www.winehq.org/dir/../index.html", 0, S_OK, "http:www.winehq.org/index.html"}, {"http://localhost/test.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/test.html%22%7D, diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c index 7ca4cf7..2f09bc7 100644 --- a/dlls/shlwapi/url.c +++ b/dlls/shlwapi/url.c @@ -444,38 +444,38 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, *wk2++ = *wk1; wk1++;
- if (*wk1 == '.') { + while (*wk1 == '.') { TRACE("found '/.'\n"); if (wk1[1] == '/' || wk1[1] == '\') { /* case of /./ -> skip the ./ */ wk1 += 2; } - else if (wk1[1] == '.') { - /* found /.. look for next / */ - TRACE("found '/..'\n"); - if (wk1[2] == '/' || wk1[2] == '\' ||wk1[2] == '?' - || wk1[2] == '#' || !wk1[2]) { - /* case /../ -> need to backup wk2 */ - TRACE("found '/../'\n"); - *(wk2-1) = '\0'; /* set end of string */ - mp = strrchrW(root, '/'); - mp2 = strrchrW(root, '\'); - if(mp2 && (!mp || mp2 < mp)) - mp = mp2; - if (mp && (mp >= root)) { - /* found valid backup point */ - wk2 = mp + 1; - if(wk1[2] != '/' && wk1[2] != '\') - wk1 += 2; - else - wk1 += 3; - } - else { - /* did not find point, restore '/' */ - *(wk2-1) = slash; - } + else if (wk1[1] == '.' && (wk1[2] == '/' + || wk1[2] == '\' || wk1[2] == '?' + || wk1[2] == '#' || !wk1[2])) { + /* case /../ -> need to backup wk2 */ + TRACE("found '/../'\n"); + *(wk2-1) = '\0'; /* set end of string */ + mp = strrchrW(root, '/'); + mp2 = strrchrW(root, '\'); + if(mp2 && (!mp || mp2 < mp)) + mp = mp2; + if (mp && (mp >= root)) { + /* found valid backup point */ + wk2 = mp + 1; + if(wk1[2] != '/' && wk1[2] != '\') + wk1 += 2; + else + wk1 += 3; + } + else { + /* did not find point, restore '/' */ + *(wk2-1) = slash; + break; } } + else + break; } } *wk2 = '\0';