Avoid memory hole when we don't like the session proposed by the client
[openssl.git] / ssl / ssl_sess.c
index 259725c7a10f10ec1fb74f63e21f56f46f941f64..3872b419283db7e0057d3cbe11440a1a70ad65d7 100644 (file)
@@ -188,7 +188,6 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
        /* This is used only by servers. */
 
        SSL_SESSION *ret=NULL,data;
-       int copy=1;
 
        /* conn_init();*/
        data.ssl_version=s->version;
@@ -206,6 +205,8 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
 
        if (ret == NULL)
                {
+               int copy=1;
+       
                s->ctx->stats.sess_miss++;
                ret=NULL;
                if (s->ctx->get_session_cb != NULL
@@ -217,6 +218,9 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
                        /* The following should not return 1, otherwise,
                         * things are very strange */
                        SSL_CTX_add_session(s->ctx,ret);
+                       /* auto free it (decrement reference count now) */
+                       if (!copy)
+                               SSL_SESSION_free(ret);
                        }
                if (ret == NULL) return(0);
                }
@@ -225,14 +229,14 @@ int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
           && (!s->sid_ctx_length || ret->sid_ctx_length != s->sid_ctx_length
               || memcmp(ret->sid_ctx,s->sid_ctx,ret->sid_ctx_length)))
            {
-           SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
+               if (s->sid_ctx_length)
+                       SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
+               else
+                       /* application should have used SSL[_CTX]_set_session_id_context */
+                       SSLerr(SSL_F_SSL_GET_PREV_SESSION,SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED);
            return 0;
            }
 
-       /* auto free it */
-       if (!copy)
-           SSL_SESSION_free(ret);
-
        if (ret->cipher == NULL)
                {
                unsigned char buf[5],*p;