From: "Rémi Bernon" Subject: [PATCH 3/3] wintrust: Don't fail CryptCATOpen if file is empty or its data invalid. Message-Id: <20201216134142.1126935-3-rbernon@codeweavers.com> Date: Wed, 16 Dec 2020 14:41:42 +0100 In-Reply-To: <20201216134142.1126935-1-rbernon@codeweavers.com> References: <20201216134142.1126935-1-rbernon@codeweavers.com> Fixes a regression from 699e0a55ea71e2506917e38fc85cb4ae23a9cd1a, making "winetricks dotnet30sp1" fail. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49831 Signed-off-by: Rémi Bernon --- Note that sometimes (often?) "winetricks dotnet30sp1" still fails early because NetFx20SP1_x86.exe fails to install. It's unrelated, and happens spuriously. dlls/wintrust/crypt.c | 5 ++++- dlls/wintrust/tests/crypt.c | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/wintrust/crypt.c b/dlls/wintrust/crypt.c index e9a58a84ac4..2a780e57546 100644 --- a/dlls/wintrust/crypt.c +++ b/dlls/wintrust/crypt.c @@ -935,7 +935,7 @@ HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv, size = GetFileSize(file, NULL); if (!(buffer = HeapAlloc(GetProcessHeap(), 0, size))) goto failed_alloc; - if (!ReadFile(file, buffer, size, &size, NULL) || !CryptMsgUpdate(hmsg, buffer, size, TRUE)) goto failed; + if (!ReadFile(file, buffer, size, &size, NULL) || !CryptMsgUpdate(hmsg, buffer, size, TRUE)) goto done; size = sizeof(DWORD); if (!CryptMsgGetParam(hmsg, CMSG_ATTR_CERT_COUNT_PARAM, 0, &cc->attr_count, &size)) goto failed; @@ -955,9 +955,12 @@ HANDLE WINAPI CryptCATOpen(WCHAR *filename, DWORD flags, HCRYPTPROV hProv, } cc->inner = decode_inner_content(hmsg, dwEncodingType, &cc->inner_len); if (!cc->inner || !CryptSIPRetrieveSubjectGuid(filename, NULL, &cc->subject)) goto failed; + +done: cc->magic = CRYPTCAT_MAGIC; HeapFree(GetProcessHeap(), 0, buffer); CloseHandle(file); + SetLastError(ERROR_SUCCESS); return cc; failed_alloc: diff --git a/dlls/wintrust/tests/crypt.c b/dlls/wintrust/tests/crypt.c index 1b436e9f4ab..5f9c402e00f 100644 --- a/dlls/wintrust/tests/crypt.c +++ b/dlls/wintrust/tests/crypt.c @@ -429,10 +429,10 @@ static void test_CryptCATOpen(void) } else { - todo_wine ok(cat != INVALID_HANDLE_VALUE, "flags %#x: expected success\n", flags); - todo_wine ok(!GetLastError(), "flags %#x: got error %u\n", flags, GetLastError()); + ok(cat != INVALID_HANDLE_VALUE, "flags %#x: expected success\n", flags); + ok(!GetLastError(), "flags %#x: got error %u\n", flags, GetLastError()); ret = pCryptCATClose(cat); - todo_wine ok(ret, "flags %#x: failed to close file\n", flags); + ok(ret, "flags %#x: failed to close file\n", flags); ret = DeleteFileW(filename); ok(ret, "flags %#x: failed to delete file, error %u\n", flags, GetLastError()); } @@ -443,10 +443,10 @@ static void test_CryptCATOpen(void) SetLastError(0xdeadbeef); cat = pCryptCATOpen(filename, flags, 0, 0, 0); - todo_wine ok(cat != INVALID_HANDLE_VALUE, "flags %#x: expected success\n", flags); - todo_wine ok(!GetLastError(), "flags %#x: got error %u\n", flags, GetLastError()); + ok(cat != INVALID_HANDLE_VALUE, "flags %#x: expected success\n", flags); + ok(!GetLastError(), "flags %#x: got error %u\n", flags, GetLastError()); ret = pCryptCATClose(cat); - todo_wine ok(ret, "flags %#x: failed to close file\n", flags); + ok(ret, "flags %#x: failed to close file\n", flags); file = _wfopen(filename, L"r"); ret = fread(buffer, 1, sizeof(buffer), file); -- 2.29.2