Fix thread-safety issue in debug.c

This commit is contained in:
Manuel Pégourié-Gonnard 2015-06-27 11:48:01 +02:00
parent 5324d411da
commit 26d88cf154
3 changed files with 24 additions and 5 deletions

View file

@ -6,6 +6,9 @@ Security
* Increase the minimum size of Diffie-Hellman parameters accepted by the * Increase the minimum size of Diffie-Hellman parameters accepted by the
lient to 1024 bits, to protect against Logjam attack. lient to 1024 bits, to protect against Logjam attack.
Bugfix
* Fix thread-safety issue in the SSL debug module.
Changes Changes
* Add SSL_MIN_DHM_BYTES configuration parameter in config.h to choose the * Add SSL_MIN_DHM_BYTES configuration parameter in config.h to choose the
minimum size of Diffie-Hellman parameters accepted by the client. minimum size of Diffie-Hellman parameters accepted by the client.

View file

@ -30,7 +30,7 @@
#if defined(POLARSSL_DEBUG_C) #if defined(POLARSSL_DEBUG_C)
#define SSL_DEBUG_MSG( level, args ) \ #define SSL_DEBUG_MSG( level, args ) \
debug_print_msg( ssl, level, __FILE__, __LINE__, debug_fmt args ); debug_print_msg_free( ssl, level, __FILE__, __LINE__, debug_fmt args );
#define SSL_DEBUG_RET( level, text, ret ) \ #define SSL_DEBUG_RET( level, text, ret ) \
debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ); debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret );
@ -60,6 +60,9 @@ extern "C" {
char *debug_fmt( const char *format, ... ); char *debug_fmt( const char *format, ... );
void debug_print_msg_free( const ssl_context *ssl, int level,
const char *file, int line, char *text );
void debug_print_msg( const ssl_context *ssl, int level, void debug_print_msg( const ssl_context *ssl, int level,
const char *file, int line, const char *text ); const char *file, int line, const char *text );

View file

@ -37,20 +37,33 @@
#define vsnprintf _vsnprintf #define vsnprintf _vsnprintf
#endif #endif
#define DEBUG_BUF_SIZE 512
char *debug_fmt( const char *format, ... ) char *debug_fmt( const char *format, ... )
{ {
va_list argp; va_list argp;
static char str[512]; char *str = malloc( DEBUG_BUF_SIZE );
int maxlen = sizeof( str ) - 1;
if( str == NULL )
return( NULL );
va_start( argp, format ); va_start( argp, format );
vsnprintf( str, maxlen, format, argp ); vsnprintf( str, DEBUG_BUF_SIZE - 1, format, argp );
va_end( argp ); va_end( argp );
str[maxlen] = '\0'; str[DEBUG_BUF_SIZE - 1] = '\0';
return( str ); return( str );
} }
void debug_print_msg_free( const ssl_context *ssl, int level,
const char *file, int line, char *text )
{
if( text != NULL )
debug_print_msg( ssl, level, file, line, text );
free( text );
}
void debug_print_msg( const ssl_context *ssl, int level, void debug_print_msg( const ssl_context *ssl, int level,
const char *file, int line, const char *text ) const char *file, int line, const char *text )
{ {