Paul Vriens : crypt32/tests: Prevent some crashes on Win9x (test_decode_msg ).

Alexandre Julliard julliard at winehq.org
Mon Feb 23 10:00:44 CST 2009


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

Author: Paul Vriens <Paul.Vriens.Wine at gmail.com>
Date:   Mon Feb 23 11:46:28 2009 +0100

crypt32/tests: Prevent some crashes on Win9x (test_decode_msg).

---

 dlls/crypt32/tests/msg.c |   68 +++++++++++++++++++++++++++------------------
 1 files changed, 41 insertions(+), 27 deletions(-)

diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 2188e6d..8913db4 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2022,29 +2022,33 @@ static void test_decode_msg_update(void)
     ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
     CryptMsgClose(msg);
 
-    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo);
-    /* Updating a message that has a NULL stream callback fails */
-    SetLastError(0xdeadbeef);
-    ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent),
-     FALSE);
-    todo_wine
-    ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
-     GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */),
-     "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n",
-     GetLastError());
-    /* Changing the callback pointer after the fact yields the same error (so
-     * the message must copy the stream info, not just store a pointer to it)
-     */
-    streamInfo.pfnStreamOutput = nop_stream_output;
-    SetLastError(0xdeadbeef);
-    ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent),
-     FALSE);
-    todo_wine
-    ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
-     GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */),
-     "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n",
-     GetLastError());
-    CryptMsgClose(msg);
+    if (have_nt)
+    {
+        msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo);
+        /* Updating a message that has a NULL stream callback fails */
+        SetLastError(0xdeadbeef);
+        /* Crashes on some Win9x */
+        ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent),
+         FALSE);
+        todo_wine
+        ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
+         GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */),
+         "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n",
+         GetLastError());
+        /* Changing the callback pointer after the fact yields the same error (so
+         * the message must copy the stream info, not just store a pointer to it)
+         */
+        streamInfo.pfnStreamOutput = nop_stream_output;
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent),
+         FALSE);
+        todo_wine
+        ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION ||
+         GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */),
+         "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n",
+         GetLastError());
+        CryptMsgClose(msg);
+    }
 
     /* Empty non-final updates are allowed when streaming.. */
     msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo);
@@ -2353,10 +2357,14 @@ static void test_decode_msg_get_param(void)
 
     msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
     ret = CryptMsgUpdate(msg, hashEmptyContent, sizeof(hashEmptyContent), TRUE);
-    check_param("empty hash content", msg, CMSG_CONTENT_PARAM, NULL, 0);
-    check_param("empty hash hash data", msg, CMSG_HASH_DATA_PARAM, NULL, 0);
-    check_param("empty hash computed hash", msg, CMSG_COMPUTED_HASH_PARAM,
-     emptyHashParam, sizeof(emptyHashParam));
+    if (ret)
+    {
+        /* Crashes on some Win9x */
+        check_param("empty hash content", msg, CMSG_CONTENT_PARAM, NULL, 0);
+        check_param("empty hash hash data", msg, CMSG_HASH_DATA_PARAM, NULL, 0);
+        check_param("empty hash computed hash", msg, CMSG_COMPUTED_HASH_PARAM,
+         emptyHashParam, sizeof(emptyHashParam));
+    }
     CryptMsgClose(msg);
     msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
     ret = CryptMsgUpdate(msg, hashContent, sizeof(hashContent), TRUE);
@@ -2477,6 +2485,12 @@ static void test_decode_msg_get_param(void)
     msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
     ret = CryptMsgUpdate(msg, signedKeyIdEmptyContent,
      sizeof(signedKeyIdEmptyContent), TRUE);
+    if (!ret && GetLastError() == OSS_DATA_ERROR)
+    {
+        /* Subsequent tests crashes on some Win9x, so bail out */
+        CryptMsgClose(msg);
+        return;
+    }
     ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError());
     size = sizeof(value);
     ret = CryptMsgGetParam(msg, CMSG_SIGNER_COUNT_PARAM, 0, &value, &size);




More information about the wine-cvs mailing list