From: Sebastian Lackner Subject: shlwapi: Fix UrlCombineW for URLs containing a quotation mark Message-Id: <527AC158.40606@fds-team.de> Date: Wed, 06 Nov 2013 23:23:20 +0100 The current implementation of UrlCombineW doesn't contain proper handling of quotation marks (=query string) inside the URL. This patch adds this and thus fixes a bug related to Silverlight + TestOut. --- dlls/shlwapi/tests/url.c | 2 ++ dlls/shlwapi/url.c | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) From b54c1fa9af225809c8e106d956c93d63dafd578a Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Wed, 6 Nov 2013 23:01:42 +0100 Subject: shlwapi: Fix UrlCombineW for URLs containing a quotation mark --- dlls/shlwapi/tests/url.c | 2 ++ dlls/shlwapi/url.c | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index d2ac077..7c1fdb5 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -327,6 +327,8 @@ static const TEST_URL_COMBINE TEST_COMBINE[] = { {"http://www.winehq.org/test12", "#", 0, S_OK, "http://www.winehq.org/test12#"}, {"http://www.winehq.org/test13#aaa", "#bbb", 0, S_OK, "http://www.winehq.org/test13#bbb"}, {"http://www.winehq.org/test14#aaa/bbb#ccc", "#", 0, S_OK, "http://www.winehq.org/test14#"}, + {"http://www.winehq.org/tests/?query=x/y/z", "tests15", 0, S_OK, "http://www.winehq.org/tests/tests15"}, + {"http://www.winehq.org/tests/?query=x/y/z#example", "tests16", 0, S_OK, "http://www.winehq.org/tests/tests16"}, {"file:///C:\\dir\\file.txt", "test.txt", 0, S_OK, "file:///C:/dir/test.txt"}, {"file:///C:\\dir\\file.txt#hash\\hash", "test.txt", 0, S_OK, "file:///C:/dir/file.txt#hash/test.txt"}, {"file:///C:\\dir\\file.html#hash\\hash", "test.html", 0, S_OK, "file:///C:/dir/test.html"}, diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c index 102faf5..63f8a8c 100644 --- a/dlls/shlwapi/url.c +++ b/dlls/shlwapi/url.c @@ -665,6 +665,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, DWORD i, len, res1, res2, process_case = 0; LPWSTR work, preliminary, mbase, mrelative; static const WCHAR myfilestr[] = {'f','i','l','e',':','/','/','/','\0'}; + static const WCHAR fragquerystr[] = {'#','?',0}; HRESULT ret; TRACE("(base %s, Relative %s, Combine size %d, flags %08x)\n", @@ -736,17 +737,19 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, } } - /* If there is a '#' and the characters immediately preceding it are - * ".htm[l]", then begin looking for the last leaf starting from - * the '#'. Otherwise the '#' is not meaningful and just start - * looking from the end. */ - if ((work = strchrW(base.pszSuffix + sizeloc, '#'))) { + /* If there is a '?', then the remaining part can only contain a + * query string or fragment, so start looking for the last leaf + * from the '?'. Otherwise, if there is a '#' and the characters + * immediately preceding it are ".htm[l]", then begin looking for + * the last leaf starting from the '#'. Otherwise the '#' is not + * meaningful and just start looking from the end. */ + if ((work = strpbrkW(base.pszSuffix + sizeloc, fragquerystr))) { const WCHAR htmlW[] = {'.','h','t','m','l',0}; const int len_htmlW = 5; const WCHAR htmW[] = {'.','h','t','m',0}; const int len_htmW = 4; - if (base.nScheme == URL_SCHEME_HTTP || base.nScheme == URL_SCHEME_HTTPS) + if (*work == '?' || base.nScheme == URL_SCHEME_HTTP || base.nScheme == URL_SCHEME_HTTPS) manual_search = TRUE; else if (work - base.pszSuffix > len_htmW) { work -= len_htmW; -- 1.7.9.5