From: Matt Caswell Date: Fri, 8 Jan 2021 13:22:59 +0000 (+0000) Subject: Make sure we take the ctx->lock in ossl_lib_ctx_generic_new() X-Git-Tag: openssl-3.0.0-alpha11~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2c40421440d260ddb97a807b064033f61ae3b2b3;p=thirdparty%2Fopenssl.git Make sure we take the ctx->lock in ossl_lib_ctx_generic_new() The function ossl_lib_ctx_generic_new() modifies the exdata. This may be simultaneously being modified by other threads and therefore we need to make sure we take the lock before doing so. Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/13660) --- diff --git a/crypto/context.c b/crypto/context.c index c351ff96192..953de5a489e 100644 --- a/crypto/context.c +++ b/crypto/context.c @@ -228,10 +228,14 @@ static void ossl_lib_ctx_generic_new(void *parent_ign, void *ptr_ign, long argl_ign, void *argp) { const OSSL_LIB_CTX_METHOD *meth = argp; - void *ptr = meth->new_func(crypto_ex_data_get_ossl_lib_ctx(ad)); + OSSL_LIB_CTX *ctx = crypto_ex_data_get_ossl_lib_ctx(ad); + void *ptr = meth->new_func(ctx); - if (ptr != NULL) + if (ptr != NULL) { + CRYPTO_THREAD_write_lock(ctx->lock); CRYPTO_set_ex_data(ad, index, ptr); + CRYPTO_THREAD_unlock(ctx->lock); + } } static void ossl_lib_ctx_generic_free(void *parent_ign, void *ptr, CRYPTO_EX_DATA *ad, int index,