Fix crash in dtls1_get_record whilst in the listen state where you get two
authorDr. Stephen Henson <steve@openssl.org>
Sat, 3 Jan 2015 00:45:13 +0000 (00:45 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 8 Jan 2015 11:20:29 +0000 (11:20 +0000)
separate reads performed - one for the header and one for the body of the
handshake record.

CVE-2014-3571

Reviewed-by: Matt Caswell <matt@openssl.org>
ssl/d1_pkt.c
ssl/s3_pkt.c

index dc5b6f40c493c4ddd78f1b044a55669c42e8b63d..b76703a5e0542172f0620d732a2729e7f2600689 100644 (file)
@@ -645,8 +645,6 @@ again:
                /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
                i=rr->length;
                n=ssl3_read_n(s,i,i,1);
-               if (n <= 0) return(n); /* error or non-blocking io */
-
                /* this packet contained a partial record, dump it */
                if ( n != i)
                        {
index 0804d556a199a519af8255bdfaa549204c80a704..6a2ec5c5796225aa928ce2b14c8844b8f23be91d 100644 (file)
@@ -197,6 +197,8 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
         * at once (as long as it fits into the buffer). */
        if (SSL_IS_DTLS(s))
                {
+               if (left == 0 && extend)
+                       return 0;
                if (left > 0 && n > left)
                        n = left;
                }