Make sure we take the ctx->lock in ossl_lib_ctx_generic_new()
authorMatt Caswell <matt@openssl.org>
Fri, 8 Jan 2021 13:22:59 +0000 (13:22 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 14 Jan 2021 17:30:46 +0000 (17:30 +0000)
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 <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/13660)

crypto/context.c

index c351ff96192b654165cbbaeb8b606c1b6fa072e7..953de5a489eac88de3f4ce8bf8230faa20d77f34 100644 (file)
@@ -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,