Module: wine Branch: master Commit: 2f5ad179e53d8e5d5147f53a2a4578c8d7ab619f URL: https://gitlab.winehq.org/wine/wine/-/commit/2f5ad179e53d8e5d5147f53a2a4578c...
Author: Paul Gofman pgofman@codeweavers.com Date: Fri Sep 30 19:44:29 2022 -0500
wintrust: Initialize CRYPT_PROVIDER_SIGSTATE structure in Softpub provider.
---
dlls/wintrust/softpub.c | 32 ++++++++++++++++++++++++++++---- dlls/wintrust/tests/softpub.c | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c index 53df5e7fe60..1165f03c075 100644 --- a/dlls/wintrust/softpub.c +++ b/dlls/wintrust/softpub.c @@ -832,14 +832,32 @@ static DWORD WINTRUST_VerifySigner(CRYPT_PROVIDER_DATA *data, DWORD signerIdx)
HRESULT WINAPI SoftpubLoadSignature(CRYPT_PROVIDER_DATA *data) { - DWORD err; + DWORD err = ERROR_SUCCESS;
TRACE("(%p)\n", data);
if (!data->padwTrustStepErrors) return S_FALSE;
- if (data->hMsg) + if (data->pSigState) + { + /* We did not initialize this, probably an unsupported usage. */ + FIXME("pSigState %p already initialized.\n", data->pSigState); + } + if (!(data->pSigState = data->psPfns->pfnAlloc(sizeof(*data->pSigState)))) + { + err = ERROR_OUTOFMEMORY; + } + else + { + data->pSigState->cbStruct = sizeof(*data->pSigState); + data->pSigState->fSupportMultiSig = TRUE; + data->pSigState->dwCryptoPolicySupport = WSS_SIGTRUST_SUPPORT | WSS_OBJTRUST_SUPPORT | WSS_CERTTRUST_SUPPORT; + if (data->hMsg) + data->pSigState->hPrimarySig = CryptMsgDuplicate(data->hMsg); + } + + if (!err && data->hMsg) { DWORD signerCount, size;
@@ -859,8 +877,7 @@ HRESULT WINAPI SoftpubLoadSignature(CRYPT_PROVIDER_DATA *data) else err = TRUST_E_NOSIGNATURE; } - else - err = ERROR_SUCCESS; + if (err) data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_SIGPROV] = err; return !err ? S_OK : S_FALSE; @@ -1375,6 +1392,13 @@ HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data) data->psPfns->pfnFree(data->u.pPDSip->psIndirectData); }
+ if (WVT_ISINSTRUCT(CRYPT_PROVIDER_DATA, data->cbStruct, pSigState) && data->pSigState) + { + CryptMsgClose(data->pSigState->hPrimarySig); + for (i = 0; i < data->pSigState->cSecondarySigs; ++i) + CryptMsgClose(data->pSigState->rhSecondarySigs[i]); + data->psPfns->pfnFree(data->pSigState); + } CryptMsgClose(data->hMsg);
if (data->fOpenedFile && diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c index ab9655ef7e8..070e7c52034 100644 --- a/dlls/wintrust/tests/softpub.c +++ b/dlls/wintrust/tests/softpub.c @@ -1831,7 +1831,7 @@ static void test_multiple_signatures(void) ok(prov->cbStruct == sizeof(*prov), "Got size %lu.\n", prov->cbStruct); ok(prov->csSigners == 1, "Got %lu.\n", prov->csSigners); todo_wine ok(prov->pSigSettings == &settings, "Got %p, expected %p.\n", prov->pSigSettings, &settings); - todo_wine ok(!!prov->pSigState, "Got %p, expected %p.\n", prov->pSigSettings, &settings); + ok(!!prov->pSigState, "Got %p, expected %p.\n", prov->pSigSettings, &settings); if (prov->cbStruct == sizeof(*prov) && prov->pSigState) { ok(prov->pSigState->cbStruct == sizeof(*prov->pSigState)