sk_*_push() returns the number of items on the stack, not the index of the
[openssl.git] / crypto / cryptlib.c
index e16bbc6626c2f4579abac200dd2cbd4f4283b187..830ccc9816fed171af843429023e35e9fd9481cf 100644 (file)
@@ -269,10 +269,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);
@@ -467,7 +475,9 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
                struct CRYPTO_dynlock_value *pointer
                        = CRYPTO_get_dynlock_value(type);
 
-               if (pointer && dynlock_lock_callback)
+               OPENSSL_assert(pointer != NULL);
+
+               if (dynlock_lock_callback)
                        {
                        dynlock_lock_callback(mode, pointer, file, line);
                        }
@@ -523,7 +533,7 @@ const char *CRYPTO_get_lock_name(int type)
                return("dynamic");
        else if (type < CRYPTO_NUM_LOCKS)
                return(lock_names[type]);
-       else if (type-CRYPTO_NUM_LOCKS >= sk_num(app_locks))
+       else if (type-CRYPTO_NUM_LOCKS > sk_num(app_locks))
                return("ERROR");
        else
                return(sk_value(app_locks,type-CRYPTO_NUM_LOCKS));
@@ -555,3 +565,11 @@ BOOL WINAPI DLLEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason,
 #endif
 
 #endif
+
+void OpenSSLDie(const char *file,int line,const char *assertion)
+       {
+       fprintf(stderr,
+               "%s(%d): OpenSSL internal error, assertion failed: %s\n",
+               file,line,assertion);
+       abort();
+       }