mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-20 08:26:39 +00:00
crypt32: Allocate memory if requested in CRYPT_AsnDecodeArray.
This commit is contained in:
parent
3c25d7540f
commit
c5699e736f
|
@ -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 <
|
||||||
|
|
Loading…
Reference in a new issue