Juan Lang : crypt32: Allow items in an array to be indefinite-length encoded.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 05:31:23 CDT 2007


Module: wine
Branch: master
Commit: 52be131a2904989ffad66acf0eae9269fed83c45
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=52be131a2904989ffad66acf0eae9269fed83c45

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Sep 17 17:02:19 2007 -0700

crypt32: Allow items in an array to be indefinite-length encoded.

---

 dlls/crypt32/decode.c |   28 +++++++++++++---------------
 1 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index a5229b5..01d1092 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -574,23 +574,25 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
                         doneDecoding = TRUE;
                     if (!doneDecoding)
                     {
-                        DWORD itemDataLen, itemDecoded, size = 0;
+                        DWORD itemEncoded, itemDataLen, itemDecoded, size = 0;
 
                         /* Each item decoded may not tolerate extraneous bytes,
-                         * so get the length of the next element and pass it
-                         * directly.
+                         * so get the length of the next element if known.
                          */
-                        ret = CRYPT_GetLen(ptr, cbEncoded - (ptr - pbEncoded),
-                         &itemDataLen);
+                        if ((ret = CRYPT_GetLengthIndefinite(ptr,
+                         cbEncoded - (ptr - pbEncoded), &itemDataLen)))
+                        {
+                            if (itemDataLen == CMSG_INDEFINITE_LENGTH)
+                                itemEncoded = cbEncoded - (ptr - pbEncoded);
+                            else
+                                itemEncoded = 1 + itemLenBytes + itemDataLen;
+                        }
                         if (ret)
-                            ret = arrayDesc->decodeFunc(ptr,
-                             1 + itemLenBytes + itemDataLen,
+                            ret = arrayDesc->decodeFunc(ptr, itemEncoded,
                              dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &size,
                              &itemDecoded);
                         if (ret)
                         {
-                            DWORD nextLen;
-
                             cItems++;
                             if (itemSizes != &itemSize)
                                 itemSizes = CryptMemRealloc(itemSizes,
@@ -607,14 +609,10 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
                             if (itemSizes)
                             {
                                 decoded += itemDecoded;
-                                itemSizes[cItems - 1].encodedLen =
-                                 1 + itemLenBytes + itemDataLen;
+                                itemSizes[cItems - 1].encodedLen = itemEncoded;
                                 itemSizes[cItems - 1].size = size;
                                 bytesNeeded += size;
-                                ret = CRYPT_GetLen(ptr,
-                                 cbEncoded - (ptr - pbEncoded), &nextLen);
-                                if (ret)
-                                    ptr += nextLen + 1 + GET_LEN_BYTES(ptr[1]);
+                                ptr += itemEncoded;
                             }
                             else
                                 ret = FALSE;




More information about the wine-cvs mailing list