## Summary Tests for UrlFixupW and semi stub function implementaion.
## Test results - Tests are 100% ok on my local WIN 10 pc. Wine test bot seems to be okay too. - Wine tests on debian machine
| function type | result | | ------ | ------ | | stub | 0020:url: 69802 tests executed (0 marked as todo, 0 as flaky, **200** failures), 0 skipped. | | semi stub| 0020:url: 69802 tests executed (0 marked as todo, 0 as flaky, **100** failures), 0 skipped. |
## Todos For follow up merge request(s).
- [ ] Add more tests for priority investigation, who url scheme fix up is working on windows. - [ ] Implement missing parts of fix up.
## Conclusion Semi stub implementation is an improvement to the existing solution. A grep showed that wine internals do not call this function, therefore it should not introduce any new bugs. Windows applications using/relying on the function should now work better, if not they may reveal already existing bugs.
-- v6: shlwapi: fixup leading and trailing typos in UrlFixupW shlwapi: check for colon in UrlFixupW kernelbase: Restructure UrlFixupW() shlwapi/tests: Add tests for UrlFixupW.
From: Thomas Csovscity thc.fr13nd@gmail.com
--- dlls/shlwapi/tests/url.c | 313 +++++++++++++++++++++++++++++++++++++++ include/shlwapi.h | 2 + 2 files changed, 315 insertions(+)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 6870de4ee5f..ec3a1eac1e0 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1609,6 +1609,318 @@ static void test_HashData(void) } }
+/* + * Documentation: https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-urlf... +*/ +static const struct parse_urlfixupw_test_t { + const WCHAR *url; + const WCHAR *translated_url; + HRESULT res; + BOOL todo; +} parse_urlfixupw_tests[] = { + {L"ftp:", L"ftp://", S_OK, TRUE}, + {L"http:", L"http://", S_OK, TRUE}, + {L"gopher:", L"gopher:", S_OK}, + {L"mailto:", L"mailto:", S_OK}, + {L"news:", L"news:", S_OK}, + {L"nntp:", L"nntp:", S_OK}, + {L"telnet:", L"telnet:", S_OK}, + {L"wais:", L"wais:", S_OK}, + {L"file:", L"file:", S_OK}, + {L"mk:", L"mk:", S_OK}, + {L"https:", L"https://", S_OK, TRUE}, + {L"shell:", L"shell:", S_OK}, + {L"snews:", L"snews:", S_OK}, + {L"local:", L"local:", S_OK}, + {L"javascript:", L"javascript:", S_OK}, + {L"vbscript:", L"vbscript:", S_OK}, + {L"about:", L"about:", S_OK}, + {L"res:", L"res:", S_OK}, + {L"ms-shell-rooted:", L"ms-shell-rooted:", S_OK}, + {L"ms-shell-idlist:", L"ms-shell-idlist:", S_OK}, + {L"hcp:", L"hcp:", S_OK}, + +//not in winxp {L"*:", L"*://", S_OK, TRUE}, +//not in winxp {L"search-ms:", L"search-ms://", S_OK, TRUE}, +//not in winxp {L"search:", L"search://", S_OK, TRUE}, +//not in winxp {L"knownfolder:", L"knownfolder://", S_OK, TRUE}, + + /* proposed URL is already acceptable */ + {L"mailto:abc@abc.de", L"mailto:abc@abc.de", S_OK}, + {L"ftp://", L"ftp://", S_OK}, + + /* typos in front one letter */ + {L"aftp://", L"ftp://", S_OK, TRUE}, + {L"ahttp://", L"http://", S_OK, TRUE}, + {L"agopher://", L"gopher://", S_OK, TRUE}, + {L"amailto://", L"mailto://", S_OK, TRUE}, + {L"anews://", L"snews://", S_OK, TRUE}, + {L"anntp://", L"nntp://", S_OK, TRUE}, + {L"atelnet://", L"telnet://", S_OK, TRUE}, + {L"awais://", L"wais://", S_OK, TRUE}, + {L"afile://", L"file://", S_OK, TRUE}, + {L"amk://", L"mk://", S_OK, TRUE}, + {L"ahttps://", L"http://", S_OK, TRUE}, + {L"ashell://", L"shell://", S_OK, TRUE}, + {L"asnews://", L"snews://", S_OK, TRUE}, + {L"alocal://", L"local://", S_OK, TRUE}, + {L"ajavascript://", L"javascript://", S_OK, TRUE}, + {L"avbscript://", L"vbscript://", S_OK, TRUE}, + {L"aabout://", L"about://", S_OK, TRUE}, + {L"ares://", L"res://", S_OK, TRUE}, + {L"ams-shell-rooted://", L"ms-shell-rooted://", S_OK, TRUE}, + {L"ams-shell-idlist://", L"ms-shell-idlist://", S_OK, TRUE}, + {L"ahcp://", L"hcp://", S_OK, TRUE}, + + /* typos in front two letters */ + {L"bahttp://", L"about://", S_OK, TRUE}, + {L"banews://", L"snews://", S_OK, TRUE}, + {L"bavbscript://", L"javascript://", S_OK, TRUE}, + + /* typos in front three letters */ + {L"cbavbscript://", L"javascript://", S_OK, TRUE}, + + /* typos mixed up letters */ + {L"ftt://", L"ftp://", S_OK, TRUE}, + {L"gophsr://", L"gopher://", S_OK, TRUE}, + {L"gophs://", L"gopher://", S_OK, TRUE}, + {L"gophss://", L"gopher://", S_OK, TRUE}, + {L"gophsss://", L"gopher://", S_OK, TRUE}, + {L"gophsss://", L"gopher://", S_OK, TRUE}, + {L"mkilto://", L"mailto://", S_OK, TRUE}, + {L"mkklto://", L"mailto://", S_OK, TRUE}, + {L"mkikto://", L"mailto://", S_OK, TRUE}, + {L"mkiktoo://", L"mailto://", S_OK, TRUE}, + {L"ma://", L"mk://", S_OK, TRUE}, + {L"hftp:", L"http://", S_OK, TRUE}, + + /* typos missed letters */ + {L"ft:", L"ftp://", S_OK, TRUE}, + {L"ft://", L"ftp://", S_OK, TRUE}, + {L"htt://", L"http://", S_OK, TRUE}, + {L"gophe://", L"gopher://", S_OK, TRUE}, + {L"goph://", L"gopher://", S_OK, TRUE}, + {L"mailt://", L"mailto://", S_OK, TRUE}, + {L"mail://", L"mailto://", S_OK, TRUE}, + + {L"new://", L"news://", S_OK, TRUE}, + {L"ne://", L"news://", S_OK, TRUE}, + {L"snews://", L"snews://", S_OK}, + {L"newss://", L"snews://", S_OK, TRUE}, + {L"newsss://", L"snews://", S_OK, TRUE}, + {L"newssss://", L"snews://", S_OK, TRUE}, + {L"newsssss://", L"snews://", S_OK, TRUE}, + + /* typos letters behind*/ + {L"mks://", L"mk://", S_OK, TRUE}, + {L"mkss://", L"mk://", S_OK, TRUE}, + {L"mailtooo://", L"mailto://", S_OK, TRUE}, + {L"mailtoooo://", L"mailto://", S_OK, TRUE}, + {L"mailtooooo://", L"mailto://", S_OK, TRUE}, + + /* typos fixing two letters */ + {L"cc:", L"hcp:", S_OK, TRUE}, + {L"ee:", L"res:", S_OK, TRUE}, + {L"ff:", L"ftp://", S_OK, TRUE}, + {L"hh:", L"hcp:", S_OK, TRUE}, + {L"kk:", L"mk:", S_OK, TRUE}, + {L"mm:", L"mk:", S_OK, TRUE}, + {L"nn:", L"nntp:", S_OK, TRUE}, + {L"rr:", L"res:", S_OK, TRUE}, + {L"tt:", L"ftp://", S_OK, TRUE}, + + /* reporting false */ + {L"baftp://", NULL, S_FALSE, TRUE}, + {L"bagopher://", NULL, S_FALSE, TRUE}, + {L"bamailto://", NULL, S_FALSE, TRUE}, + {L"banntp://", NULL, S_FALSE, TRUE}, + {L"batelnet://", NULL, S_FALSE, TRUE}, + {L"bawais://", NULL, S_FALSE, TRUE}, + {L"bafile://", NULL, S_FALSE, TRUE}, + {L"bamk://", NULL, S_FALSE, TRUE}, + {L"bahttps://", NULL, S_FALSE, TRUE}, + {L"bashell://", NULL, S_FALSE, TRUE}, + {L"basnews://", NULL, S_FALSE, TRUE}, + {L"balocal://", NULL, S_FALSE, TRUE}, + {L"bajavascript://", NULL, S_FALSE, TRUE}, + {L"baabout://", NULL, S_FALSE, TRUE}, + {L"bares://", NULL, S_FALSE, TRUE}, + {L"bams-shell-rooted://", NULL, S_FALSE, TRUE}, + {L"bams-shell-idlist://", NULL, S_FALSE, TRUE}, + {L"bahcp://", NULL, S_FALSE, TRUE}, + + {L"cbaftp://", NULL, S_FALSE, TRUE}, + {L"cbahttp://", NULL, S_FALSE, TRUE}, + {L"cbanews://", NULL, S_FALSE, TRUE}, + {L"cbagopher://", NULL, S_FALSE, TRUE}, + {L"cbamailto://", NULL, S_FALSE, TRUE}, + {L"cbanntp://", NULL, S_FALSE, TRUE}, + {L"cbatelnet://", NULL, S_FALSE, TRUE}, + {L"cbawais://", NULL, S_FALSE, TRUE}, + {L"cbafile://", NULL, S_FALSE, TRUE}, + {L"cbamk://", NULL, S_FALSE, TRUE}, + {L"cbahttps://", NULL, S_FALSE, TRUE}, + {L"cbashell://", NULL, S_FALSE, TRUE}, + {L"cbasnews://", NULL, S_FALSE, TRUE}, + {L"cbalocal://", NULL, S_FALSE, TRUE}, + {L"cbajavascript://", NULL, S_FALSE, TRUE}, + {L"cbaabout://", NULL, S_FALSE, TRUE}, + {L"cbares://", NULL, S_FALSE, TRUE}, + {L"cbams-shell-rooted://", NULL, S_FALSE, TRUE}, + {L"cbams-shell-idlist://", NULL, S_FALSE, TRUE}, + {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}, + + /* one letter never matched in winxp */ + {L"a:", NULL, S_FALSE, TRUE}, + {L"b:", NULL, S_FALSE, TRUE}, + {L"c:", NULL, S_FALSE, TRUE}, + {L"d:", NULL, S_FALSE, TRUE}, + {L"e:", NULL, S_FALSE, TRUE}, + {L"f:", NULL, S_FALSE, TRUE}, + {L"g:", NULL, S_FALSE, TRUE}, + {L"h:", NULL, S_FALSE, TRUE}, + {L"i:", NULL, S_FALSE, TRUE}, + {L"j:", NULL, S_FALSE, TRUE}, + {L"k:", NULL, S_FALSE, TRUE}, + {L"l:", NULL, S_FALSE, TRUE}, + {L"m:", NULL, S_FALSE, TRUE}, + {L"n:", NULL, S_FALSE, TRUE}, + {L"o:", NULL, S_FALSE, TRUE}, + {L"p:", NULL, S_FALSE, TRUE}, + {L"q:", NULL, S_FALSE, TRUE}, + {L"r:", NULL, S_FALSE, TRUE}, + {L"s:", NULL, S_FALSE, TRUE}, + {L"t:", NULL, S_FALSE, TRUE}, + {L"u:", NULL, S_FALSE, TRUE}, + {L"v:", NULL, S_FALSE, TRUE}, + {L"w:", NULL, S_FALSE, TRUE}, + {L"x:", NULL, S_FALSE, TRUE}, + {L"y:", NULL, S_FALSE, TRUE}, + {L"z:", NULL, S_FALSE, TRUE}, + + {L"gophssss://", NULL, S_FALSE, TRUE}, + {L"gop://", NULL, S_FALSE, TRUE}, + {L"go://", NULL, S_FALSE, TRUE}, + {L"mai://", NULL, S_FALSE, TRUE}, + + {L"mkkkto://", NULL, S_FALSE, TRUE}, + {L"mailtoooooo://", NULL, S_FALSE, TRUE}, + {L"mailtooooop://", NULL, S_FALSE, TRUE}, + {L"newssssss://", NULL, S_FALSE, TRUE}, + {L"mkikkoo://", NULL, S_FALSE, TRUE}, + {L"mksss://", NULL, S_FALSE, TRUE}, + {L"ft", NULL, S_FALSE, TRUE}, + + /* mixed tests */ + {L"aa:", NULL, S_FALSE, TRUE}, + {L"bb:", NULL, S_FALSE, TRUE}, + {L"dd:", NULL, S_FALSE, TRUE}, + {L"gg:", NULL, S_FALSE, TRUE}, + {L"ii:", NULL, S_FALSE, TRUE}, + {L"jj:", NULL, S_FALSE, TRUE}, + {L"ll:", NULL, S_FALSE, TRUE}, + {L"oo:", NULL, S_FALSE, TRUE}, + {L"pp:", NULL, S_FALSE, TRUE}, + {L"qq:", NULL, S_FALSE, TRUE}, + {L"ss:", NULL, S_FALSE, TRUE}, + {L"uu:", NULL, S_FALSE, TRUE}, + {L"vv:", NULL, S_FALSE, TRUE}, + {L"ww:", NULL, S_FALSE, TRUE}, + {L"xx:", NULL, S_FALSE, TRUE}, + {L"yy:", NULL, S_FALSE, TRUE}, + {L"zz:", NULL, S_FALSE, TRUE}, + + /* taken from example in documentation */ + {L"http://www.microsoft.com", L"http://www.microsoft.com", S_OK}, + {L"http:www.microsoft.com", L"http://www.microsoft.com", S_OK, TRUE}, + {L"mail:someone@example.com", L"mailto:someone@example.com", S_OK, TRUE}, + {L"htpp:wwwmicrosoft.com", L"http://wwwmicrosoft.com", S_OK, TRUE}, + {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"fztzp:", NULL, S_FALSE, TRUE}, + {L"zfztzp:", NULL, S_FALSE, TRUE}, + {L"zfztp:", NULL, S_FALSE, TRUE}, + {L"zftzp:", NULL, S_FALSE, TRUE}, + {L"zftpz:", NULL, S_FALSE, TRUE}, + + {L"htztps:", L"http://", S_OK, TRUE}, + {L"hzttps:", L"http://", S_OK, TRUE}, + {L"htzztps:", NULL, S_FALSE, TRUE}, + {L"hzzzzzzzzzzzzzztp:", NULL, S_FALSE, TRUE}, + {L"hzzzzzzzzzzzzzztpz:", NULL, S_FALSE, TRUE}, + {L"zhzzzzzzzzzzzzzztp:", NULL, S_FALSE, TRUE}, + {L"zhzzzzzzzzzzzzzztpz:", NULL, S_FALSE, TRUE}, + {L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:", NULL, S_FALSE, TRUE}, + + {L"hfttp:", L"http://", S_OK, TRUE}, + {L"hfttpz:", L"http://", S_OK, TRUE}, + {L"zhftp:", NULL, S_FALSE, TRUE}, + {L"hftftpz:", NULL, S_FALSE, TRUE}, + {L"hftddtpz:", NULL, S_FALSE, TRUE}, + {L"hftddtddpz:", NULL, S_FALSE, TRUE}, + + {L"hfftp:", L"http://", S_OK, TRUE}, + {L"hftpz:", L"http://", S_OK, TRUE}, + {L"hztpz:", L"http://", S_OK, TRUE}, + + {L"httpz:", L"http://", S_OK, TRUE}, + {L"httpsz:", L"http://", S_OK, TRUE}, + {L"httpzz:", L"http://", S_OK, TRUE}, + {L"httpzzz:", L"http://", S_OK, TRUE}, + {L"httpzzzz:", NULL, S_FALSE, TRUE}, + {L"httpzzzzz:", NULL, S_FALSE, TRUE}, + + /* missing colon */ + {L"http//www.microsoft.com", NULL, S_FALSE, TRUE}, +}; + +#define MAX_URL 256 + +static void test_UrlFixupW(void) +{ + const struct parse_urlfixupw_test_t *test; + WCHAR translated_url_buf[MAX_URL]; + WCHAR *translated_url = translated_url_buf; + HRESULT hres; + + trace("test_UrlFixupW\n"); + for (test = parse_urlfixupw_tests; test < parse_urlfixupw_tests + ARRAY_SIZE(parse_urlfixupw_tests); test++) { + trace("test_UrlFixupW, flag %s\n", test->todo ? "todo" : "run"); + todo_wine_if (test->todo) + { + translated_url_buf[0] = 0; + hres = UrlFixupW(test->url, translated_url,MAX_URL); + if (test->res == hres ) { + if (S_OK == hres) { + ok(_wcsicmp(translated_url, test->translated_url) == 0,"Expected %s got %s for %s\n", + wine_dbgstr_w(test->translated_url), wine_dbgstr_w(translated_url), wine_dbgstr_w(test->url)); + } else if (S_FALSE == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->url)); + } else { + printf("failed %S with %lu \n", test->url, hres); + } + } else { + if (S_OK == hres) { + ok(test->res == hres, "Expected %lu got %lu for %s fixed: %s\n", + test->res, hres, wine_dbgstr_w(test->url), wine_dbgstr_w(translated_url)); + } else { + ok(test->res == hres, "Expected %lu got %lu for %s\n", + test->res, hres, wine_dbgstr_w(test->url)); + } + } + } + } +} + /* ########################### */
START_TEST(url) @@ -1626,4 +1938,5 @@ START_TEST(url) test_UrlUnescape(); test_ParseURL(); test_HashData(); + test_UrlFixupW(); } diff --git a/include/shlwapi.h b/include/shlwapi.h index eee41abf0dc..15c1cfa06da 100644 --- a/include/shlwapi.h +++ b/include/shlwapi.h @@ -701,6 +701,8 @@ WINSHLWAPI INT WINAPI UrlCompareA(LPCSTR,LPCSTR,BOOL); WINSHLWAPI INT WINAPI UrlCompareW(LPCWSTR,LPCWSTR,BOOL); #define UrlCompare WINELIB_NAME_AW(UrlCompare)
+WINSHLWAPI HRESULT WINAPI UrlFixupW(const WCHAR *,WCHAR *,DWORD); + WINSHLWAPI HRESULT WINAPI UrlEscapeA(LPCSTR,LPSTR,LPDWORD,DWORD); WINSHLWAPI HRESULT WINAPI UrlEscapeW(LPCWSTR,LPWSTR,LPDWORD,DWORD); #define UrlEscape WINELIB_NAME_AW(UrlEscape)
From: Thomas Csovscity thc.fr13nd@gmail.com
Restructure for further semi stub implementation. --- dlls/kernelbase/path.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index 7eda9bd483c..17b9e819aac 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -4090,17 +4090,40 @@ INT WINAPI UrlCompareW(const WCHAR *url1, const WCHAR *url2, BOOL ignore_slash)
HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars) { - DWORD srcLen; + DWORD src_len, dst_len, len; + DWORD pos = 0; + WCHAR *save_str = translatedUrl;
- FIXME("%s, %p, %ld stub\n", wine_dbgstr_w(url), translatedUrl, maxChars); + static const WCHAR *url_scheme[] = { L"", L"ftp", L"https", L"gopher", L"mailto", L"news", + L"nntp", L"telnet", L"wais", L"file", L"mk", + L"http", L"shell", L"snews", L"local", + L"javascript", L"vbscript", L"about", L"res", + L"ms-shell-rooted", L"ms-shell-idlist", L"hcp"}; + FIXME("%s, %p, %ld semi-stub\n", wine_dbgstr_w(url), translatedUrl, maxChars);
if (!url) return E_FAIL;
- srcLen = lstrlenW(url) + 1; + /* + * First check for known, valid and typo free scheme + */ + for (pos=1; pos<ARRAY_SIZE(url_scheme); pos++) + { + len = wcslen(url_scheme[pos]); + if ( (len+1 <= wcslen(url)) && (!_wcsnicmp(url, url_scheme[pos], len)) && (L':' == url[len]) ) + { + if (len+2 >= maxChars) + return S_FALSE; + + lstrcpynW(save_str, url, len+2); + url += len+1; + } + }
- /* For now just copy the URL directly */ - lstrcpynW(translatedUrl, url, (maxChars < srcLen) ? maxChars : srcLen); + /* Add the URL path */ + src_len = lstrlenW(url) + 1; + dst_len = maxChars - lstrlenW(save_str); + lstrcpynW(save_str+lstrlenW(save_str), url, (dst_len < src_len) ? dst_len : src_len);
return S_OK; }
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
From: Thomas Csovscity thc.fr13nd@gmail.com
--- dlls/kernelbase/path.c | 75 +++++++++++++++- dlls/shlwapi/tests/url.c | 184 +++++++++++++++++++-------------------- 2 files changed, 166 insertions(+), 93 deletions(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c index 86b15944102..498294a89d1 100644 --- a/dlls/kernelbase/path.c +++ b/dlls/kernelbase/path.c @@ -4091,7 +4091,7 @@ INT WINAPI UrlCompareW(const WCHAR *url1, const WCHAR *url2, BOOL ignore_slash) HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars) { DWORD src_len, dst_len, len; - DWORD pos = 0; + DWORD colon_pos = 0, pos = 0; WCHAR *helper_str = NULL; WCHAR *save_str = translatedUrl;
@@ -4133,7 +4133,80 @@ HRESULT WINAPI UrlFixupW(const WCHAR *url, WCHAR *translatedUrl, DWORD maxChars) if (!helper_str) return S_FALSE;
+ /* + * Colon should not be at the beginning + */ + colon_pos = helper_str-url; + if (helper_str && (1 >= colon_pos)) + return S_FALSE; + /* + * Check if string fits into maxChars + */ + // TODO: Use own buffer for adjustments, output buffer may not fit before fix + if (colon_pos >= maxChars && maxChars < 3) + return S_FALSE; + + /* + * Set potential scheme + */ + lstrcpynW(save_str, url, pos+2); + url = url + colon_pos + 1; + + /* + * Find schemes with trailing or leading typos + */ + for (pos=1; pos<ARRAY_SIZE(url_scheme); pos++) + { + /* http is always prefered before https, if string has typos */ + len = wcslen(url_scheme[pos]); + if (!_wcsnicmp(url_scheme[pos], L"https", len+1)) + { + continue; + } + if ( (len <= wcslen(save_str)) && (StrStrIW(save_str, url_scheme[pos])) ) + { + /* + * check if string fits into maxChars + */ + if (len+1 >= maxChars) + return S_FALSE; + + lstrcpynW(save_str, url_scheme[pos], len+1); + lstrcatW(save_str, L":"); + goto scheme_done; + } + } + + /* Return false in most remaining cases should be safe */ + return S_FALSE; + + /* Concat scheme + rest */ scheme_done: + /* + * Concat L"://"" for ftp, http, https scheme * else ":" + */ + if ( 0 == lstrcmpW(save_str, L"ftp:") || + 0 == lstrcmpW(save_str, L"http:") || + 0 == lstrcmpW(save_str, L"https:") ) + { + if ( url[0] == L'\' || url[0] == L'/' ) + { + url++; + if ( url[0] == L'\' || url[0] == L'/' ) + url++; + } + lstrcatW(save_str, L"//"); + } + /* + * Remove leading "/", "" and ":" from url. + * Output already have them if needed + */ + while ( url[0] == L'\' || url[0] == L'/' ) + { + lstrcatW(save_str, L"/"); + url++; + } + /* 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 d9f2f5cde0d..6ecd5aa6ffa 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1618,8 +1618,8 @@ static const struct parse_urlfixupw_test_t { HRESULT res; BOOL todo; } parse_urlfixupw_tests[] = { - {L"ftp:", L"ftp://", S_OK, TRUE}, - {L"http:", L"http://", S_OK, TRUE}, + {L"ftp:", L"ftp://", S_OK}, + {L"http:", L"http://", S_OK}, {L"gopher:", L"gopher:", S_OK}, {L"mailto:", L"mailto:", S_OK}, {L"news:", L"news:", S_OK}, @@ -1628,7 +1628,7 @@ static const struct parse_urlfixupw_test_t { {L"wais:", L"wais:", S_OK}, {L"file:", L"file:", S_OK}, {L"mk:", L"mk:", S_OK}, - {L"https:", L"https://", S_OK, TRUE}, + {L"https:", L"https://", S_OK}, {L"shell:", L"shell:", S_OK}, {L"snews:", L"snews:", S_OK}, {L"local:", L"local:", S_OK}, @@ -1650,27 +1650,27 @@ static const struct parse_urlfixupw_test_t { {L"ftp://", L"ftp://", S_OK},
/* typos in front one letter */ - {L"aftp://", L"ftp://", S_OK, TRUE}, - {L"ahttp://", L"http://", S_OK, TRUE}, - {L"agopher://", L"gopher://", S_OK, TRUE}, - {L"amailto://", L"mailto://", S_OK, TRUE}, + {L"aftp://", L"ftp://", S_OK}, + {L"ahttp://", L"http://", S_OK}, + {L"agopher://", L"gopher://", S_OK}, + {L"amailto://", L"mailto://", S_OK}, {L"anews://", L"snews://", S_OK, TRUE}, - {L"anntp://", L"nntp://", S_OK, TRUE}, - {L"atelnet://", L"telnet://", S_OK, TRUE}, - {L"awais://", L"wais://", S_OK, TRUE}, - {L"afile://", L"file://", S_OK, TRUE}, - {L"amk://", L"mk://", S_OK, TRUE}, - {L"ahttps://", L"http://", S_OK, TRUE}, - {L"ashell://", L"shell://", S_OK, TRUE}, + {L"anntp://", L"nntp://", S_OK}, + {L"atelnet://", L"telnet://", S_OK}, + {L"awais://", L"wais://", S_OK}, + {L"afile://", L"file://", S_OK}, + {L"amk://", L"mk://", S_OK}, + {L"ahttps://", L"http://", S_OK}, + {L"ashell://", L"shell://", S_OK}, {L"asnews://", L"snews://", S_OK, TRUE}, - {L"alocal://", L"local://", S_OK, TRUE}, - {L"ajavascript://", L"javascript://", S_OK, TRUE}, - {L"avbscript://", L"vbscript://", S_OK, TRUE}, - {L"aabout://", L"about://", S_OK, TRUE}, - {L"ares://", L"res://", S_OK, TRUE}, + {L"alocal://", L"local://", S_OK}, + {L"ajavascript://", L"javascript://", S_OK}, + {L"avbscript://", L"vbscript://", S_OK}, + {L"aabout://", L"about://", S_OK}, + {L"ares://", L"res://", S_OK}, {L"ams-shell-rooted://", L"ms-shell-rooted://", S_OK, TRUE}, {L"ams-shell-idlist://", L"ms-shell-idlist://", S_OK, TRUE}, - {L"ahcp://", L"hcp://", S_OK, TRUE}, + {L"ahcp://", L"hcp://", S_OK},
/* typos in front two letters */ {L"bahttp://", L"about://", S_OK, TRUE}, @@ -1712,11 +1712,11 @@ static const struct parse_urlfixupw_test_t { {L"newsssss://", L"snews://", S_OK, TRUE},
/* typos letters behind*/ - {L"mks://", L"mk://", S_OK, TRUE}, - {L"mkss://", L"mk://", S_OK, TRUE}, - {L"mailtooo://", L"mailto://", S_OK, TRUE}, - {L"mailtoooo://", L"mailto://", S_OK, TRUE}, - {L"mailtooooo://", L"mailto://", S_OK, TRUE}, + {L"mks://", L"mk://", S_OK}, + {L"mkss://", L"mk://", S_OK}, + {L"mailtooo://", L"mailto://", S_OK}, + {L"mailtoooo://", L"mailto://", S_OK}, + {L"mailtooooo://", L"mailto://", S_OK},
/* typos fixing two letters */ {L"cc:", L"hcp:", S_OK, TRUE}, @@ -1776,37 +1776,37 @@ static const struct parse_urlfixupw_test_t { {L"ftp", NULL, S_FALSE},
/* one letter never matched in winxp */ - {L"a:", NULL, S_FALSE, TRUE}, - {L"b:", NULL, S_FALSE, TRUE}, - {L"c:", NULL, S_FALSE, TRUE}, - {L"d:", NULL, S_FALSE, TRUE}, - {L"e:", NULL, S_FALSE, TRUE}, - {L"f:", NULL, S_FALSE, TRUE}, - {L"g:", NULL, S_FALSE, TRUE}, - {L"h:", NULL, S_FALSE, TRUE}, - {L"i:", NULL, S_FALSE, TRUE}, - {L"j:", NULL, S_FALSE, TRUE}, - {L"k:", NULL, S_FALSE, TRUE}, - {L"l:", NULL, S_FALSE, TRUE}, - {L"m:", NULL, S_FALSE, TRUE}, - {L"n:", NULL, S_FALSE, TRUE}, - {L"o:", NULL, S_FALSE, TRUE}, - {L"p:", NULL, S_FALSE, TRUE}, - {L"q:", NULL, S_FALSE, TRUE}, - {L"r:", NULL, S_FALSE, TRUE}, - {L"s:", NULL, S_FALSE, TRUE}, - {L"t:", NULL, S_FALSE, TRUE}, - {L"u:", NULL, S_FALSE, TRUE}, - {L"v:", NULL, S_FALSE, TRUE}, - {L"w:", NULL, S_FALSE, TRUE}, - {L"x:", NULL, S_FALSE, TRUE}, - {L"y:", NULL, S_FALSE, TRUE}, - {L"z:", NULL, S_FALSE, TRUE}, - - {L"gophssss://", NULL, S_FALSE, TRUE}, - {L"gop://", NULL, S_FALSE, TRUE}, - {L"go://", NULL, S_FALSE, TRUE}, - {L"mai://", NULL, S_FALSE, TRUE}, + {L"a:", NULL, S_FALSE}, + {L"b:", NULL, S_FALSE}, + {L"c:", NULL, S_FALSE}, + {L"d:", NULL, S_FALSE}, + {L"e:", NULL, S_FALSE}, + {L"f:", NULL, S_FALSE}, + {L"g:", NULL, S_FALSE}, + {L"h:", NULL, S_FALSE}, + {L"i:", NULL, S_FALSE}, + {L"j:", NULL, S_FALSE}, + {L"k:", NULL, S_FALSE}, + {L"l:", NULL, S_FALSE}, + {L"m:", NULL, S_FALSE}, + {L"n:", NULL, S_FALSE}, + {L"o:", NULL, S_FALSE}, + {L"p:", NULL, S_FALSE}, + {L"q:", NULL, S_FALSE}, + {L"r:", NULL, S_FALSE}, + {L"s:", NULL, S_FALSE}, + {L"t:", NULL, S_FALSE}, + {L"u:", NULL, S_FALSE}, + {L"v:", NULL, S_FALSE}, + {L"w:", NULL, S_FALSE}, + {L"x:", NULL, S_FALSE}, + {L"y:", NULL, S_FALSE}, + {L"z:", NULL, S_FALSE}, + + {L"gophssss://", NULL, S_FALSE}, + {L"gop://", NULL, S_FALSE}, + {L"go://", NULL, S_FALSE}, + {L"mai://", NULL, S_FALSE},
{L"mkkkto://", NULL, S_FALSE, TRUE}, {L"mailtoooooo://", NULL, S_FALSE, TRUE}, @@ -1817,64 +1817,64 @@ static const struct parse_urlfixupw_test_t { {L"ft", NULL, S_FALSE},
/* mixed tests */ - {L"aa:", NULL, S_FALSE, TRUE}, - {L"bb:", NULL, S_FALSE, TRUE}, - {L"dd:", NULL, S_FALSE, TRUE}, - {L"gg:", NULL, S_FALSE, TRUE}, - {L"ii:", NULL, S_FALSE, TRUE}, - {L"jj:", NULL, S_FALSE, TRUE}, - {L"ll:", NULL, S_FALSE, TRUE}, - {L"oo:", NULL, S_FALSE, TRUE}, - {L"pp:", NULL, S_FALSE, TRUE}, - {L"qq:", NULL, S_FALSE, TRUE}, - {L"ss:", NULL, S_FALSE, TRUE}, - {L"uu:", NULL, S_FALSE, TRUE}, - {L"vv:", NULL, S_FALSE, TRUE}, - {L"ww:", NULL, S_FALSE, TRUE}, - {L"xx:", NULL, S_FALSE, TRUE}, - {L"yy:", NULL, S_FALSE, TRUE}, - {L"zz:", NULL, S_FALSE, TRUE}, + {L"aa:", NULL, S_FALSE}, + {L"bb:", NULL, S_FALSE}, + {L"dd:", NULL, S_FALSE}, + {L"gg:", NULL, S_FALSE}, + {L"ii:", NULL, S_FALSE}, + {L"jj:", NULL, S_FALSE}, + {L"ll:", NULL, S_FALSE}, + {L"oo:", NULL, S_FALSE}, + {L"pp:", NULL, S_FALSE}, + {L"qq:", NULL, S_FALSE}, + {L"ss:", NULL, S_FALSE}, + {L"uu:", NULL, S_FALSE}, + {L"vv:", NULL, S_FALSE}, + {L"ww:", NULL, S_FALSE}, + {L"xx:", NULL, S_FALSE}, + {L"yy:", NULL, S_FALSE}, + {L"zz:", NULL, S_FALSE},
/* taken from example in documentation */ {L"http://www.microsoft.com", L"http://www.microsoft.com", S_OK}, - {L"http:www.microsoft.com", L"http://www.microsoft.com", S_OK, TRUE}, + {L"http:www.microsoft.com", L"http://www.microsoft.com", S_OK}, {L"mail:someone@example.com", L"mailto:someone@example.com", S_OK, TRUE}, {L"htpp:wwwmicrosoft.com", L"http://wwwmicrosoft.com", S_OK, TRUE}, {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"http:someone@example.com", L"http://someone@example.com", S_OK}, + {L"abc:def", NULL, S_FALSE}, {L"someone@example.com", NULL, S_FALSE},
- {L"fztzp:", NULL, S_FALSE, TRUE}, - {L"zfztzp:", NULL, S_FALSE, TRUE}, - {L"zfztp:", NULL, S_FALSE, TRUE}, - {L"zftzp:", NULL, S_FALSE, TRUE}, + {L"fztzp:", NULL, S_FALSE}, + {L"zfztzp:", NULL, S_FALSE}, + {L"zfztp:", NULL, S_FALSE}, + {L"zftzp:", NULL, S_FALSE}, {L"zftpz:", NULL, S_FALSE, TRUE},
{L"htztps:", L"http://", S_OK, TRUE}, {L"hzttps:", L"http://", S_OK, TRUE}, - {L"htzztps:", NULL, S_FALSE, TRUE}, - {L"hzzzzzzzzzzzzzztp:", NULL, S_FALSE, TRUE}, - {L"hzzzzzzzzzzzzzztpz:", NULL, S_FALSE, TRUE}, - {L"zhzzzzzzzzzzzzzztp:", NULL, S_FALSE, TRUE}, - {L"zhzzzzzzzzzzzzzztpz:", NULL, S_FALSE, TRUE}, - {L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:", NULL, S_FALSE, TRUE}, + {L"htzztps:", NULL, S_FALSE}, + {L"hzzzzzzzzzzzzzztp:", NULL, S_FALSE}, + {L"hzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, + {L"zhzzzzzzzzzzzzzztp:", NULL, S_FALSE}, + {L"zhzzzzzzzzzzzzzztpz:", NULL, S_FALSE}, + {L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:", NULL, S_FALSE},
{L"hfttp:", L"http://", S_OK, TRUE}, {L"hfttpz:", L"http://", S_OK, TRUE}, {L"zhftp:", NULL, S_FALSE, TRUE}, {L"hftftpz:", NULL, S_FALSE, TRUE}, - {L"hftddtpz:", NULL, S_FALSE, TRUE}, - {L"hftddtddpz:", NULL, S_FALSE, TRUE}, + {L"hftddtpz:", NULL, S_FALSE}, + {L"hftddtddpz:", NULL, S_FALSE},
{L"hfftp:", L"http://", S_OK, TRUE}, {L"hftpz:", L"http://", S_OK, TRUE}, {L"hztpz:", L"http://", S_OK, TRUE},
- {L"httpz:", L"http://", S_OK, TRUE}, - {L"httpsz:", L"http://", S_OK, TRUE}, - {L"httpzz:", L"http://", S_OK, TRUE}, - {L"httpzzz:", L"http://", S_OK, TRUE}, + {L"httpz:", L"http://", S_OK}, + {L"httpsz:", L"http://", S_OK}, + {L"httpzz:", L"http://", S_OK}, + {L"httpzzz:", L"http://", S_OK}, {L"httpzzzz:", NULL, S_FALSE, TRUE}, {L"httpzzzzz:", NULL, S_FALSE, TRUE},
On Mon Jan 23 21:50:18 2023 +0000, **** wrote:
Marvin replied on the mailing list:
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details: The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=128644 Your paranoid android. === debian11 (32 bit report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit ar:MA report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit de report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit fr report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit he:IL report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit hi:IN report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit ja:JP report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11 (32 bit zh:CN report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11b (32 bit WoW report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:" === debian11b (64 bit WoW report) === shlwapi: url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mk" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ftp" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"a:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"b:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"c:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"d:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"e:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"f:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"g:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"h:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"i:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"j:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"k:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"l:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"m:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"n:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"o:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"p:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"q:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"r:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"s:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"t:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"u:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"v:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"w:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"x:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"y:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"z:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gophssss://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gop://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"go://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"mai://" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ft" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"aa:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"bb:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"dd:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"gg:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ii:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"jj:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ll:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"oo:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"pp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"qq:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ss:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"uu:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"vv:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"ww:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"xx:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"yy:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"abc:def" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"someone@example.com" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"fztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zfztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zftzp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"htzztps:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztp:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zhzzzzzzzzzzzzzztpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"zzzzzzhzzzzzzzzzzzzzztzzzzzzpzzzzzz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtpz:" url.c:1906: Test succeeded inside todo block: Expected 1 got 1 for L"hftddtddpz:"
done
On Mon Jan 23 00:47:51 2023 +0000, Thomas Csovcsity wrote:
I will look into the test failures, maybe i mixed up the return values at rework or earlier. I will double check that and use TestBot for verification.
Done
On Sun Jan 22 23:00:47 2023 +0000, Thomas Csovcsity wrote:
I will do in future commits, when function grows, atm it will only introduce additional buffers and more parameters in function to pass back strings and length value or pointer positions ...
I don't see a reason not to do it now. I don't think the current code is very readable.
I don't think the function needs to be very complex, either. I originally proposed that the helper would fix up the scheme, but as far as I can tell, it can just return a guessed scheme, and leave the fixup to UrlFixupW() itself.
On Sun Jan 22 23:00:47 2023 +0000, Thomas Csovcsity wrote:
I can do so but then i have to care about the wchar string termination by hand, i am unsure if this is really what we want.
I think manually terminating strings is preferable, yes.
The title of commit 2 isn't very descriptive ("restructure" how?), and in fact is misleading, since it contains functional changes as well.
The "save_str" local variable seems redundant; it's never modified.
Patches 3 and 4 have "shlwapi" as a prefix; that should probably be "kernelbase" instead.
From patch 3:
- /*
* 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;
"helper_str" is never used in this patch.
The comment makes reference to scheme length but doesn't validate it.
The line about S_FALSE strikes me as somewhat unnecessary; the code tells us as much.
From patch 4:
- /*
* Colon should not be at the beginning
*/
No need for these comments to span three lines.
- colon_pos = helper_str-url;
- if (helper_str && (1 >= colon_pos))
return S_FALSE;
I find conditionals hard to read when phrased like this; can we please put the constant on the right side?
- /*
* Check if string fits into maxChars
*/
This comment, and others like it, seems redundant; the code tells us as much.
- // TODO: Use own buffer for adjustments, output buffer may not fit before fix
We don't use C++ comments.
- if (colon_pos >= maxChars && maxChars < 3)
return S_FALSE;
Why the "maxChars < 3" part?
- /*
* Set potential scheme
*/
- lstrcpynW(save_str, url, pos+2);
- url = url + colon_pos + 1;
This looks wrong. Either the following loop will overwrite this, or we'll return S_FALSE, in which case we probably shouldn't be touching the output buffer.
In fact, should we even be writing the scheme if we might fail later?
- /* Return false in most remaining cases should be safe */
- return S_FALSE;
This comment seems out of place. Either it's correct or it's not.
- /*
* Concat L"://"" for ftp, http, https scheme * else ":"
*/
This all seems irrelevant to the patch subject; it should be part of its own patch.
This commit also doesn't quite match the code. We already copied the colon; we're not doing it here.
- if ( 0 == lstrcmpW(save_str, L"ftp:") ||
0 == lstrcmpW(save_str, L"http:") ||
0 == lstrcmpW(save_str, L"https:") )
Let's please consistently use standard wcs* functions, instead of mixing lstr* and wcs*. I would also just simply say "!wcscmp", but I guess to each their own.
- {
if ( url[0] == L'\\' || url[0] == L'/' )
{
url++;
if ( url[0] == L'\\' || url[0] == L'/' )
url++;
}
lstrcatW(save_str, L"//");
This is missing destination size checks. Also, if we don't have enough room, should we really be touching the output buffer earlier, viz. to write the scheme?
- }
- /*
* Remove leading "/", "\" and ":" from url.
* Output already have them if needed
*/
- while ( url[0] == L'\' || url[0] == L'/' )
- {
lstrcatW(save_str, L"/");
url++;
- }
The comment doesn't match the code here, and there's no tests for this.