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