From: Jiajin Cui <cuijiajin@uniontech.com> Avoid appending cache file extensions that cannot fit in the generated MAX_PATH-sized cache path. Signed-off-by: Jiajin Cui <cuijiajin@uniontech.com> --- dlls/wininet/tests/urlcache.c | 2 +- dlls/wininet/urlcache.c | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c index 1b9c80b8bf3..0cf86d2a782 100644 --- a/dlls/wininet/tests/urlcache.c +++ b/dlls/wininet/tests/urlcache.c @@ -1015,7 +1015,7 @@ static void test_urlcacheW(void) bufW[i] = 0; ret = CreateUrlCacheEntryW(test_urlW, 0, bufW, bufW, 0); - todo_wine ok(ret, "CreateUrlCacheEntryW failed: %ld\n", GetLastError()); + ok(ret, "CreateUrlCacheEntryW failed: %ld\n", GetLastError()); if(ret) { ok(lstrlenW(bufW) < MAX_PATH, "cache path too long: %s\n", wine_dbgstr_w(bufW)); ret = DeleteFileW(bufW); diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c index 49c8ce9becc..933e33e6834 100644 --- a/dlls/wininet/urlcache.c +++ b/dlls/wininet/urlcache.c @@ -2689,19 +2689,23 @@ static BOOL urlcache_entry_create(const char *url, const char *ext, WCHAR *full_ extW[0] = '.'; ext_len = MultiByteToWideChar(CP_ACP, 0, ext, -1, extW+1, MAX_PATH-1); - - for(p=extW; *p; p++) { - switch(*p) { - case '<': case '>': - case ':': case '"': - case '|': case '?': - case '*': - *p = '_'; break; - default: break; + if(!ext_len || ext_len >= MAX_PATH - 8) { + extW[0] = '\0'; + ext_len = 0; + }else { + for(p=extW; *p; p++) { + switch(*p) { + case '<': case '>': + case ':': case '"': + case '|': case '?': + case '*': + *p = '_'; break; + default: break; + } } + if(p > extW && (p[-1]==' ' || p[-1]=='.')) + p[-1] = '_'; } - if(p[-1]==' ' || p[-1]=='.') - p[-1] = '_'; }else { extW[0] = '\0'; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11255