Fix missing unlock in decoder_pkey.c

We hit an assertion failure during a call to CRYPTO_THREAD_read_lock
during memfail testing.

This was caused by us attempting to take a read lock in the same thread
that already held the same lock for writing resulting in an EBUSY
return.

This occured because we triggered a memory failure path in
DECODER_new_for_pkey, which never unlocked a write lock we were holding.

Fix it by ensuring the lock is released in the error path.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Saša Nedvědický <sashan@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28216)
This commit is contained in:
Neil Horman 2025-08-10 17:55:15 -04:00
parent 7d78cd722b
commit c0527256d2
1 changed files with 1 additions and 0 deletions

View File

@ -928,6 +928,7 @@ OSSL_DECODER_CTX_new_for_pkey(EVP_PKEY **pkey,
(void)lh_DECODER_CACHE_ENTRY_insert(cache->hashtable, newcache); (void)lh_DECODER_CACHE_ENTRY_insert(cache->hashtable, newcache);
if (lh_DECODER_CACHE_ENTRY_error(cache->hashtable)) { if (lh_DECODER_CACHE_ENTRY_error(cache->hashtable)) {
ctx = NULL; ctx = NULL;
CRYPTO_THREAD_unlock(cache->lock);
ERR_raise(ERR_LIB_OSSL_DECODER, ERR_R_CRYPTO_LIB); ERR_raise(ERR_LIB_OSSL_DECODER, ERR_R_CRYPTO_LIB);
goto err; goto err;
} }