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:25:45 +0000 (11:25 +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 800452827558b4e490e0294588f76d4af929990c..3ed2e9584dbe3b4fd8380c37fc65cc921f4dde9a 100644 (file)
@@ -634,8 +634,6 @@ again:
                /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
                i=rr->length;
                n=ssl3_read_n(s,i,i,1);
                /* 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)
                        {
                /* this packet contained a partial record, dump it */
                if ( n != i)
                        {
index 92a65c38bf9b1c41bfda2826e681758eab33577e..000f326e3c9456041fef93787a1168d9bd36adf5 100644 (file)
@@ -182,6 +182,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_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
                {
         * at once (as long as it fits into the buffer). */
        if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
                {
+               if (left == 0 && extend)
+                       return 0;
                if (left > 0 && n > left)
                        n = left;
                }
                if (left > 0 && n > left)
                        n = left;
                }