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