If we really get a situation where the underlying mtu is less than the minimum
authorMatt Caswell <matt@openssl.org>
Tue, 2 Dec 2014 00:16:55 +0000 (00:16 +0000)
committerMatt Caswell <matt@openssl.org>
Wed, 3 Dec 2014 09:24:28 +0000 (09:24 +0000)
we will support then dtls1_do_write can go into an infinite loop. This commit
fixes that.

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

index 808d4d1..c5957bd 100644 (file)
@@ -260,6 +260,7 @@ int dtls1_do_write(SSL *s, int type)
        {
        int ret;
        int curr_mtu;
+       int retry = 1;
        unsigned int len, frag_off, mac_size, blocksize;
 
        if(!dtls1_query_mtu(s))
@@ -370,13 +371,15 @@ int dtls1_do_write(SSL *s, int type)
                         * is fine and wait for an alert to handle the
                         * retransmit 
                         */
-                       if ( BIO_ctrl(SSL_get_wbio(s),
+                       if ( retry && BIO_ctrl(SSL_get_wbio(s),
                                BIO_CTRL_DGRAM_MTU_EXCEEDED, 0, NULL) > 0 )
                                {
                                if(!(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU))
                                        {
                                        if(!dtls1_query_mtu(s))
                                                return -1;
+                                       /* Have one more go */
+                                       retry = 0;
                                        }
                                else
                                        return -1;