crypt32: Explicitly pass pointers to blob arrays rather than relying on an invalid alignment assumption.

This commit is contained in:
Juan Lang 2009-10-15 16:23:17 -07:00 committed by Alexandre Julliard
parent 5f317d702a
commit 3000bc200a
1 changed files with 23 additions and 22 deletions

View File

@ -719,27 +719,22 @@ static BOOL CRYPT_ConstructBlob(CRYPT_DATA_BLOB *out, const CRYPT_DATA_BLOB *in)
return ret;
}
typedef struct _BlobArray
{
DWORD cBlobs;
PCRYPT_DATA_BLOB blobs;
} BlobArray;
static BOOL CRYPT_ConstructBlobArray(BlobArray *out, const BlobArray *in)
static BOOL CRYPT_ConstructBlobArray(DWORD *outCBlobs,
PCRYPT_DATA_BLOB *outPBlobs, DWORD cBlobs, const PCRYPT_DATA_BLOB pBlobs)
{
BOOL ret = TRUE;
out->cBlobs = in->cBlobs;
if (out->cBlobs)
*outCBlobs = cBlobs;
if (cBlobs)
{
out->blobs = CryptMemAlloc(out->cBlobs * sizeof(CRYPT_DATA_BLOB));
if (out->blobs)
*outPBlobs = CryptMemAlloc(cBlobs * sizeof(CRYPT_DATA_BLOB));
if (*outPBlobs)
{
DWORD i;
memset(out->blobs, 0, out->cBlobs * sizeof(CRYPT_DATA_BLOB));
for (i = 0; ret && i < out->cBlobs; i++)
ret = CRYPT_ConstructBlob(&out->blobs[i], &in->blobs[i]);
memset(*outPBlobs, 0, cBlobs * sizeof(CRYPT_DATA_BLOB));
for (i = 0; ret && i < cBlobs; i++)
ret = CRYPT_ConstructBlob(&(*outPBlobs)[i], &pBlobs[i]);
}
else
ret = FALSE;
@ -747,6 +742,12 @@ static BOOL CRYPT_ConstructBlobArray(BlobArray *out, const BlobArray *in)
return ret;
}
typedef struct _BlobArray
{
DWORD cBlobs;
PCRYPT_DATA_BLOB blobs;
} BlobArray;
static void CRYPT_FreeBlobArray(BlobArray *array)
{
DWORD i;
@ -765,8 +766,8 @@ static BOOL CRYPT_ConstructAttribute(CRYPT_ATTRIBUTE *out,
if (out->pszObjId)
{
strcpy(out->pszObjId, in->pszObjId);
ret = CRYPT_ConstructBlobArray((BlobArray *)&out->cValue,
(const BlobArray *)&in->cValue);
ret = CRYPT_ConstructBlobArray(&out->cValue, &out->rgValue,
in->cValue, in->rgValue);
}
else
ret = FALSE;
@ -1435,13 +1436,13 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
}
}
if (ret)
ret = CRYPT_ConstructBlobArray(
(BlobArray *)&msg->msg_data.info->cCertEncoded,
(const BlobArray *)&info->cCertEncoded);
ret = CRYPT_ConstructBlobArray(&msg->msg_data.info->cCertEncoded,
&msg->msg_data.info->rgCertEncoded, info->cCertEncoded,
info->rgCertEncoded);
if (ret)
ret = CRYPT_ConstructBlobArray(
(BlobArray *)&msg->msg_data.info->cCrlEncoded,
(const BlobArray *)&info->cCrlEncoded);
ret = CRYPT_ConstructBlobArray(&msg->msg_data.info->cCrlEncoded,
&msg->msg_data.info->rgCrlEncoded, info->cCrlEncoded,
info->rgCrlEncoded);
if (!ret)
{
CSignedEncodeMsg_Close(msg);