PR: 2602
authorDr. Stephen Henson <steve@openssl.org>
Fri, 23 Sep 2011 13:35:32 +0000 (13:35 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 23 Sep 2011 13:35:32 +0000 (13:35 +0000)
Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de>
Reviewed by: steve

Fix DTLS bug which prevents manual MTU setting

ssl/d1_both.c
ssl/d1_lib.c
ssl/ssl_lib.c
ssl/ssl_locl.h

index df684e57fa2cd7d18b6c87ef8fd1ae0dbef34282..1c4158d36d0700f404aa090c7df5dd28f7eb5352 100644 (file)
@@ -158,7 +158,6 @@ static unsigned char bitmask_end_values[]   = {0xff, 0x01, 0x03, 0x07, 0x0f, 0x1
 /* XDTLS:  figure out the right values */
 static unsigned int g_probable_mtu[] = {1500 - 28, 512 - 28, 256 - 28};
 
-static unsigned int dtls1_min_mtu(void);
 static unsigned int dtls1_guess_mtu(unsigned int curr_mtu);
 static void dtls1_fix_message_header(SSL *s, unsigned long frag_off, 
        unsigned long frag_len);
@@ -264,11 +263,10 @@ int dtls1_do_write(SSL *s, int type)
                        return ret;
                mtu = s->d1->mtu - (DTLS1_HM_HEADER_LENGTH + DTLS1_RT_HEADER_LENGTH);
                }
-
-       OPENSSL_assert(mtu > 0);  /* should have something reasonable now */
-
 #endif
 
+       OPENSSL_assert(s->d1->mtu >= dtls1_min_mtu());  /* should have something reasonable now */
+
        if ( s->init_off == 0  && type == SSL3_RT_HANDSHAKE)
                OPENSSL_assert(s->init_num == 
                        (int)s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH);
@@ -1371,7 +1369,7 @@ dtls1_write_message_header(SSL *s, unsigned char *p)
        return p;
        }
 
-static unsigned int 
+unsigned int 
 dtls1_min_mtu(void)
        {
        return (g_probable_mtu[(sizeof(g_probable_mtu) / 
index 736216f6aace19f82e3a4de5f705d0bd70644cca..2e57b63101267ac1b8bc8feb21b27d7da050fa39 100644 (file)
@@ -226,7 +226,8 @@ void dtls1_clear(SSL *s)
     pqueue buffered_messages;
        pqueue sent_messages;
        pqueue buffered_app_data;
-       
+       unsigned int mtu;
+
        if (s->d1)
                {
                unprocessed_rcds = s->d1->unprocessed_rcds.q;
@@ -234,6 +235,7 @@ void dtls1_clear(SSL *s)
                buffered_messages = s->d1->buffered_messages;
                sent_messages = s->d1->sent_messages;
                buffered_app_data = s->d1->buffered_app_data.q;
+               mtu = s->d1->mtu;
 
                dtls1_clear_queues(s);
 
@@ -250,6 +252,11 @@ void dtls1_clear(SSL *s)
                        s->d1->cookie_len = sizeof(s->d1->cookie);
                        }
 
+               if (SSL_get_options(s) & SSL_OP_NO_QUERY_MTU)
+                       {
+                       s->d1->mtu = mtu;
+                       }
+
                s->d1->unprocessed_rcds.q = unprocessed_rcds;
                s->d1->processed_rcds.q = processed_rcds;
                s->d1->buffered_messages = buffered_messages;
index b6b8e6038aa6f49ab19ba3c8140f5aef8c7bccd9..d88b52f289561771377bc03fd73fe7a7cfee2a11 100644 (file)
@@ -1000,6 +1000,9 @@ long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)
                s->max_cert_list=larg;
                return(l);
        case SSL_CTRL_SET_MTU:
+               if (larg < dtls1_min_mtu())
+                       return 0;
+
                if (SSL_version(s) == DTLS1_VERSION ||
                    SSL_version(s) == DTLS1_BAD_VER)
                        {
index e305db43ff8d21e959e32755b350bf477b14aaaa..4741e30b2b20c85ba7ec526cbbd7c34f5a3bedc3 100644 (file)
@@ -877,6 +877,7 @@ void dtls1_stop_timer(SSL *s);
 int dtls1_is_timer_expired(SSL *s);
 void dtls1_double_timeout(SSL *s);
 int dtls1_send_newsession_ticket(SSL *s);
+unsigned int dtls1_min_mtu(void);
 
 
 /* some client-only functions */