This commit was manufactured by cvs2svn to create branch
[oweals/openssl.git] / crypto / cryptlib.c
index 690cee5f4e0b720cf1e252d77bee0d5afb79cb79..2924def2bb0840899d477dff44d12393f36fbc12 100644 (file)
@@ -104,7 +104,8 @@ static const char* lock_names[CRYPTO_NUM_LOCKS] =
        "dynlock",
        "engine",
        "ui",
-#if CRYPTO_NUM_LOCKS != 32
+       "hwcrhk",               /* This is a HACK which will disappear in 0.9.8 */
+#if CRYPTO_NUM_LOCKS != 33
 # error "Inconsistency between crypto.h and cryptlib.c"
 #endif
        };
@@ -207,10 +208,18 @@ int CRYPTO_get_new_dynlockid(void)
        i=sk_CRYPTO_dynlock_find(dyn_locks,NULL);
        /* If there was none, push, thereby creating a new one */
        if (i == -1)
-               i=sk_CRYPTO_dynlock_push(dyn_locks,pointer);
+               /* Since sk_push() returns the number of items on the
+                  stack, not the location of the pushed item, we need
+                  to transform the returned number into a position,
+                  by decreasing it.  */
+               i=sk_CRYPTO_dynlock_push(dyn_locks,pointer) - 1;
+       else
+               /* If we found a place with a NULL pointer, put our pointer
+                  in it.  */
+               sk_CRYPTO_dynlock_set(dyn_locks,i,pointer);
        CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK);
 
-       if (!i)
+       if (i == -1)
                {
                dynlock_destroy_callback(pointer->data,__FILE__,__LINE__);
                OPENSSL_free(pointer);
@@ -402,15 +411,17 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
 #endif
        if (type < 0)
                {
-               struct CRYPTO_dynlock_value *pointer
-                       = CRYPTO_get_dynlock_value(type);
-
-               if (pointer && dynlock_lock_callback)
+               if (dynlock_lock_callback != NULL)
                        {
+                       struct CRYPTO_dynlock_value *pointer
+                               = CRYPTO_get_dynlock_value(type);
+
+                       OPENSSL_assert(pointer != NULL);
+
                        dynlock_lock_callback(mode, pointer, file, line);
-                       }
 
-               CRYPTO_destroy_dynlockid(type);
+                       CRYPTO_destroy_dynlockid(type);
+                       }
                }
        else
                if (locking_callback != NULL)