Juan Lang : crypt32: Set *pcbDecoded in every function.
Alexandre Julliard
julliard at winehq.org
Tue Sep 18 05:31:29 CDT 2007
Module: wine
Branch: master
Commit: 2e8ae598e11ee1c87e51b02ce7bea63f52b94646
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e8ae598e11ee1c87e51b02ce7bea63f52b94646
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Sep 17 17:18:53 2007 -0700
crypt32: Set *pcbDecoded in every function.
---
dlls/crypt32/decode.c | 53 +++++++++++++++++++++++++++++++++++++------------
1 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index 9cc5a89..fab4b9a 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -397,7 +397,7 @@ static BOOL CRYPT_AsnDecodeSequenceItems(struct AsnDecodeSequenceItem items[],
ret = FALSE;
}
}
- if (ret)
+ if (cbDecoded)
*cbDecoded = decoded;
TRACE("returning %d\n", ret);
return ret;
@@ -702,6 +702,8 @@ static BOOL CRYPT_AsnDecodeDerBlob(const BYTE *pbEncoded, DWORD cbEncoded,
if (!(dwFlags & CRYPT_DECODE_NOCOPY_FLAG))
bytesNeeded += 1 + lenBytes + dataLen;
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if ((ret = CRYPT_DecodeCheckSpace(pcbStructInfo, bytesNeeded)))
@@ -810,7 +812,6 @@ static BOOL WINAPI CRYPT_AsnDecodeCertSignedContent(DWORD dwCertEncodingType,
return ret;
}
-/* Internal function */
static BOOL CRYPT_AsnDecodeCertVersion(const BYTE *pbEncoded, DWORD cbEncoded,
DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded)
{
@@ -822,7 +823,9 @@ static BOOL CRYPT_AsnDecodeCertVersion(const BYTE *pbEncoded, DWORD cbEncoded,
BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
ret = CRYPT_AsnDecodeIntInternal(pbEncoded + 1 + lenBytes, dataLen,
- dwFlags, pvStructInfo, pcbStructInfo, pcbDecoded);
+ dwFlags, pvStructInfo, pcbStructInfo, NULL);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
}
return ret;
}
@@ -857,7 +860,9 @@ static BOOL CRYPT_AsnDecodeCertExtensions(const BYTE *pbEncoded,
BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
ret = CRYPT_AsnDecodeExtensionsInternal(pbEncoded + 1 + lenBytes,
- dataLen, dwFlags, pvStructInfo, pcbStructInfo, pcbDecoded);
+ dataLen, dwFlags, pvStructInfo, pcbStructInfo, NULL);
+ if (ret && pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
}
return ret;
}
@@ -1409,6 +1414,8 @@ static BOOL CRYPT_AsnDecodeNameValueInternal(const BYTE *pbEncoded,
return FALSE;
}
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!value)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
@@ -1581,6 +1588,8 @@ static BOOL CRYPT_AsnDecodeUnicodeNameValueInternal(const BYTE *pbEncoded,
return FALSE;
}
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!value)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
@@ -2122,6 +2131,8 @@ static BOOL CRYPT_AsnDecodeBool(const BYTE *pbEncoded, DWORD cbEncoded,
SetLastError(CRYPT_E_ASN1_CORRUPT);
return FALSE;
}
+ if (pcbDecoded)
+ *pcbDecoded = 3;
if (!pvStructInfo)
{
*pcbStructInfo = sizeof(BOOL);
@@ -2413,7 +2424,9 @@ static BOOL CRYPT_AsnDecodePKCSContent(const BYTE *pbEncoded, DWORD cbEncoded,
if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &innerLen)))
{
ret = CRYPT_AsnDecodeCopyBytes(pbEncoded, dataLen, dwFlags,
- pvStructInfo, pcbStructInfo, pcbDecoded);
+ pvStructInfo, pcbStructInfo, NULL);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
}
}
return ret;
@@ -2590,7 +2603,7 @@ static BOOL CRYPT_AsnDecodePathLenConstraint(const BYTE *pbEncoded,
DWORD size = sizeof(constraint->dwPathLenConstraint);
ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded, dwFlags,
- &constraint->dwPathLenConstraint, &size, NULL);
+ &constraint->dwPathLenConstraint, &size, pcbDecoded);
if (ret)
constraint->fPathLenConstraint = TRUE;
TRACE("got an int, dwPathLenConstraint is %d\n",
@@ -2776,10 +2789,14 @@ static BOOL CRYPT_AsnDecodeOctetsInternal(const BYTE *pbEncoded,
if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
{
+ BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
+
if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG)
bytesNeeded = sizeof(CRYPT_DATA_BLOB);
else
bytesNeeded = dataLen + sizeof(CRYPT_DATA_BLOB);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
@@ -2791,7 +2808,6 @@ static BOOL CRYPT_AsnDecodeOctetsInternal(const BYTE *pbEncoded,
else
{
CRYPT_DATA_BLOB *blob;
- BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
blob = (CRYPT_DATA_BLOB *)pvStructInfo;
blob->cbData = dataLen;
@@ -2872,6 +2888,7 @@ static BOOL CRYPT_AsnDecodeBitsInternal(const BYTE *pbEncoded, DWORD cbEncoded,
if (pbEncoded[0] == ASN_BITSTRING)
{
DWORD bytesNeeded, dataLen;
+ BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
{
@@ -2879,6 +2896,8 @@ static BOOL CRYPT_AsnDecodeBitsInternal(const BYTE *pbEncoded, DWORD cbEncoded,
bytesNeeded = sizeof(CRYPT_BIT_BLOB);
else
bytesNeeded = dataLen - 1 + sizeof(CRYPT_BIT_BLOB);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
@@ -2893,12 +2912,10 @@ static BOOL CRYPT_AsnDecodeBitsInternal(const BYTE *pbEncoded, DWORD cbEncoded,
blob = (CRYPT_BIT_BLOB *)pvStructInfo;
blob->cbData = dataLen - 1;
- blob->cUnusedBits = *(pbEncoded + 1 +
- GET_LEN_BYTES(pbEncoded[1]));
+ blob->cUnusedBits = *(pbEncoded + 1 + lenBytes);
if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG)
{
- blob->pbData = (BYTE *)pbEncoded + 2 +
- GET_LEN_BYTES(pbEncoded[1]);
+ blob->pbData = (BYTE *)pbEncoded + 2 + lenBytes;
}
else
{
@@ -2907,8 +2924,8 @@ static BOOL CRYPT_AsnDecodeBitsInternal(const BYTE *pbEncoded, DWORD cbEncoded,
{
BYTE mask = 0xff << blob->cUnusedBits;
- memcpy(blob->pbData, pbEncoded + 2 +
- GET_LEN_BYTES(pbEncoded[1]), blob->cbData);
+ memcpy(blob->pbData, pbEncoded + 2 + lenBytes,
+ blob->cbData);
blob->pbData[blob->cbData - 1] &= mask;
}
}
@@ -3060,6 +3077,8 @@ static BOOL CRYPT_AsnDecodeIntegerInternal(const BYTE *pbEncoded,
BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
bytesNeeded = dataLen + sizeof(CRYPT_INTEGER_BLOB);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
@@ -3150,6 +3169,8 @@ static BOOL CRYPT_AsnDecodeUnsignedIntegerInternal(const BYTE *pbEncoded,
{
BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
bytesNeeded = dataLen + sizeof(CRYPT_INTEGER_BLOB);
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
@@ -3405,6 +3426,8 @@ static BOOL CRYPT_AsnDecodeUtcTimeInternal(const BYTE *pbEncoded,
else
{
ret = TRUE;
+ if (pcbDecoded)
+ *pcbDecoded = 2 + len;
pbEncoded += 2;
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 2, sysTime.wYear);
if (sysTime.wYear >= 50)
@@ -3506,6 +3529,8 @@ static BOOL CRYPT_AsnDecodeGeneralizedTime(const BYTE *pbEncoded,
SYSTEMTIME sysTime = { 0 };
ret = TRUE;
+ if (pcbDecoded)
+ *pcbDecoded = 2 + len;
pbEncoded += 2;
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 4, sysTime.wYear);
CRYPT_TIME_GET_DIGITS(pbEncoded, len, 2, sysTime.wMonth);
@@ -3741,6 +3766,8 @@ static BOOL CRYPT_AsnDecodeDistPointName(const BYTE *pbEncoded,
}
else
bytesNeeded = sizeof(CRL_DIST_POINT_NAME);
+ if (pcbDecoded)
+ *pcbDecoded = 1 + lenBytes + dataLen;
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if (*pcbStructInfo < bytesNeeded)
More information about the wine-cvs
mailing list