Module: wine Branch: master Commit: 30355fa674312de2780989d82fdd2e151741d37a URL: http://source.winehq.org/git/wine.git/?a=commit;h=30355fa674312de2780989d82f...
Author: Juan Lang juan.lang@gmail.com Date: Wed Oct 10 17:49:33 2007 -0700
crypt32: Don't check tag in AsnDecodeIntInternal, caller already checks it.
---
dlls/crypt32/decode.c | 26 ++++++++++++++++---------- 1 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index 7bba04b..d0cf6cc 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -3118,6 +3118,7 @@ static BOOL WINAPI CRYPT_AsnDecodeBits(DWORD dwCertEncodingType, return ret; }
+/* Ignores tag. Only allows integers 4 bytes or smaller in size. */ static BOOL CRYPT_AsnDecodeIntInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { @@ -3127,14 +3128,8 @@ static BOOL CRYPT_AsnDecodeIntInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD size = sizeof(buf);
blob->pbData = buf + sizeof(CRYPT_INTEGER_BLOB); - if (pbEncoded[0] != ASN_INTEGER) - { - SetLastError(CRYPT_E_ASN1_BADTAG); - ret = FALSE; - } - else - ret = CRYPT_AsnDecodeIntegerInternal(pbEncoded, cbEncoded, 0, &buf, - &size, pcbDecoded); + ret = CRYPT_AsnDecodeIntegerInternal(pbEncoded, cbEncoded, 0, &buf, + &size, pcbDecoded); if (ret) { if (!pvStructInfo) @@ -3173,8 +3168,19 @@ static BOOL WINAPI CRYPT_AsnDecodeInt(DWORD dwCertEncodingType, { DWORD bytesNeeded;
- ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded, - dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL); + if (!cbEncoded) + { + SetLastError(CRYPT_E_ASN1_CORRUPT); + ret = FALSE; + } + else if (pbEncoded[0] != ASN_INTEGER) + { + SetLastError(CRYPT_E_ASN1_BADTAG); + ret = FALSE; + } + else + ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded, + dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL); if (ret) { if (!pvStructInfo)