Module: wine Branch: master Commit: 65296a476d08bb8f332b81f4d519361e02a069d8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=65296a476d08bb8f332b81f4d5...
Author: Juan Lang juan.lang@gmail.com Date: Wed Oct 14 12:47:27 2009 -0700
crypt32: Explicitly pass array pointer when decoding PKCS attribute values rather than assuming a particular alignment.
---
dlls/crypt32/decode.c | 36 ++++++++++++++++++++++++++++++++++-- 1 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index 50d99b4..a9f3383 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -2884,6 +2884,37 @@ static BOOL WINAPI CRYPT_AsnDecodePolicyQualifierUserNotice( return ret; }
+static BOOL CRYPT_AsnDecodePKCSAttributeValue(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + BOOL ret; + struct AsnArrayDescriptor arrayDesc = { 0, CRYPT_AsnDecodeCopyBytes, + sizeof(CRYPT_DER_BLOB), TRUE, offsetof(CRYPT_DER_BLOB, pbData) }; + DWORD bytesNeeded; + + TRACE("%p, %d, %08x, %p, %d, %p\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, pvStructInfo ? *pcbStructInfo : 0, pcbDecoded); + + if ((ret = CRYPT_AsnDecodeArrayNoAlloc(&arrayDesc, pbEncoded, cbEncoded, + NULL, NULL, &bytesNeeded, pcbDecoded))) + { + bytesNeeded += FINALMEMBERSIZE(CRYPT_ATTRIBUTE, cValue); + if (!pvStructInfo) + *pcbStructInfo = bytesNeeded; + else if ((ret = CRYPT_DecodeEnsureSpace(0, NULL, pvStructInfo, + pcbStructInfo, bytesNeeded))) + { + CRYPT_ATTRIBUTE *attr = (CRYPT_ATTRIBUTE *)((BYTE *)pvStructInfo - + offsetof(CRYPT_ATTRIBUTE, cValue)); + + ret = CRYPT_AsnDecodeArrayNoAlloc(&arrayDesc, pbEncoded, cbEncoded, + &attr->cValue, attr->rgValue, pcbStructInfo, pcbDecoded); + } + } + return ret; +} + static BOOL CRYPT_AsnDecodePKCSAttributeInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) @@ -2894,8 +2925,9 @@ static BOOL CRYPT_AsnDecodePKCSAttributeInternal(const BYTE *pbEncoded, CRYPT_AsnDecodeOidIgnoreTag, sizeof(LPSTR), FALSE, TRUE, offsetof(CRYPT_ATTRIBUTE, pszObjId), 0 }, { ASN_CONSTRUCTOR | ASN_SETOF, offsetof(CRYPT_ATTRIBUTE, cValue), - CRYPT_DecodeDERArray, sizeof(struct GenericArray), FALSE, TRUE, - offsetof(CRYPT_ATTRIBUTE, rgValue), 0 }, + CRYPT_AsnDecodePKCSAttributeValue, + FINALMEMBERSIZE(CRYPT_ATTRIBUTE, cValue), FALSE, + TRUE, offsetof(CRYPT_ATTRIBUTE, rgValue), 0 }, }; PCRYPT_ATTRIBUTE attr = pvStructInfo;