Don't memcpy the contents of an empty fragment
authorMatt Caswell <matt@openssl.org>
Fri, 11 May 2018 09:28:47 +0000 (10:28 +0100)
committerMatt Caswell <matt@openssl.org>
Sat, 12 May 2018 09:05:39 +0000 (10:05 +0100)
In DTLS if we have buffered a fragment for a zero length message (e.g.
ServerHelloDone) then, when we unbuffered the fragment, we were attempting
to memcpy the contents of the fragment which is zero length and a NULL
pointer. This is undefined behaviour. We should check first whether we
have a zero length fragment.

Fixes a travis issue.

[extended tests]

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6224)

ssl/statem/statem_dtls.c

index 6b80620ee9c532f252853d73ef9f84065de80c54..5b34425445363a165a1a7894981fa8618e53ebbd 100644 (file)
@@ -493,7 +493,8 @@ static int dtls1_retrieve_buffered_fragment(SSL *s, int *ok)
 
         al = dtls1_preprocess_fragment(s, &frag->msg_header);
 
-        if (al == 0) {          /* no alert */
+        /* al will be 0 if no alert */
+        if (al == 0  && frag->msg_header.frag_len > 0) {
             unsigned char *p =
                 (unsigned char *)s->init_buf->data + DTLS1_HM_HEADER_LENGTH;
             memcpy(&p[frag->msg_header.frag_off], frag->fragment,