From: Thomas Csovscity <thc.fr13nd(a)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(a)example.com", L"http://someone(a)example.com", S_OK, TRUE}, {L"abc:def", NULL, S_FALSE, TRUE}, - {L"someone(a)example.com", NULL, S_FALSE, TRUE}, + {L"someone(a)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 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1825