poppler/NSSCryptoSignBackend.cc | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-)
New commits: commit 2c403ec533ad9ad821c37e3f80f8f361ce9cdea8 Author: Albert Astals Cid <[email protected]> Date: Mon Jun 26 00:51:22 2023 +0200 Fix crash if CERT_ExtractPublicKey doesn't return a public key Fixes KDE Bug #471422 diff --git a/poppler/NSSCryptoSignBackend.cc b/poppler/NSSCryptoSignBackend.cc index 108bff2a..6e9c1396 100644 --- a/poppler/NSSCryptoSignBackend.cc +++ b/poppler/NSSCryptoSignBackend.cc @@ -616,33 +616,37 @@ static std::unique_ptr<X509CertificateInfo> getCertificateInfoFromCERT(CERTCerti // public key info X509CertificateInfo::PublicKeyInfo pkInfo; SECKEYPublicKey *pk = CERT_ExtractPublicKey(cert); - switch (pk->keyType) { - case rsaKey: - pkInfo.publicKey = SECItemToGooString(pk->u.rsa.modulus); - pkInfo.publicKeyType = RSAKEY; - break; - case dsaKey: - pkInfo.publicKey = SECItemToGooString(pk->u.dsa.publicValue); - pkInfo.publicKeyType = DSAKEY; - break; - case ecKey: - pkInfo.publicKey = SECItemToGooString(pk->u.ec.publicValue); - pkInfo.publicKeyType = ECKEY; - break; - default: + if (pk) { + switch (pk->keyType) { + case rsaKey: + pkInfo.publicKey = SECItemToGooString(pk->u.rsa.modulus); + pkInfo.publicKeyType = RSAKEY; + break; + case dsaKey: + pkInfo.publicKey = SECItemToGooString(pk->u.dsa.publicValue); + pkInfo.publicKeyType = DSAKEY; + break; + case ecKey: + pkInfo.publicKey = SECItemToGooString(pk->u.ec.publicValue); + pkInfo.publicKeyType = ECKEY; + break; + default: + pkInfo.publicKey = SECItemToGooString(cert->subjectPublicKeyInfo.subjectPublicKey); + pkInfo.publicKeyType = OTHERKEY; + break; + } + pkInfo.publicKeyStrength = SECKEY_PublicKeyStrengthInBits(pk); + SECKEY_DestroyPublicKey(pk); + } else { pkInfo.publicKey = SECItemToGooString(cert->subjectPublicKeyInfo.subjectPublicKey); pkInfo.publicKeyType = OTHERKEY; - break; } - pkInfo.publicKeyStrength = SECKEY_PublicKeyStrengthInBits(pk); certInfo->setPublicKeyInfo(std::move(pkInfo)); certInfo->setKeyUsageExtensions(cert->keyUsage); certInfo->setCertificateDER(SECItemToGooString(cert->derCert)); certInfo->setIsSelfSigned(CERT_CompareName(&cert->subject, &cert->issuer) == SECEqual); - SECKEY_DestroyPublicKey(pk); - return certInfo; }
