summaryrefslogtreecommitdiffstats
path: root/crypto/pem
diff options
context:
space:
mode:
authorMilan Broz <gmazyland@gmail.com>2022-10-29 11:48:51 +0200
committerTomas Mraz <tomas@openssl.org>2022-11-10 18:10:48 +0100
commit373d90128042cb0409e347827d80b50a99d3965a (patch)
tree64b4a300cee9a2bee10a2792e823a339d08ec6e7 /crypto/pem
parent608aca8ed2becccfe9c238846834ea2b162fc98b (diff)
pem: avoid segfault if PKEY is NULL in PEM_write_bio_PrivateKey
Make the code more robust and correctly handle EVP_PKEY set to NULL instead of dereferencing null pointer. Signed-off-by: Milan Broz <gmazyland@gmail.com> Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19536)
Diffstat (limited to 'crypto/pem')
-rw-r--r--crypto/pem/pem_pkey.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/crypto/pem/pem_pkey.c b/crypto/pem/pem_pkey.c
index 53367c03db..8ffeed9d78 100644
--- a/crypto/pem/pem_pkey.c
+++ b/crypto/pem/pem_pkey.c
@@ -311,7 +311,7 @@ PEM_write_cb_ex_fnsig(PrivateKey, EVP_PKEY, BIO, write_bio)
IMPLEMENT_PEM_provided_write_body_main(pkey, bio);
legacy:
- if (x->ameth == NULL || x->ameth->priv_encode != NULL)
+ if (x != NULL && (x->ameth == NULL || x->ameth->priv_encode != NULL))
return PEM_write_bio_PKCS8PrivateKey(out, x, enc,
(const char *)kstr, klen, cb, u);
return PEM_write_bio_PrivateKey_traditional(out, x, enc, kstr, klen, cb, u);
@@ -336,6 +336,9 @@ int PEM_write_bio_PrivateKey_traditional(BIO *bp, const EVP_PKEY *x,
EVP_PKEY *copy = NULL;
int ret;
+ if (x == NULL)
+ return 0;
+
if (evp_pkey_is_assigned(x)
&& evp_pkey_is_provided(x)
&& evp_pkey_copy_downgraded(&copy, x))