From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/crypt32/msg.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index 832d52ddf2b..4d49aebe4b6 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -3698,6 +3698,36 @@ static BOOL CDecodeMsg_Control(HCRYPTMSG hCryptMsg, DWORD dwFlags, break; } break; + case CMSG_CTRL_DEL_CERT: + switch (msg->type) + { + case CMSG_SIGNED: + { + DWORD index = *(const DWORD *)pvCtrlPara; + + if (!msg->u.signed_data.info) + { + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + break; + } + if (index >= msg->u.signed_data.info->cCertEncoded) + { + SetLastError(CRYPT_E_INVALID_INDEX); + break; + } + TRACE("CMSG_CTRL_DEL_CERT: index %lu of %lu\n", index, msg->u.signed_data.info->cCertEncoded); + CryptMemFree(msg->u.signed_data.info->rgCertEncoded[index].pbData); + memmove(&msg->u.signed_data.info->rgCertEncoded[index], &msg->u.signed_data.info->rgCertEncoded[index + 1], + (msg->u.signed_data.info->cCertEncoded - index - 1) * sizeof(msg->u.signed_data.info->rgCertEncoded)); + msg->u.signed_data.info->cCertEncoded--; + ret = TRUE; + break; + } + default: + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + break; + } + break; case CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR: switch (msg->type) {