From aed4e5a041c65312c17dfca8f558d1c5d2a3c977 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 25 Mar 2008 11:44:54 -0700 Subject: [PATCH] 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 h typedef enum _CryptMsgState { MsgStateInit, MsgStateUpdated, + MsgStateDataFinalized, MsgStateFinalized } CryptMsgState; @@ -1663,10 +1664,30 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG 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 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, -- 1.4.1