You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2021/09/12 12:29:39 UTC

svn commit: r1893271 - /apr/apr/trunk/crypto/apr_crypto_prng.c

Author: ylavic
Date: Sun Sep 12 12:29:39 2021
New Revision: 1893271

URL: http://svn.apache.org/viewvc?rev=1893271&view=rev
Log:
apr_crypto_prng: cleanup after ourselves when apr_crypto_prng_init() fails.


Modified:
    apr/apr/trunk/crypto/apr_crypto_prng.c

Modified: apr/apr/trunk/crypto/apr_crypto_prng.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/crypto/apr_crypto_prng.c?rev=1893271&r1=1893270&r2=1893271&view=diff
==============================================================================
--- apr/apr/trunk/crypto/apr_crypto_prng.c (original)
+++ apr/apr/trunk/crypto/apr_crypto_prng.c Sun Sep 12 12:29:39 2021
@@ -138,6 +138,12 @@ APR_DECLARE(apr_status_t) apr_crypto_prn
         return APR_EREINIT;
     }
 
+    cprng_ring = apr_palloc(pool, sizeof(*cprng_ring));
+    if (!cprng_ring) {
+        return APR_ENOMEM;
+    }
+    APR_RING_INIT(cprng_ring, apr_crypto_prng_t, link);
+
     if (flags & APR_CRYPTO_PRNG_PER_THREAD) {
 #if !APR_HAS_THREADS
         return APR_ENOTIMPL;
@@ -150,12 +156,6 @@ APR_DECLARE(apr_status_t) apr_crypto_prn
 #endif
     }
 
-    cprng_ring = apr_palloc(pool, sizeof(*cprng_ring));
-    if (!cprng_ring) {
-        return APR_ENOMEM;
-    }
-    APR_RING_INIT(cprng_ring, apr_crypto_prng_t, link);
-
 #if APR_HAS_THREADS
     rv = apr_thread_mutex_create(&cprng_ring_mutex, APR_THREAD_MUTEX_DEFAULT,
                                  pool);
@@ -171,8 +171,17 @@ APR_DECLARE(apr_status_t) apr_crypto_prn
     flags = (flags | APR_CRYPTO_PRNG_LOCKED) & ~APR_CRYPTO_PRNG_PER_THREAD;
 #endif
 
-    return apr_crypto_prng_create(&cprng_global, crypto, cipher, bufsize, flags,
-            seed, pool);
+    rv = apr_crypto_prng_create(&cprng_global, crypto, cipher, bufsize, flags,
+                                seed, pool);
+    if (rv != APR_SUCCESS) {
+        if (flags & APR_CRYPTO_PRNG_PER_THREAD) {
+            apr_threadkey_private_delete(cprng_thread_key);
+            cprng_thread_key = NULL;
+        }
+        return rv;
+    }
+
+    return APR_SUCCESS;
 }
 
 APR_DECLARE(apr_status_t) apr_crypto_prng_term(void)