Additionally initialize fd_set's via memset in mbedtls_net_poll

The initialization via FD_SET is not seen by memory sanitizers if
FD_SET is implemented through assembly. Additionally zeroizing the
respective fd_set's before calling FD_SET contents the sanitizers
and comes at a negligible computational overhead.
This commit is contained in:
Hanno Becker 2018-04-03 16:28:09 +01:00
parent 2bd57578af
commit f4e5b7e87d

View File

@ -275,7 +275,7 @@ static int net_would_block( const mbedtls_net_context *ctx )
static int net_would_block( const mbedtls_net_context *ctx ) static int net_would_block( const mbedtls_net_context *ctx )
{ {
int err = errno; int err = errno;
/* /*
* Never return 'WOULD BLOCK' on a non-blocking socket * Never return 'WOULD BLOCK' on a non-blocking socket
*/ */
@ -459,6 +459,12 @@ int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout )
if( fd < 0 ) if( fd < 0 )
return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); return( MBEDTLS_ERR_NET_INVALID_CONTEXT );
/* Ensure that memory sanitizers consider
* read_fds and write_fds as initialized even
* if FD_ZERO is implemented in assembly. */
memset( &read_fds, 0, sizeof( read_fds ) );
memset( &write_fds, 0, sizeof( write_fds ) );
FD_ZERO( &read_fds ); FD_ZERO( &read_fds );
if( rw & MBEDTLS_NET_POLL_READ ) if( rw & MBEDTLS_NET_POLL_READ )
{ {