Juan Lang : wintrust: Correct ObjectTrust error with empty files.

Alexandre Julliard julliard at winehq.org
Thu Sep 15 12:34:52 CDT 2011


Module: wine
Branch: master
Commit: c0a8694bbcae10ebecbca540e3a571193af75697
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c0a8694bbcae10ebecbca540e3a571193af75697

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Sep 14 08:45:10 2011 -0700

wintrust: Correct ObjectTrust error with empty files.

---

 dlls/wintrust/softpub.c       |   15 +++++++-
 dlls/wintrust/tests/softpub.c |   81 ++++++++++++++++++++++++++++-------------
 2 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c
index fc1bc13..0f54c0b 100644
--- a/dlls/wintrust/softpub.c
+++ b/dlls/wintrust/softpub.c
@@ -117,7 +117,20 @@ static DWORD SOFTPUB_GetFileSubject(CRYPT_PROVIDER_DATA *data)
          data->pWintrustData->u.pFile->pcwszFilePath,
          data->pWintrustData->u.pFile->hFile,
          &data->u.pPDSip->gSubject))
-            err = GetLastError();
+        {
+            LARGE_INTEGER fileSize;
+            DWORD sipError = GetLastError();
+
+            /* Special case for empty files: the error is expected to be
+             * TRUST_E_SUBJECT_FORM_UNKNOWN, rather than whatever
+             * CryptSIPRetrieveSubjectGuid returns.
+             */
+            if (GetFileSizeEx(data->pWintrustData->u.pFile->hFile, &fileSize)
+             && !fileSize.QuadPart)
+                err = TRUST_E_SUBJECT_FORM_UNKNOWN;
+            else
+                err = sipError;
+        }
     }
     else
         data->u.pPDSip->gSubject = *data->pWintrustData->u.pFile->pgKnownSubject;
diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c
index 7ec24a9..8f23085 100644
--- a/dlls/wintrust/tests/softpub.c
+++ b/dlls/wintrust/tests/softpub.c
@@ -276,6 +276,25 @@ static void getNotepadPath(WCHAR *notepadPathW, DWORD size)
     MultiByteToWideChar(0, 0, notepadPath, -1, notepadPathW, size);
 }
 
+/* Creates a test file and returns a handle to it.  The file's path is returned
+ * in temp_file, which must be at least MAX_PATH characters in length.
+ */
+static HANDLE create_temp_file(WCHAR *temp_file)
+{
+    HANDLE file = INVALID_HANDLE_VALUE;
+    WCHAR temp_path[MAX_PATH];
+
+    if (GetTempPathW(sizeof(temp_path) / sizeof(temp_path[0]), temp_path))
+    {
+        static const WCHAR img[] = { 'i','m','g',0 };
+
+        if (GetTempFileNameW(temp_path, img, 0, temp_file))
+            file = CreateFileW(temp_file, GENERIC_READ | GENERIC_WRITE, 0, NULL,
+             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+    }
+    return file;
+}
+
 static void testObjTrust(SAFE_PROVIDER_FUNCTIONS *funcs, GUID *actionID)
 {
     HRESULT ret;
@@ -298,7 +317,7 @@ static void testObjTrust(SAFE_PROVIDER_FUNCTIONS *funcs, GUID *actionID)
      funcs->pfnAlloc(TRUSTERROR_MAX_STEPS * sizeof(DWORD));
     if (data.padwTrustStepErrors)
     {
-        WCHAR notepadPathW[MAX_PATH];
+        WCHAR pathW[MAX_PATH];
         PROVDATA_SIP provDataSIP = { 0 };
         static const GUID unknown = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,
          0x00,0xC0,0x4F,0xC2,0x95,0xEE } };
@@ -333,14 +352,34 @@ static void testObjTrust(SAFE_PROVIDER_FUNCTIONS *funcs, GUID *actionID)
         /* Crashes
         ret = funcs->pfnObjectTrust(&data);
          */
-        getNotepadPath(notepadPathW, MAX_PATH);
-        fileInfo.pcwszFilePath = notepadPathW;
+        /* Create and test with an empty file */
+        fileInfo.hFile = create_temp_file(pathW);
         /* pfnObjectTrust now crashes unless both pPDSip and psPfns are set */
         U(data).pPDSip = &provDataSIP;
         data.psPfns = (CRYPT_PROVIDER_FUNCTIONS *)funcs;
         ret = funcs->pfnObjectTrust(&data);
         ok(ret == S_FALSE, "Expected S_FALSE, got %08x\n", ret);
         ok(data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] ==
+         TRUST_E_SUBJECT_FORM_UNKNOWN,
+         "expected TRUST_E_SUBJECT_FORM_UNKNOWN, got %08x\n",
+         data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV]);
+        CloseHandle(fileInfo.hFile);
+        fileInfo.hFile = NULL;
+        fileInfo.pcwszFilePath = pathW;
+        ret = funcs->pfnObjectTrust(&data);
+        ok(ret == S_FALSE, "Expected S_FALSE, got %08x\n", ret);
+        ok(data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] ==
+         TRUST_E_SUBJECT_FORM_UNKNOWN,
+         "expected TRUST_E_SUBJECT_FORM_UNKNOWN, got %08x\n",
+         data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV]);
+        DeleteFileW(pathW);
+        /* Test again with a file we expect to exist, and to contain no
+         * signature.
+         */
+        getNotepadPath(pathW, MAX_PATH);
+        ret = funcs->pfnObjectTrust(&data);
+        ok(ret == S_FALSE, "Expected S_FALSE, got %08x\n", ret);
+        ok(data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] ==
          TRUST_E_NOSIGNATURE ||
          data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] ==
          TRUST_E_SUBJECT_FORM_UNKNOWN,
@@ -598,23 +637,6 @@ static struct _PeImage {
 };
 #include <poppack.h>
 
-/* Creates a test file and returns a handle to it.  The file's path is returned
- * in temp_file, which must be at least MAX_PATH characters in length.
- */
-static HANDLE create_temp_file(char *temp_file)
-{
-    HANDLE file = INVALID_HANDLE_VALUE;
-    char temp_path[MAX_PATH];
-
-    if (GetTempPathA(sizeof(temp_path), temp_path))
-    {
-        if (GetTempFileNameA(temp_path, "img", 0, temp_file))
-            file = CreateFileA(temp_file, GENERIC_READ | GENERIC_WRITE, 0, NULL,
-             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-    }
-    return file;
-}
-
 static void test_sip_create_indirect_data(void)
 {
     static GUID unknown = { 0xC689AAB8, 0x8E78, 0x11D0, { 0x8C,0x47,
@@ -622,7 +644,7 @@ static void test_sip_create_indirect_data(void)
     static char oid_sha1[] = szOID_OIWSEC_sha1;
     BOOL ret;
     SIP_SUBJECTINFO subjinfo = { 0 };
-    char temp_file[MAX_PATH];
+    WCHAR temp_file[MAX_PATH];
     HANDLE file;
     DWORD count;
 
@@ -708,7 +730,7 @@ static void test_sip_create_indirect_data(void)
         HeapFree(GetProcessHeap(), 0, indirect);
     }
     CloseHandle(file);
-    DeleteFileA(temp_file);
+    DeleteFileW(temp_file);
 }
 
 static void test_wintrust(void)
@@ -718,7 +740,7 @@ static void test_wintrust(void)
     WINTRUST_FILE_INFO file;
     LONG r;
     HRESULT hr;
-    WCHAR notepadPathW[MAX_PATH];
+    WCHAR pathW[MAX_PATH];
 
     memset(&wtd, 0, sizeof(wtd));
     wtd.cbStruct = sizeof(wtd);
@@ -729,8 +751,17 @@ static void test_wintrust(void)
     wtd.dwStateAction = WTD_STATEACTION_VERIFY;
     memset(&file, 0, sizeof(file));
     file.cbStruct = sizeof(file);
-    getNotepadPath(notepadPathW, MAX_PATH);
-    file.pcwszFilePath = notepadPathW;
+    file.pcwszFilePath = pathW;
+    /* Test with an empty file */
+    file.hFile = create_temp_file(pathW);
+    r = WinVerifyTrust(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd);
+    ok(r == TRUST_E_SUBJECT_FORM_UNKNOWN,
+     "expected TRUST_E_SUBJECT_FORM_UNKNOWN, got %08x\n", r);
+    CloseHandle(file.hFile);
+    DeleteFileW(pathW);
+    file.hFile = NULL;
+    /* Test with a known file path, which we expect not have a signature */
+    getNotepadPath(pathW, MAX_PATH);
     r = WinVerifyTrust(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd);
     ok(r == TRUST_E_NOSIGNATURE || r == CRYPT_E_FILE_ERROR,
      "expected TRUST_E_NOSIGNATURE or CRYPT_E_FILE_ERROR, got %08x\n", r);




More information about the wine-cvs mailing list