[PATCH 3/3] wintrust: Don't fail CryptCATOpen if file is empty or its data invalid.

Rémi Bernon rbernon at codeweavers.com
Wed Dec 16 07:41:42 CST 2020


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 <rbernon at codeweavers.com>
---

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




More information about the wine-devel mailing list