Piotr Caban : shlwapi: Improved UrlCanonicalizeW implementation.
Alexandre Julliard
julliard at winehq.org
Thu Jul 22 12:09:32 CDT 2010
Module: wine
Branch: master
Commit: b7c68573ae5603ac28d268b52a78bc4b2093e5ee
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7c68573ae5603ac28d268b52a78bc4b2093e5ee
Author: Piotr Caban <piotr at 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\n", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, S_OK, "http://www.winehq.org/tests", FALSE},
{"http://www.winehq.org/tests\r", 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"},
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';
More information about the wine-cvs
mailing list