I have an application which needs to protect datagram traffic, and
also directly control the socket I/O.  Using DTLS over a BIO pair
appears to work for my purposes except for one problem when handling timeouts.

In dtls1_check_timeout_num(), after 2 unsuccessful retransmission
attempts, the code calls BIO_ctrl() with the BIO_CTRL_DGRAM_GET_FALLBACK_MTU
option to adjust the MTU.  This operation is not defined for a BIO
pair, and results in the MTU being set to zero.  That eventually
causes an OpenSSL_assert() to fail in dtls1_do_write().

It would make sense to recognize that zero can't be a valid fallback MTU
value, and avoid resetting the MTU.   A patch with a possible fix is attached.

--- Gary


diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c
index db180f2..371199d 100644
--- a/ssl/d1_lib.c
+++ b/ssl/d1_lib.c
@@ -401,12 +401,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)
 		{
-		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 > 0)
+			{
+			s->d1->mtu = mtu;
+			}
 		}
 
 	if (s->d1->timeout.num_alerts > DTLS1_TMO_ALERT_COUNT)

Reply via email to