diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index db2a3b30d46..8ceceacb8ba 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -1065,6 +1065,12 @@ static BOOL CRYPT_AsnDecodeCRLEntry(const BYTE *pbEncoded, DWORD cbEncoded, ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags, NULL, entry, pcbStructInfo, pcbDecoded, entry ? entry->SerialNumber.pbData : NULL); + if (ret && entry && !entry->SerialNumber.cbData) + { + WARN("empty CRL entry serial number\n"); + SetLastError(CRYPT_E_ASN1_CORRUPT); + ret = FALSE; + } return ret; } diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 74ebe3cacf8..82d0344e502 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -4269,7 +4269,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, v1CRLWithIssuerAndEmptyEntry, v1CRLWithIssuerAndEmptyEntry[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(!ret && GetLastError() == CRYPT_E_ASN1_CORRUPT, + ok(!ret && GetLastError() == CRYPT_E_ASN1_CORRUPT, "Expected CRYPT_E_ASN1_CORRUPT, got %08x\n", GetLastError()); /* with a real CRL entry */ ret = CryptDecodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED,