Modify ENGINE_pkey_asn1_find_str() to use a read lock instead of a write
authorMatt Caswell <matt@openssl.org>
Fri, 12 May 2023 10:57:26 +0000 (11:57 +0100)
committerTomas Mraz <tomas@openssl.org>
Tue, 6 Jun 2023 15:09:13 +0000 (17:09 +0200)
commitb8fa5be5506e43b405c9a3ecc3d65c77044777be
tree69490590f0cec4bb8f3188ccced4d8f371f733be
parente568d64f9fd3505454704f333bc1e58286f3419d
Modify ENGINE_pkey_asn1_find_str() to use a read lock instead of a write

ENGINE_pkey_asn1_find_str() does not make any modifications to fields
controlled by the global_engine_lock. The only change made is the struct_ref
field which is controlled separately. Therefore we can afford to only take
a read lock. This also impacts EVP_PKEY_asn1_find_str().

This lock ends up being obtained indirectly from numerous public API
functions including EVP_PKEY_key_gen(), EVP_PKEY_new_raw_public_key_ex(),
EVP_PKEY_copy_parameters() etc. This occurs even if no engines are actually
in use.

Some tests showed this lock being obtained 6 times after a "warmed up"
s_server instance with default configuration processed a handshake from a
default s_client. When processing a resumption handshake from s_client it
was obtained 8 times.

Partially fixes #20286

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20950)
crypto/engine/tb_asnmth.c