Backport from 0.9.7:
authorLutz Jänicke <jaenicke@openssl.org>
Sun, 10 Feb 2002 12:52:57 +0000 (12:52 +0000)
committerLutz Jänicke <jaenicke@openssl.org>
Sun, 10 Feb 2002 12:52:57 +0000 (12:52 +0000)
Make removal from internal session cache more robust and do not store
into internal session cache when it won't be looked up anyway.

CHANGES
ssl/ssl_lib.c
ssl/ssl_sess.c

diff --git a/CHANGES b/CHANGES
index 2c6d772d149aab73fbc3958753eb09ea0a381ccd..f52b4da859e72ae2da1a7648409fe8ff89250c1f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,17 @@
 
  Changes between 0.9.6c and 0.9.6d  [XX xxx XXXX]
 
+  *) Make removal from session cache (SSL_CTX_remove_session()) more robust:
+     check whether we deal with a copy of a session and do not delete from
+     the cache in this case. Problem reported by "Izhar Shoshani Levi"
+     <izhar@checkpoint.com>.
+     [Lutz Jaenicke]
+
+  *) Do not store session data into the internal session cache, if it
+     is never intended to be looked up (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP
+     flag is set). Proposed by Aslam <aslam@funk.com>.
+     [Lutz Jaenicke]
+
   *) Have ASN1_BIT_STRING_set_bit() really clear a bit when the requested
      value is 0.
      [Richard Levitte]
index 2006a5a1eba258339610561ce62ab2a6623f95c0..24cec2afe51c1c1aceaa354d6de90acd3d6176bb 100644 (file)
@@ -1472,9 +1472,10 @@ void ssl_update_cache(SSL *s,int mode)
         * and it would be rather hard to do anyway :-) */
        if (s->session->session_id_length == 0) return;
 
-       if ((s->ctx->session_cache_mode & mode)
-               && (!s->hit)
-               && SSL_CTX_add_session(s->ctx,s->session)
+       i=s->ctx->session_cache_mode;
+       if ((i & mode) && (!s->hit)
+               && ((i & SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)
+                   || SSL_CTX_add_session(s->ctx,s->session))
                && (s->ctx->new_session_cb != NULL))
                {
                CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION);
@@ -1483,7 +1484,6 @@ void ssl_update_cache(SSL *s,int mode)
                }
 
        /* auto flush every 255 connections */
-       i=s->ctx->session_cache_mode;
        if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) &&
                ((i & mode) == mode))
                {
index 7064262def86cd38857b8a7e2d185435ddf9d5f3..8476f41707e18eed7138735994f024999938d750 100644 (file)
@@ -423,10 +423,10 @@ static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
        if ((c != NULL) && (c->session_id_length != 0))
                {
                if(lck) CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
-               r=(SSL_SESSION *)lh_delete(ctx->sessions,c);
-               if (r != NULL)
+               if ((r = (SSL_SESSION *)lh_retrieve(ctx->sessions,c)) == c)
                        {
                        ret=1;
+                       r=(SSL_SESSION *)lh_delete(ctx->sessions,c);
                        SSL_SESSION_list_remove(ctx,c);
                        }