Clear warnings/errors within BN_CTX_DEBUG code sections
[openssl.git] / ssl / d1_lib.c
index 5b3de08d51c94f73863b30b11d6fd0489ac8182b..f36d570247122efdd3e5754172b05d7ab60cd830 100644 (file)
@@ -123,7 +123,11 @@ int dtls1_new(SSL *s)
        DTLS1_STATE *d1;
 
        if (!ssl3_new(s)) return(0);
-       if ((d1=OPENSSL_malloc(sizeof *d1)) == NULL) return (0);
+       if ((d1=OPENSSL_malloc(sizeof *d1)) == NULL)
+               {
+               ssl3_free(s);
+               return (0);
+               }
        memset(d1,0, sizeof *d1);
 
        /* d1->handshake_epoch=0; */
@@ -145,12 +149,13 @@ int dtls1_new(SSL *s)
        if( ! d1->unprocessed_rcds.q || ! d1->processed_rcds.q 
         || ! d1->buffered_messages || ! d1->sent_messages || ! d1->buffered_app_data.q)
                {
-        if ( d1->unprocessed_rcds.q) pqueue_free(d1->unprocessed_rcds.q);
-        if ( d1->processed_rcds.q) pqueue_free(d1->processed_rcds.q);
-        if ( d1->buffered_messages) pqueue_free(d1->buffered_messages);
+               if ( d1->unprocessed_rcds.q) pqueue_free(d1->unprocessed_rcds.q);
+               if ( d1->processed_rcds.q) pqueue_free(d1->processed_rcds.q);
+               if ( d1->buffered_messages) pqueue_free(d1->buffered_messages);
                if ( d1->sent_messages) pqueue_free(d1->sent_messages);
                if ( d1->buffered_app_data.q) pqueue_free(d1->buffered_app_data.q);
                OPENSSL_free(d1);
+               ssl3_free(s);
                return (0);
                }
 
@@ -317,10 +322,6 @@ long dtls1_ctrl(SSL *s, int cmd, long larg, void *parg)
                                return s->version == DTLS1_VERSION;
                        }
                return 0; /* Unexpected state; fail closed. */
-
-               /* Just one protocol version is supported so far;
-                * fail closed if the version is not as expected. */
-               return s->version == DTLS_MAX_VERSION;
        case DTLS_CTRL_SET_LINK_MTU:
                if (larg < (long)dtls1_link_min_mtu())
                        return 0;
@@ -475,13 +476,17 @@ void dtls1_stop_timer(SSL *s)
 
 int dtls1_check_timeout_num(SSL *s)
        {
+       unsigned int mtu;
+
        s->d1->timeout.num_alerts++;
 
        /* Reduce MTU after 2 unsuccessful retransmissions */
        if (s->d1->timeout.num_alerts > 2
                        && !(SSL_get_options(s) & SSL_OP_NO_QUERY_MTU))
                {
-               s->d1->mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);               
+               mtu = BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_GET_FALLBACK_MTU, 0, NULL);
+               if(mtu < s->d1->mtu)
+                       s->d1->mtu = mtu;
                }
 
        if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT)