Commit 9576c150 authored by Richard Levitte's avatar Richard Levitte
Browse files

sk_*_push() returns the number of items on the stack, not the index of the

pushed item.  The index is the number of items - 1.  And if a NULL item was
found, actually use it.
Finally, provide a little bit of safety in CRYPTO_lock() by asserting the a
requested dynamic lock really must exist, instead of just being silent about it
parent 56f940ed
Loading
Loading
Loading
Loading
+14 −3
Original line number Original line Diff line number Diff line
@@ -58,6 +58,7 @@


#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <assert.h>
#include "cryptlib.h"
#include "cryptlib.h"
#include <openssl/crypto.h>
#include <openssl/crypto.h>
#include <openssl/safestack.h>
#include <openssl/safestack.h>
@@ -205,10 +206,18 @@ int CRYPTO_get_new_dynlockid(void)
	i=sk_CRYPTO_dynlock_find(dyn_locks,NULL);
	i=sk_CRYPTO_dynlock_find(dyn_locks,NULL);
	/* If there was none, push, thereby creating a new one */
	/* If there was none, push, thereby creating a new one */
	if (i == -1)
	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);
	CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK);


	if (!i)
	if (i == -1)
		{
		{
		dynlock_destroy_callback(pointer->data,__FILE__,__LINE__);
		dynlock_destroy_callback(pointer->data,__FILE__,__LINE__);
		OPENSSL_free(pointer);
		OPENSSL_free(pointer);
@@ -404,7 +413,9 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
		struct CRYPTO_dynlock_value *pointer
		struct CRYPTO_dynlock_value *pointer
			= CRYPTO_get_dynlock_value(i);
			= CRYPTO_get_dynlock_value(i);


		if (pointer && dynlock_lock_callback)
		assert(pointer != NULL);

		if (dynlock_lock_callback)
			{
			{
			dynlock_lock_callback(mode, pointer, file, line);
			dynlock_lock_callback(mode, pointer, file, line);
			}
			}