Juan Lang : crypt32: Allocate memory if requested in CRYPT_AsnDecodeArray.
Alexandre Julliard
julliard at winehq.org
Thu Oct 15 08:54:37 CDT 2009
Module: wine
Branch: master
Commit: c5699e736fa6b02e0093bba9cf695496745d3935
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5699e736fa6b02e0093bba9cf695496745d3935
Author: Juan Lang <juan.lang at 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 <
More information about the wine-cvs
mailing list