diff options
Diffstat (limited to 'crypto/evp/keymgmt_lib.c')
-rw-r--r-- | crypto/evp/keymgmt_lib.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/crypto/evp/keymgmt_lib.c b/crypto/evp/keymgmt_lib.c index 27b9f6b907..4f0dc2d4a7 100644 --- a/crypto/evp/keymgmt_lib.c +++ b/crypto/evp/keymgmt_lib.c @@ -101,7 +101,8 @@ void *evp_keymgmt_util_export_to_provider(EVP_PKEY *pk, EVP_KEYMGMT *keymgmt) if (pk->keymgmt == keymgmt) return pk->keydata; - CRYPTO_THREAD_read_lock(pk->lock); + if (!CRYPTO_THREAD_read_lock(pk->lock)) + return NULL; /* * If the provider native "origin" hasn't changed since last time, we * try to find our keymgmt in the operation cache. If it has changed @@ -156,7 +157,10 @@ void *evp_keymgmt_util_export_to_provider(EVP_PKEY *pk, EVP_KEYMGMT *keymgmt) return NULL; } - CRYPTO_THREAD_write_lock(pk->lock); + if (!CRYPTO_THREAD_write_lock(pk->lock)) { + evp_keymgmt_freedata(keymgmt, import_data.keydata); + return NULL; + } /* Check to make sure some other thread didn't get there first */ op = evp_keymgmt_util_find_operation_cache(pk, keymgmt); if (op != NULL && op->keydata != NULL) { |