Fix a couple of cases where an attempt is made to lock an already locked
authorDr. Stephen Henson <steve@openssl.org>
Thu, 29 Apr 1999 22:25:52 +0000 (22:25 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 29 Apr 1999 22:25:52 +0000 (22:25 +0000)
mutex.

ssl/s2_clnt.c
ssl/ssl_sess.c

index e2e6a2b45fe7bc1d94687779be135dfec62bfcd8..600d8c3c153d9b384e828b0cda61a4d3cca6c0ae 100644 (file)
@@ -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;
index e06f3ad5e9e7f8f34739314993e09c4fd727312c..a172107bd29f3df5b8db58135ea6dd0a5ba2dd56 100644 (file)
@@ -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)
                        {