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)