]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Unlock only when lock was successful 24646/head
authorcchinchole <cpchinchole@gmail.com>
Tue, 2 Jul 2024 01:16:03 +0000 (20:16 -0500)
committerNeil Horman <nhorman@openssl.org>
Wed, 3 Jul 2024 19:03:00 +0000 (15:03 -0400)
Addressing issue (#24517):
Updated the example in CRYPTO_THREAD_run_once.pod to reflect that an unlock call should not be made if a write_lock failed.
Updated BIO_lookup_ex in bio_addr.c and ossl_engine_table_select in eng_table.c to not call unlock if the lock failed.

Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Todd Short <todd.short@me.com>
(Merged from https://github.com/openssl/openssl/pull/24779)

crypto/bio/bio_addr.c
crypto/engine/eng_table.c
doc/man3/CRYPTO_THREAD_run_once.pod

index 0a64d0749a29b02ee934e614dbaa8e5c82cb533c..abdf3523045d641628cd0a9936926a44d274a259 100644 (file)
@@ -799,14 +799,12 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
         if (!RUN_ONCE(&bio_lookup_init, do_bio_lookup_init)) {
             /* Should this be raised inside do_bio_lookup_init()? */
             ERR_raise(ERR_LIB_BIO, ERR_R_CRYPTO_LIB);
-            ret = 0;
-            goto err;
+            return 0;
         }
 
-        if (!CRYPTO_THREAD_write_lock(bio_lookup_lock)) {
-            ret = 0;
-            goto err;
-        }
+        if (!CRYPTO_THREAD_write_lock(bio_lookup_lock))
+            return 0;
+        
         he_fallback_address = INADDR_ANY;
         if (host == NULL) {
             he = &he_fallback;
index 9dc3144bbfd7b610c1cd73f056a9c7a0ea862bc8..cb43e2d967fa41d4f6df1fbdc250e53b0cf5ff9e 100644 (file)
@@ -215,9 +215,11 @@ ENGINE *ossl_engine_table_select(ENGINE_TABLE **table, int nid,
                    f, l, nid);
         return NULL;
     }
-    ERR_set_mark();
+
     if (!CRYPTO_THREAD_write_lock(global_engine_lock))
-        goto end;
+        return NULL;
+
+    ERR_set_mark();
     /*
      * Check again inside the lock otherwise we could race against cleanup
      * operations. But don't worry about a debug printout
index e26f406f121780d1a7cf3a8a79c5251317f3e4bb..b8894f1db58c5454c655a5f662184ab81c5b34ad 100644 (file)
@@ -244,10 +244,13 @@ This example safely initializes and uses a lock.
  {
      int ret = 0;
 
-     if (mylock()) {
-         /* Your code here, do not return without releasing the lock! */
-         ret = ... ;
+     if (!mylock()) {
+        /* Do not unlock unless the lock was successfully acquired. */
+        return 0;
      }
+
+     /* Your code here, do not return without releasing the lock! */
+     ret = ... ;
      myunlock();
      return ret;
  }