Fix DTLS session resumption
authorMatt Caswell <matt@openssl.org>
Wed, 6 May 2015 10:40:06 +0000 (11:40 +0100)
committerMatt Caswell <matt@openssl.org>
Thu, 4 Jun 2015 08:02:39 +0000 (09:02 +0100)
The session object on the client side is initially created during
construction of the ClientHello. If the client is DTLS1.2 capable then it
will store 1.2 as the version for the session. However if the server is only
DTLS1.0 capable then when the ServerHello comes back the client switches to
using DTLS1.0 from then on. However the session version does not get
updated. Therefore when the client attempts to resume that session the
server throws an alert because of an incorrect protocol version.

Reviewed-by: Tim Hudson <tjh@openssl.org>
ssl/s3_clnt.c

index d6f53b0dea846bba4e7e93b37768faea1dfa879f..888fe4f5411815aeb36c2f2fac5139dff40bdeec 100644 (file)
@@ -1036,7 +1036,7 @@ int ssl3_get_server_hello(SSL *s)
             al = SSL_AD_PROTOCOL_VERSION;
             goto f_err;
         }
-        s->version = s->method->version;
+        s->session->ssl_version = s->version = s->method->version;
     } else if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) {
         SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION);
         s->version = (s->version & 0xff00) | p[1];