Commit 6ef1c3e0 authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

crypt32: Let decoder helpers do more sanity checking.

parent 9afaafc0
...@@ -604,7 +604,12 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, ...@@ -604,7 +604,12 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
cbEncoded, dwFlags, pDecodePara, pvStructInfo, *pcbStructInfo, cbEncoded, dwFlags, pDecodePara, pvStructInfo, *pcbStructInfo,
startingPointer); startingPointer);
if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag) if (!cbEncoded)
{
SetLastError(CRYPT_E_ASN1_EOD);
ret = FALSE;
}
else if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag)
{ {
DWORD dataLen; DWORD dataLen;
...@@ -765,7 +770,12 @@ static BOOL CRYPT_AsnDecodeArrayNoAlloc(const struct AsnArrayDescriptor *arrayDe ...@@ -765,7 +770,12 @@ static BOOL CRYPT_AsnDecodeArrayNoAlloc(const struct AsnArrayDescriptor *arrayDe
TRACE("%p, %p, %d, %p, %p, %d\n", arrayDesc, pbEncoded, TRACE("%p, %p, %d, %p, %p, %d\n", arrayDesc, pbEncoded,
cbEncoded, pcItems, rgItems, pcItems ? *pcbItems : 0); cbEncoded, pcItems, rgItems, pcItems ? *pcbItems : 0);
if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag) if (!cbEncoded)
{
SetLastError(CRYPT_E_ASN1_EOD);
ret = FALSE;
}
else if (!arrayDesc->tag || pbEncoded[0] == arrayDesc->tag)
{ {
DWORD dataLen; DWORD dataLen;
...@@ -2494,7 +2504,7 @@ static BOOL CRYPT_AsnDecodeSMIMECapabilitiesInternal(const BYTE *pbEncoded, ...@@ -2494,7 +2504,7 @@ static BOOL CRYPT_AsnDecodeSMIMECapabilitiesInternal(const BYTE *pbEncoded,
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo,
DWORD *pcbDecoded) DWORD *pcbDecoded)
{ {
struct AsnArrayDescriptor arrayDesc = { 0, struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF,
CRYPT_AsnDecodeSMIMECapability, sizeof(CRYPT_SMIME_CAPABILITY), TRUE, CRYPT_AsnDecodeSMIMECapability, sizeof(CRYPT_SMIME_CAPABILITY), TRUE,
offsetof(CRYPT_SMIME_CAPABILITY, pszObjId) }; offsetof(CRYPT_SMIME_CAPABILITY, pszObjId) };
PCRYPT_SMIME_CAPABILITIES capabilities = pvStructInfo; PCRYPT_SMIME_CAPABILITIES capabilities = pvStructInfo;
...@@ -2519,11 +2529,7 @@ static BOOL WINAPI CRYPT_AsnDecodeSMIMECapabilities(DWORD dwCertEncodingType, ...@@ -2519,11 +2529,7 @@ static BOOL WINAPI CRYPT_AsnDecodeSMIMECapabilities(DWORD dwCertEncodingType,
{ {
DWORD bytesNeeded; DWORD bytesNeeded;
if (!cbEncoded) if ((ret = CRYPT_AsnDecodeSMIMECapabilitiesInternal(pbEncoded,
SetLastError(CRYPT_E_ASN1_EOD);
else if (pbEncoded[0] != ASN_SEQUENCEOF)
SetLastError(CRYPT_E_ASN1_CORRUPT);
else if ((ret = CRYPT_AsnDecodeSMIMECapabilitiesInternal(pbEncoded,
cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded,
NULL))) NULL)))
{ {
...@@ -2989,9 +2995,7 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSAttributes(DWORD dwCertEncodingType, ...@@ -2989,9 +2995,7 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSAttributes(DWORD dwCertEncodingType,
{ {
DWORD bytesNeeded; DWORD bytesNeeded;
if (!cbEncoded) if (pbEncoded[0] != (ASN_CONSTRUCTOR | ASN_SETOF))
SetLastError(CRYPT_E_ASN1_EOD);
else if (pbEncoded[0] != (ASN_CONSTRUCTOR | ASN_SETOF))
SetLastError(CRYPT_E_ASN1_CORRUPT); SetLastError(CRYPT_E_ASN1_CORRUPT);
else if ((ret = CRYPT_AsnDecodePKCSAttributesInternal(pbEncoded, else if ((ret = CRYPT_AsnDecodePKCSAttributesInternal(pbEncoded,
cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment