Juan Lang : crypt32: Allow one update to a decode message after the final update if it' s a detached message.

Alexandre Julliard julliard at winehq.org
Wed Mar 26 09:16:04 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Mar 25 11:44:54 2008 -0700

crypt32: Allow one update to a decode message after the final update if it's a detached message.

---

 dlls/crypt32/msg.c       |   47 ++++++++++++++++++++++++++++++++++++++++-----
 dlls/crypt32/tests/msg.c |    1 -
 2 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 5607f18..056c698 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -52,6 +52,7 @@ BOOL CRYPT_DefaultMsgControl(HCRYPTMSG hCryptMsg, DWORD dwFlags,
 typedef enum _CryptMsgState {
     MsgStateInit,
     MsgStateUpdated,
+    MsgStateDataFinalized,
     MsgStateFinalized
 } CryptMsgState;
 
@@ -1663,10 +1664,30 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
         SetLastError(CRYPT_E_MSG_ERROR);
     else if (msg->base.streamed)
     {
-        ret = CDecodeMsg_CopyData(msg, pbData, cbData);
         FIXME("(%p, %p, %d, %d): streamed update stub\n", hCryptMsg, pbData,
          cbData, fFinal);
-        msg->base.state = fFinal ? MsgStateFinalized : MsgStateUpdated;
+        if (fFinal)
+        {
+            if (msg->base.open_flags & CMSG_DETACHED_FLAG &&
+             msg->base.state != MsgStateDataFinalized)
+            {
+                ret = CDecodeMsg_CopyData(msg, pbData, cbData);
+                msg->base.state = MsgStateDataFinalized;
+            }
+            else
+            {
+                FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg,
+                 pbData, cbData, fFinal);
+                ret = TRUE;
+                msg->base.state = MsgStateFinalized;
+            }
+        }
+        else
+        {
+            ret = CDecodeMsg_CopyData(msg, pbData, cbData);
+            if (msg->base.state == MsgStateInit)
+                msg->base.state = MsgStateUpdated;
+        }
     }
     else
     {
@@ -1674,10 +1695,24 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
             SetLastError(CRYPT_E_MSG_ERROR);
         else
         {
-            ret = CDecodeMsg_CopyData(msg, pbData, cbData);
-            if (ret)
-                ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data, msg->type);
-            msg->base.state = MsgStateFinalized;
+            if (msg->base.state == MsgStateInit)
+            {
+                ret = CDecodeMsg_CopyData(msg, pbData, cbData);
+                if (ret)
+                    ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data,
+                     msg->type);
+                if (msg->base.open_flags & CMSG_DETACHED_FLAG)
+                    msg->base.state = MsgStateDataFinalized;
+                else
+                    msg->base.state = MsgStateFinalized;
+            }
+            else if (msg->base.state == MsgStateDataFinalized)
+            {
+                FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg,
+                 pbData, cbData, fFinal);
+                ret = TRUE;
+                msg->base.state = MsgStateFinalized;
+            }
         }
     }
     return ret;
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index fb71540..e88d382 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2062,7 +2062,6 @@ static void test_decode_msg_update(void)
     /* as does a second (probably to update the detached portion).. */
     ret = CryptMsgUpdate(msg, detachedSignedContent,
      sizeof(detachedSignedContent), TRUE);
-    todo_wine
     ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError());
     /* while a third fails. */
     ret = CryptMsgUpdate(msg, detachedSignedContent,




More information about the wine-cvs mailing list