Avoid race condition.
authorBodo Möller <bodo@openssl.org>
Tue, 24 Jul 2001 12:33:41 +0000 (12:33 +0000)
committerBodo Möller <bodo@openssl.org>
Tue, 24 Jul 2001 12:33:41 +0000 (12:33 +0000)
Submitted by: Travis Vitek <vitek@roguewave.com>

CHANGES
crypto/rand/md_rand.c

diff --git a/CHANGES b/CHANGES
index 50a26c6f500a80ce22735470a9d8a91e810b25f5..4d0063fb853dd7d81b7d164ce9554c3eb247a5da 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,7 +4,10 @@
 
  Changes between 0.9.6b and 0.9.6c  [XX xxx XXXX]
 
-  *) 
+  *) In crypto/rand/md_rand.c, set 'locking_thread' to current thread's ID
+     *before* setting the 'crypto_lock_rand' flag.  The previous code had
+     a race condition if 0 is a valid thread ID.
+     [Travis Vitek <vitek@roguewave.com>]
 
  Changes between 0.9.6a and 0.9.6b  [9 Jul 2001]
 
index 04b9d695b0d67f9ec5e869341c68db6397779750..0db87d45100eedd984bae94cc900d0b5bbf25d4b 100644 (file)
@@ -361,8 +361,8 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
        CRYPTO_w_lock(CRYPTO_LOCK_RAND);
 
        /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
-       crypto_lock_rand = 1;
        locking_thread = CRYPTO_thread_id();
+       crypto_lock_rand = 1;
 
        if (!initialized)
                {
@@ -435,7 +435,6 @@ static int ssleay_rand_bytes(unsigned char *buf, int num)
 
        /* before unlocking, we must clear 'crypto_lock_rand' */
        crypto_lock_rand = 0;
-       locking_thread = 0;
        CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
 
        while (num > 0)
@@ -528,8 +527,8 @@ static int ssleay_rand_status(void)
                CRYPTO_w_lock(CRYPTO_LOCK_RAND);
                
                /* prevent ssleay_rand_bytes() from trying to obtain the lock again */
-               crypto_lock_rand = 1;
                locking_thread = CRYPTO_thread_id();
+               crypto_lock_rand = 1;
                }
        
        if (!initialized)
@@ -544,7 +543,6 @@ static int ssleay_rand_status(void)
                {
                /* before unlocking, we must clear 'crypto_lock_rand' */
                crypto_lock_rand = 0;
-               locking_thread = 0;
                
                CRYPTO_w_unlock(CRYPTO_LOCK_RAND);
                }