Module: wine Branch: master Commit: c7e3ea148470995b2c7ae6f228eadb7313bd5064 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c7e3ea148470995b2c7ae6f228...
Author: Juan Lang juan.lang@gmail.com Date: Wed Oct 14 12:56:38 2009 -0700
crypt32: Explicitly pass array pointer when decoding CTL entry attributes rather than assuming a particular alignment.
---
dlls/crypt32/decode.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index fdd0251..8c0b4bd 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -111,7 +111,7 @@ static BOOL CRYPT_AsnDecodeIntegerInternal(const BYTE *pbEncoded, static BOOL CRYPT_AsnDecodeUnsignedIntegerInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded); -static BOOL CRYPT_AsnDecodePKCSAttributesInternal(const BYTE *pbEncoded, +static BOOL CRYPT_AsnDecodePKCSAttributeInternal(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded);
@@ -2362,6 +2362,38 @@ static BOOL CRYPT_AsnDecodeCTLUsage(const BYTE *pbEncoded, DWORD cbEncoded, return ret; }
+static BOOL CRYPT_AsnDecodeCTLEntryAttributes(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + struct AsnArrayDescriptor arrayDesc = { 0, + CRYPT_AsnDecodePKCSAttributeInternal, sizeof(CRYPT_ATTRIBUTE), TRUE, + offsetof(CRYPT_ATTRIBUTE, pszObjId) }; + DWORD bytesNeeded; + BOOL ret; + + ret = CRYPT_AsnDecodeArrayNoAlloc(&arrayDesc, pbEncoded, cbEncoded, + NULL, NULL, &bytesNeeded, pcbDecoded); + if (ret) + { + bytesNeeded += FINALMEMBERSIZE(CTL_ENTRY, cAttribute); + if (!pvStructInfo) + *pcbStructInfo = bytesNeeded; + else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, NULL, pvStructInfo, + pcbStructInfo, bytesNeeded))) + { + CTL_ENTRY *entry; + + entry = (CTL_ENTRY *)((BYTE *)pvStructInfo - + offsetof(CTL_ENTRY, cAttribute)); + ret = CRYPT_AsnDecodeArrayNoAlloc(&arrayDesc, pbEncoded, + cbEncoded, &entry->cAttribute, entry->rgAttribute, &bytesNeeded, + pcbDecoded); + } + } + return ret; +} + static BOOL CRYPT_AsnDecodeCTLEntry(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { @@ -2370,8 +2402,9 @@ static BOOL CRYPT_AsnDecodeCTLEntry(const BYTE *pbEncoded, DWORD cbEncoded, CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB), FALSE, TRUE, offsetof(CTL_ENTRY, SubjectIdentifier.pbData), 0 }, { ASN_CONSTRUCTOR | ASN_SETOF, offsetof(CTL_ENTRY, cAttribute), - CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES), FALSE, - TRUE, offsetof(CTL_ENTRY, rgAttribute), 0 }, + CRYPT_AsnDecodeCTLEntryAttributes, + FINALMEMBERSIZE(CTL_ENTRY, cAttribute), FALSE, TRUE, + offsetof(CTL_ENTRY, rgAttribute), 0 }, }; BOOL ret = TRUE; CTL_ENTRY *entry = pvStructInfo;