Currently CryptDecodeObject is broken regarding CRYPT_DECODE_ALLOC_FLAG handling, and it duplicates what CryptDecodeObjectEx already does including support for not Ex variant of the OID handlers.
So, instead of fixing CryptDecodeObject by copying the code for handling CRYPT_DECODE_ALLOC_FLAG from CryptDecodeObjectEx it's better to simply forward CryptDecodeObject to CryptDecodeObjectEx.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/crypt32/decode.c | 44 ++----------------------------------------- 1 file changed, 2 insertions(+), 42 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index b1778720cd..06d456a474 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -6276,48 +6276,8 @@ BOOL WINAPI CryptDecodeObject(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo) { - BOOL ret = FALSE; - CryptDecodeObjectFunc pCryptDecodeObject = NULL; - CryptDecodeObjectExFunc pCryptDecodeObjectEx = NULL; - HCRYPTOIDFUNCADDR hFunc = NULL; - - TRACE_(crypt)("(0x%08x, %s, %p, %d, 0x%08x, %p, %p)\n", dwCertEncodingType, - debugstr_a(lpszStructType), pbEncoded, cbEncoded, dwFlags, - pvStructInfo, pcbStructInfo); - - if (!pvStructInfo && !pcbStructInfo) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - if (cbEncoded > MAX_ENCODED_LEN) - { - SetLastError(CRYPT_E_ASN1_LARGE); - return FALSE; - } - - if (!(pCryptDecodeObjectEx = CRYPT_GetBuiltinDecoder(dwCertEncodingType, - lpszStructType))) - { - TRACE_(crypt)("OID %s not found or unimplemented, looking for DLL\n", - debugstr_a(lpszStructType)); - pCryptDecodeObject = CRYPT_LoadDecoderFunc(dwCertEncodingType, - lpszStructType, &hFunc); - if (!pCryptDecodeObject) - pCryptDecodeObjectEx = CRYPT_LoadDecoderExFunc(dwCertEncodingType, - lpszStructType, &hFunc); - } - if (pCryptDecodeObject) - ret = pCryptDecodeObject(dwCertEncodingType, lpszStructType, - pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo); - else if (pCryptDecodeObjectEx) - ret = pCryptDecodeObjectEx(dwCertEncodingType, lpszStructType, - pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, - pvStructInfo, pcbStructInfo); - if (hFunc) - CryptFreeOIDFunctionAddress(hFunc, 0); - TRACE_(crypt)("returning %d\n", ret); - return ret; + return CryptDecodeObjectEx(dwCertEncodingType, lpszStructType, + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo); }
BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,