Make the memset call prior to FD_ZERO conditional to needing it

Zeroing out an fd_set before calling FD_ZERO on it is in principle
useless, but without it some memory sanitizers think the fd_set is
still uninitialized after FD_ZERO (e.g. clang-msan/Glibc/x86_64 where
FD_ZERO is implemented in assembly). Make the zeroing conditional on
using a memory sanitizer.
This commit is contained in:
Gilles Peskine 2018-04-05 14:55:47 +02:00
parent 80aa3b8d65
commit ec4733b645

View File

@ -459,11 +459,15 @@ 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 #if defined(__has_feature)
* read_fds and write_fds as initialized even #if __has_feature(memory_sanitizer)
* if FD_ZERO is implemented in assembly. */ /* Ensure that memory sanitizers consider read_fds and write_fds as
* initialized even on platforms such as Glibc/x86_64 where FD_ZERO
* is implemented in assembly. */
memset( &read_fds, 0, sizeof( read_fds ) ); memset( &read_fds, 0, sizeof( read_fds ) );
memset( &write_fds, 0, sizeof( write_fds ) ); memset( &write_fds, 0, sizeof( write_fds ) );
#endif
#endif
FD_ZERO( &read_fds ); FD_ZERO( &read_fds );
if( rw & MBEDTLS_NET_POLL_READ ) if( rw & MBEDTLS_NET_POLL_READ )