crypt32: Allocate memory if requested in CRYPT_AsnDecodeArray.

This commit is contained in:
Juan Lang 2009-10-14 13:08:24 -07:00 committed by Alexandre Julliard
parent 3c25d7540f
commit c5699e736f

View file

@ -600,8 +600,7 @@ struct AsnArrayItemSize
}; };
/* Decodes an array of like types into a structure described by a struct /* Decodes an array of like types into a structure described by a struct
* AsnArrayDescriptor. Doesn't allocate memory for the decoded items, * AsnArrayDescriptor.
* leaves that up to the caller.
*/ */
static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
@ -618,11 +617,6 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
SetLastError(CRYPT_E_ASN1_EOD); SetLastError(CRYPT_E_ASN1_EOD);
ret = FALSE; ret = FALSE;
} }
else if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
{
FIXME("allocation not implemented yet\n");
ret = FALSE;
}
else if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag) else if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag)
{ {
DWORD dataLen; DWORD dataLen;
@ -713,18 +707,29 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
*pcbDecoded = decoded; *pcbDecoded = decoded;
if (!pvStructInfo) if (!pvStructInfo)
*pcbStructInfo = bytesNeeded; *pcbStructInfo = bytesNeeded;
else if ((ret = CRYPT_DecodeEnsureSpace(0, NULL, pvStructInfo, else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
pcbStructInfo, bytesNeeded))) pvStructInfo, pcbStructInfo, bytesNeeded)))
{ {
DWORD i, *pcItems; DWORD i, *pcItems;
BYTE *nextData; BYTE *nextData;
const BYTE *ptr; const BYTE *ptr;
void *rgItems; void *rgItems;
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
pvStructInfo = *(void **)pvStructInfo;
pcItems = pvStructInfo; pcItems = pvStructInfo;
*pcItems = cItems; *pcItems = cItems;
rgItems = *(void **)((BYTE *)pcItems - if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
arrayDesc->countOffset + arrayDesc->arrayOffset); {
rgItems = (BYTE *)pvStructInfo +
arrayDesc->minArraySize;
*(void **)((BYTE *)pcItems -
arrayDesc->countOffset + arrayDesc->arrayOffset) =
rgItems;
}
else
rgItems = *(void **)((BYTE *)pcItems -
arrayDesc->countOffset + arrayDesc->arrayOffset);
nextData = (BYTE *)rgItems + cItems * arrayDesc->itemSize; nextData = (BYTE *)rgItems + cItems * arrayDesc->itemSize;
for (i = 0, ptr = pbEncoded + 1 + lenBytes; ret && for (i = 0, ptr = pbEncoded + 1 + lenBytes; ret &&
i < cItems && ptr - pbEncoded - 1 - lenBytes < i < cItems && ptr - pbEncoded - 1 - lenBytes <