Juan Lang : crypt32: Allow indefinite-length encoding of sequence items.
Alexandre Julliard
julliard at winehq.org
Tue Sep 18 05:31:31 CDT 2007
Module: wine
Branch: master
Commit: 34aaabca830018d6a5212e0a91f3a25032601fc3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=34aaabca830018d6a5212e0a91f3a25032601fc3
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Sep 17 17:26:51 2007 -0700
crypt32: Allow indefinite-length encoding of sequence items.
---
dlls/crypt32/decode.c | 40 +++++++++++++++++++++++++++++++---------
1 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index 7b231ea..0de2e6a 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -310,8 +310,8 @@ static BOOL CRYPT_AsnDecodeSequenceItems(struct AsnDecodeSequenceItem items[],
{
DWORD nextItemLen;
- if ((ret = CRYPT_GetLen(ptr, cbEncoded - (ptr - pbEncoded),
- &nextItemLen)))
+ if ((ret = CRYPT_GetLengthIndefinite(ptr,
+ cbEncoded - (ptr - pbEncoded), &nextItemLen)))
{
BYTE nextItemLenBytes = GET_LEN_BYTES(ptr[1]);
@@ -326,15 +326,21 @@ static BOOL CRYPT_AsnDecodeSequenceItems(struct AsnDecodeSequenceItem items[],
}
if (items[i].decodeFunc)
{
+ DWORD nextItemEncodedLen, nextItemDecoded;
+
+ if (nextItemLen == CMSG_INDEFINITE_LENGTH)
+ nextItemEncodedLen = cbEncoded - (ptr - pbEncoded);
+ else
+ nextItemEncodedLen = 1 + nextItemLenBytes +
+ nextItemLen;
if (pvStructInfo)
TRACE("decoding item %d\n", i);
else
TRACE("sizing item %d\n", i);
- ret = items[i].decodeFunc(ptr,
- 1 + nextItemLenBytes + nextItemLen,
+ ret = items[i].decodeFunc(ptr, nextItemEncodedLen,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG,
pvStructInfo ? (BYTE *)pvStructInfo + items[i].offset
- : NULL, &items[i].size, NULL);
+ : NULL, &items[i].size, &nextItemDecoded);
if (ret)
{
/* Account for alignment padding */
@@ -345,10 +351,20 @@ static BOOL CRYPT_AsnDecodeSequenceItems(struct AsnDecodeSequenceItem items[],
if (nextData && items[i].hasPointer &&
items[i].size > items[i].minSize)
nextData += items[i].size - items[i].minSize;
- ptr += 1 + nextItemLenBytes + nextItemLen;
- decoded += 1 + nextItemLenBytes + nextItemLen;
- TRACE("item %d: decoded %d bytes\n", i,
- 1 + nextItemLenBytes + nextItemLen);
+ if (nextItemDecoded > nextItemEncodedLen)
+ {
+ WARN("decoded length %d exceeds encoded %d\n",
+ nextItemDecoded, nextItemEncodedLen);
+ SetLastError(CRYPT_E_ASN1_CORRUPT);
+ ret = FALSE;
+ }
+ else
+ {
+ ptr += nextItemDecoded;
+ decoded += nextItemDecoded;
+ TRACE("item %d: decoded %d bytes\n", i,
+ nextItemDecoded);
+ }
}
else if (items[i].optional &&
GetLastError() == CRYPT_E_ASN1_BADTAG)
@@ -362,6 +378,12 @@ static BOOL CRYPT_AsnDecodeSequenceItems(struct AsnDecodeSequenceItem items[],
TRACE("item %d failed: %08x\n", i,
GetLastError());
}
+ else if (nextItemLen == CMSG_INDEFINITE_LENGTH)
+ {
+ ERR("can't use indefinite length encoding without a decoder\n");
+ SetLastError(CRYPT_E_ASN1_CORRUPT);
+ ret = FALSE;
+ }
else
{
TRACE("item %d: decoded %d bytes\n", i,
More information about the wine-cvs
mailing list