Commit 801294f8 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Fix a couple of cases where an attempt is made to lock an already locked

mutex.
parent 7185e2d6
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -438,7 +438,9 @@ static int get_server_hello(SSL *s)
	 * cert, Free's it before we increment the reference count. */
	CRYPTO_w_lock(CRYPTO_LOCK_X509);
	s->session->peer=s->session->cert->key->x509;
	CRYPTO_add(&s->session->peer->references,1,CRYPTO_LOCK_X509);
	/* Shouldn't do this: already locked */
	/*CRYPTO_add(&s->session->peer->references,1,CRYPTO_LOCK_X509);*/
	s->session->peer->references++;
	CRYPTO_w_unlock(CRYPTO_LOCK_X509);

	s->s2->conn_id_length=s->s2->tmp.conn_id_length;
+10 −4
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@

static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck);
static int ssl_session_num=0;
static STACK *ssl_session_meth=NULL;

@@ -304,8 +305,8 @@ int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
			while (SSL_CTX_sess_number(ctx) >
				SSL_CTX_sess_get_cache_size(ctx))
				{
				if (!SSL_CTX_remove_session(ctx,
					ctx->session_cache_tail))
				if (!remove_session_lock(ctx,
					ctx->session_cache_tail, 0))
					break;
				else
					ctx->stats.sess_cache_full++;
@@ -317,13 +318,18 @@ int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)
	}

int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
{
	return remove_session_lock(ctx, c, 1);
}

int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
	{
	SSL_SESSION *r;
	int ret=0;

	if ((c != NULL) && (c->session_id_length != 0))
		{
		CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
		if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
		r=(SSL_SESSION *)lh_delete(ctx->sessions,(char *)c);
		if (r != NULL)
			{
@@ -331,7 +337,7 @@ int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c)
			SSL_SESSION_list_remove(ctx,c);
			}

		CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
		if(lck) CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);

		if (ret)
			{