This is a patch to openssl-0.9.5a that makes sure that the
session_cache_mode is used to determine whether a session is resumed or
renegotiated. Previously clients always attempted a session resume if the
session id was non NULL.

So now SSL_CTX_new sets the cache mode to client or server depending on
whether the method is client or server. Also client_hello from s2_clnt.c
and s3_clnt hello only attempt a session resume if the
SSL_SESS_CACHE_CLIENT is set.

nagendra
diff -urN openssl-0.9.5a/ssl/s2_clnt.c openssl-0.9.5a-work/ssl/s2_clnt.c
--- openssl-0.9.5a/ssl/s2_clnt.c        Thu Feb  3 15:23:22 2000
+++ openssl-0.9.5a-work/ssl/s2_clnt.c   Tue Jun 20 18:07:57 2000
@@ -473,7 +473,8 @@
        if (s->state == SSL2_ST_SEND_CLIENT_HELLO_A)
                {
                if ((s->session == NULL) ||
-                       (s->session->ssl_version != s->version))
+                       (s->session->ssl_version != s->version) ||
+                       !(s->ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT))
                        {
                        if (!ssl_get_new_session(s,0))
                                {
diff -urN openssl-0.9.5a/ssl/s3_clnt.c openssl-0.9.5a-work/ssl/s3_clnt.c
--- openssl-0.9.5a/ssl/s3_clnt.c        Mon Mar 27 13:28:27 2000
+++ openssl-0.9.5a-work/ssl/s3_clnt.c   Tue Jun 20 16:49:52 2000
@@ -456,7 +456,8 @@
                {
                if ((s->session == NULL) ||
                        (s->session->ssl_version != s->version) ||
-                       (s->session->not_resumable))
+                       (s->session->not_resumable) || 
+                       !(s->ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT))
                        {
                        if (!ssl_get_new_session(s,0))
                                goto err;
diff -urN openssl-0.9.5a/ssl/ssl_lib.c openssl-0.9.5a-work/ssl/ssl_lib.c
--- openssl-0.9.5a/ssl/ssl_lib.c        Mon Mar 27 13:28:28 2000
+++ openssl-0.9.5a-work/ssl/ssl_lib.c   Tue Jun 20 16:53:22 2000
@@ -1108,7 +1108,12 @@
        ret->method=meth;
 
        ret->cert_store=NULL;
-       ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
+
+       if(meth->ssl_accept == ssl_undefined_function)
+               ret->session_cache_mode=SSL_SESS_CACHE_CLIENT;
+       else
+               ret->session_cache_mode=SSL_SESS_CACHE_SERVER;
+
        ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
        ret->session_cache_head=NULL;
        ret->session_cache_tail=NULL;

Reply via email to