Piotr Caban : wintrust: Fix CryptSIPGetSignedMsg (from PE file).
Alexandre Julliard
julliard at winehq.org
Tue May 3 13:31:03 CDT 2011
Module: wine
Branch: master
Commit: 3a945c3987a2e488168a4b6f52c5f5609929229e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3a945c3987a2e488168a4b6f52c5f5609929229e
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue May 3 18:50:48 2011 +0200
wintrust: Fix CryptSIPGetSignedMsg (from PE file).
---
dlls/wintrust/crypt.c | 28 ++++++++++++++++++++++++----
1 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/dlls/wintrust/crypt.c b/dlls/wintrust/crypt.c
index 4f4ed24..341f45b 100644
--- a/dlls/wintrust/crypt.c
+++ b/dlls/wintrust/crypt.c
@@ -1016,16 +1016,27 @@ static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo,
{
BOOL ret;
WIN_CERTIFICATE *pCert = NULL;
+ HANDLE file;
TRACE("(%p %p %d %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
pcbSignedDataMsg, pbSignedDataMsg);
+
+ if(pSubjectInfo->hFile && pSubjectInfo->hFile!=INVALID_HANDLE_VALUE)
+ file = pSubjectInfo->hFile;
+ else
+ {
+ file = CreateFileW(pSubjectInfo->pwsFileName, GENERIC_READ,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
+ if(file == INVALID_HANDLE_VALUE)
+ return FALSE;
+ }
if (!pbSignedDataMsg)
{
WIN_CERTIFICATE cert;
/* app hasn't passed buffer, just get the length */
- ret = ImageGetCertificateHeader(pSubjectInfo->hFile, dwIndex, &cert);
+ ret = ImageGetCertificateHeader(file, dwIndex, &cert);
if (ret)
{
switch (cert.wCertificateType)
@@ -1044,7 +1055,7 @@ static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo,
{
DWORD len = 0;
- ret = ImageGetCertificateData(pSubjectInfo->hFile, dwIndex, NULL, &len);
+ ret = ImageGetCertificateData(file, dwIndex, NULL, &len);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
goto error;
pCert = HeapAlloc(GetProcessHeap(), 0, len);
@@ -1053,10 +1064,10 @@ static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo,
ret = FALSE;
goto error;
}
- ret = ImageGetCertificateData(pSubjectInfo->hFile, dwIndex, pCert,
- &len);
+ ret = ImageGetCertificateData(file, dwIndex, pCert, &len);
if (!ret)
goto error;
+ pCert->dwLength -= FIELD_OFFSET(WIN_CERTIFICATE, bCertificate);
if (*pcbSignedDataMsg < pCert->dwLength)
{
*pcbSignedDataMsg = pCert->dwLength;
@@ -1066,6 +1077,7 @@ static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo,
else
{
memcpy(pbSignedDataMsg, pCert->bCertificate, pCert->dwLength);
+ *pcbSignedDataMsg = pCert->dwLength;
switch (pCert->wCertificateType)
{
case WIN_CERT_TYPE_X509:
@@ -1083,6 +1095,8 @@ static BOOL WINTRUST_GetSignedMsgFromPEFile(SIP_SUBJECTINFO *pSubjectInfo,
}
}
error:
+ if(pSubjectInfo->hFile != file)
+ CloseHandle(file);
HeapFree(GetProcessHeap(), 0, pCert);
return ret;
}
@@ -1351,6 +1365,12 @@ BOOL WINAPI CryptSIPGetSignedDataMsg(SIP_SUBJECTINFO* pSubjectInfo, DWORD* pdwEn
TRACE("(%p %p %d %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
pcbSignedDataMsg, pbSignedDataMsg);
+ if(!pSubjectInfo)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
if (!memcmp(pSubjectInfo->pgSubjectType, &unknown, sizeof(unknown)))
ret = WINTRUST_GetSignedMsgFromPEFile(pSubjectInfo, pdwEncodingType,
dwIndex, pcbSignedDataMsg, pbSignedDataMsg);
More information about the wine-cvs
mailing list