Module: wine Branch: master Commit: c5699e736fa6b02e0093bba9cf695496745d3935 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5699e736fa6b02e0093bba9cf...
Author: Juan Lang juan.lang@gmail.com Date: Wed Oct 14 13:08:24 2009 -0700
crypt32: Allocate memory if requested in CRYPT_AsnDecodeArray.
---
dlls/crypt32/decode.c | 27 ++++++++++++++++----------- 1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index dff574d..8c177d3 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -600,8 +600,7 @@ struct AsnArrayItemSize };
/* Decodes an array of like types into a structure described by a struct - * AsnArrayDescriptor. Doesn't allocate memory for the decoded items, - * leaves that up to the caller. + * AsnArrayDescriptor. */ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, @@ -618,11 +617,6 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, SetLastError(CRYPT_E_ASN1_EOD); 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) { DWORD dataLen; @@ -713,18 +707,29 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, *pcbDecoded = decoded; if (!pvStructInfo) *pcbStructInfo = bytesNeeded; - else if ((ret = CRYPT_DecodeEnsureSpace(0, NULL, pvStructInfo, - pcbStructInfo, bytesNeeded))) + else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, + pvStructInfo, pcbStructInfo, bytesNeeded))) { DWORD i, *pcItems; BYTE *nextData; const BYTE *ptr; void *rgItems;
+ if (dwFlags & CRYPT_DECODE_ALLOC_FLAG) + pvStructInfo = *(void **)pvStructInfo; pcItems = pvStructInfo; *pcItems = cItems; - rgItems = *(void **)((BYTE *)pcItems - - arrayDesc->countOffset + arrayDesc->arrayOffset); + if (dwFlags & CRYPT_DECODE_ALLOC_FLAG) + { + 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; for (i = 0, ptr = pbEncoded + 1 + lenBytes; ret && i < cItems && ptr - pbEncoded - 1 - lenBytes <