From: Thomas Csovscity thc.fr13nd@gmail.com
--- dlls/kernelbase/path.c | 14 ++++++++++++++ dlls/shlwapi/tests/url.c | 12 ++++++------ 2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index 17b9e819aac..86b15944102 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -4092,6 +4092,7 @@ HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars) { DWORD src_len, dst_len, len; DWORD pos = 0; + WCHAR *helper_str = NULL; WCHAR *save_str = translatedUrl;
static const WCHAR *url_scheme[] = { L"", L"ftp", L"https", L"gopher", L"mailto", L"news", @@ -4117,9 +4118,22 @@ HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars)
lstrcpynW(save_str, url, len+2); url += len+1; + goto scheme_done; } }
+ /* + * url has to contain at least one colon. + * The scheme part length has a minimum of 2 characters. + * Output buffer length has to be minimum of 3 characters, scheme + colon. + * + * Return S_FALSE if url and buffer do not meet this minimum requirements. + */ + helper_str = wcschr(url, L':'); + if (!helper_str) + return S_FALSE; + +scheme_done: /* Add the URL path */ src_len = lstrlenW(url) + 1; dst_len = maxChars - lstrlenW(save_str); diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index ec3a1eac1e0..d9f2f5cde0d 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1771,9 +1771,9 @@ static const struct parse_urlfixupw_test_t { {L"cbahcp://", NULL, S_FALSE, TRUE},
/* without ":" never matched in winxp */ - {L"a", NULL, S_FALSE, TRUE}, - {L"mk", NULL, S_FALSE, TRUE}, - {L"ftp", NULL, S_FALSE, TRUE}, + {L"a", NULL, S_FALSE}, + {L"mk", NULL, S_FALSE}, + {L"ftp", NULL, S_FALSE},
/* one letter never matched in winxp */ {L"a:", NULL, S_FALSE, TRUE}, @@ -1814,7 +1814,7 @@ static const struct parse_urlfixupw_test_t { {L"newssssss://", NULL, S_FALSE, TRUE}, {L"mkikkoo://", NULL, S_FALSE, TRUE}, {L"mksss://", NULL, S_FALSE, TRUE}, - {L"ft", NULL, S_FALSE, TRUE}, + {L"ft", NULL, S_FALSE},
/* mixed tests */ {L"aa:", NULL, S_FALSE, TRUE}, @@ -1843,7 +1843,7 @@ static const struct parse_urlfixupw_test_t { {L"htps:\www.microsoft.com", L"http://www.microsoft.com", S_OK, TRUE}, {L"http:someone@example.com", L"http://someone@example.com", S_OK, TRUE}, {L"abc:def", NULL, S_FALSE, TRUE}, - {L"someone@example.com", NULL, S_FALSE, TRUE}, + {L"someone@example.com", NULL, S_FALSE},
{L"fztzp:", NULL, S_FALSE, TRUE}, {L"zfztzp:", NULL, S_FALSE, TRUE}, @@ -1879,7 +1879,7 @@ static const struct parse_urlfixupw_test_t { {L"httpzzzzz:", NULL, S_FALSE, TRUE},
/* missing colon */ - {L"http//www.microsoft.com", NULL, S_FALSE, TRUE}, + {L"http//www.microsoft.com", NULL, S_FALSE}, };
#define MAX_URL 256