Add function making space for current message reassembly

This commit adds a static function ssl_buffer_make_space() which
takes a buffer size as an argument and attempts to free as many
future message bufffers as necessary to ensure that the desired
amount of buffering space is available without violating the
total buffering limit set by MBEDTLS_SSL_DTLS_MAX_BUFFERING.
This commit is contained in:
Hanno Becker 2018-08-21 17:20:27 +01:00
parent e1801399a9
commit a02b0b462d

View file

@ -4438,6 +4438,35 @@ exit:
return( ret );
}
static int ssl_buffer_make_space( mbedtls_ssl_context *ssl,
size_t desired )
{
int offset;
mbedtls_ssl_handshake_params * const hs = ssl->handshake;
/* We don't have enough space to buffer the next expected
* handshake message. Remove buffers used for future msgs
* to gain space, starting with the most distant one. */
for( offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1;
offset >= 0; offset-- )
{
MBEDTLS_SSL_DEBUG_MSG( 2, ( "Free buffering slot %d to make space for reassembly of next handshake message",
offset ) );
ssl_buffering_free_slot( ssl, offset );
/* Check if we have enough space available now. */
if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
hs->buffering.total_bytes_buffered ) )
{
return( 0 );
}
}
return( -1 );
}
static int ssl_buffer_message( mbedtls_ssl_context *ssl )
{
int ret = 0;
@ -4522,8 +4551,6 @@ static int ssl_buffer_message( mbedtls_ssl_context *ssl )
if( reassembly_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
hs->buffering.total_bytes_buffered ) )
{
int offset;
if( recv_msg_seq_offset > 0 )
{
/* If we can't buffer a future message because
@ -4540,27 +4567,7 @@ static int ssl_buffer_message( mbedtls_ssl_context *ssl )
(unsigned) hs->buffering.total_bytes_buffered ) );
}
/* We don't have enough space to buffer the next expected
* handshake message. Remove buffers used for future msgs
* to gain space, starting with the most distant one. */
for( offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1;
offset >= 0; offset-- )
{
MBEDTLS_SSL_DEBUG_MSG( 2, ( "Free buffering slot %d to make space for reassembly of next handshake message",
offset ) );
ssl_buffering_free_slot( ssl, offset );
/* Check if we have enough space available now. */
if( reassembly_buf_sz <=
( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
hs->buffering.total_bytes_buffered ) )
{
break;
}
}
if( offset == -1 )
if( ssl_buffer_make_space( ssl, reassembly_buf_sz ) != 0 )
{
MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reassembly of next message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- fail\n",
(unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING,