Add ticket length before buffering DTLS message
authorMatt Caswell <matt@openssl.org>
Thu, 5 Feb 2015 13:59:16 +0000 (13:59 +0000)
committerMatt Caswell <matt@openssl.org>
Wed, 25 Mar 2015 12:24:36 +0000 (12:24 +0000)
In ssl3_send_new_session_ticket the message to be sent is constructed. We
skip adding the length of the session ticket initially, then call
ssl_set_handshake_header, and finally go back and add in the length of the
ticket. Unfortunately, in DTLS, ssl_set_handshake_header also has the side
effect of buffering the message for subsequent retransmission if required.
By adding the ticket length after the call to ssl_set_handshake_header the
message that is buffered is incomplete, causing an invalid message to be
sent on retransmission.

Reviewed-by: Richard Levitte <levitte@openssl.org>
ssl/s3_srvr.c

index 0efe3ddc6d687395918ccb414536df59b6d12b8f..ce52854e0d1a20e31253c8b9c0fdc4da917eb9e3 100644 (file)
@@ -3431,11 +3431,11 @@ int ssl3_send_newsession_ticket(SSL *s)
         /* Now write out lengths: p points to end of data written */
         /* Total length */
         len = p - ssl_handshake_start(s);
-        if(!ssl_set_handshake_header(s, SSL3_MT_NEWSESSION_TICKET, len))
-            goto err;
         /* Skip ticket lifetime hint */
         p = ssl_handshake_start(s) + 4;
         s2n(len - 6, p);
+        if(!ssl_set_handshake_header(s, SSL3_MT_NEWSESSION_TICKET, len))
+            goto err;
         s->state = SSL3_ST_SW_SESSION_TICKET_B;
         OPENSSL_free(senc);
     }