From 92478c37a63f0bf4b80fb0c4786c1b260607c436 Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Fri, 25 Apr 2014 15:18:34 +0200 Subject: [PATCH] Debug module only outputs full lines instead of parts --- ChangeLog | 2 + library/debug.c | 52 +++++++++++++------------- tests/suites/test_suite_debug.function | 7 ++++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac01f3287..53cc59265 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,9 +3,11 @@ PolarSSL ChangeLog (Sorted per branch, date) = PolarSSL 1.3 branch Features * debug_set_log_mode() function added to determine raw or full logging + Changes * POLARSSL_CONFIG_OPTIONS has been removed. All values are individually checked and filled in the relevant module headers + * Debug module only outputs full lines instead of parts Bugfix * Only iterate over actual certificates in ssl_write_certificate_request() diff --git a/library/debug.c b/library/debug.c index 8e24a84e1..40a4399f9 100644 --- a/library/debug.c +++ b/library/debug.c @@ -127,6 +127,7 @@ void debug_print_buf( const ssl_context *ssl, int level, str[maxlen] = '\0'; ssl->f_dbg( ssl->p_dbg, level, str ); + idx = 0; for( i = 0; i < len; i++ ) { if( i >= 4096 ) @@ -135,25 +136,29 @@ void debug_print_buf( const ssl_context *ssl, int level, if( i % 16 == 0 ) { if( i > 0 ) - ssl->f_dbg( ssl->p_dbg, level, "\n" ); + { + snprintf( str + idx, maxlen - idx, "\n" ); + ssl->f_dbg( ssl->p_dbg, level, str ); + idx = 0; + } if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL ) idx = snprintf( str, maxlen, "%s(%04d): ", file, line ); - snprintf( str + idx, maxlen - idx, "%04x: ", (unsigned int) i ); + idx += snprintf( str + idx, maxlen - idx, "%04x: ", + (unsigned int) i ); - str[maxlen] = '\0'; - ssl->f_dbg( ssl->p_dbg, level, str ); } - snprintf( str, maxlen, " %02x", (unsigned int) buf[i] ); - - str[maxlen] = '\0'; - ssl->f_dbg( ssl->p_dbg, level, str ); + idx += snprintf( str + idx, maxlen - idx, " %02x", + (unsigned int) buf[i] ); } if( len > 0 ) - ssl->f_dbg( ssl->p_dbg, level, "\n" ); + { + snprintf( str + idx, maxlen - idx, "\n" ); + ssl->f_dbg( ssl->p_dbg, level, str ); + } } #if defined(POLARSSL_ECP_C) @@ -203,6 +208,7 @@ void debug_print_mpi( const ssl_context *ssl, int level, str[maxlen] = '\0'; ssl->f_dbg( ssl->p_dbg, level, str ); + idx = 0; for( i = n + 1, j = 0; i > 0; i-- ) { if( zeros && X->p[i - 1] == 0 ) @@ -218,21 +224,18 @@ void debug_print_mpi( const ssl_context *ssl, int level, if( j % 16 == 0 ) { if( j > 0 ) - ssl->f_dbg( ssl->p_dbg, level, "\n" ); + { + snprintf( str + idx, maxlen - idx, "\n" ); + ssl->f_dbg( ssl->p_dbg, level, str ); + idx = 0; + } if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL ) - { - snprintf( str, maxlen, "%s(%04d): ", file, line ); - str[maxlen] = '\0'; - ssl->f_dbg( ssl->p_dbg, level, str ); - } + idx = snprintf( str, maxlen, "%s(%04d): ", file, line ); } - snprintf( str, maxlen, " %02x", (unsigned int) - ( X->p[i - 1] >> (k << 3) ) & 0xFF ); - - str[maxlen] = '\0'; - ssl->f_dbg( ssl->p_dbg, level, str ); + idx += snprintf( str + idx, maxlen - idx, " %02x", (unsigned int) + ( X->p[i - 1] >> (k << 3) ) & 0xFF ); j++; } @@ -243,15 +246,14 @@ void debug_print_mpi( const ssl_context *ssl, int level, { if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL ) { - snprintf( str, maxlen, "%s(%04d): ", file, line ); + idx = snprintf( str, maxlen, "%s(%04d): ", file, line ); - str[maxlen] = '\0'; - ssl->f_dbg( ssl->p_dbg, level, str ); } - ssl->f_dbg( ssl->p_dbg, level, " 00" ); + idx += snprintf( str + idx, maxlen - idx, " 00" ); } - ssl->f_dbg( ssl->p_dbg, level, "\n" ); + snprintf( str + idx, maxlen - idx, "\n" ); + ssl->f_dbg( ssl->p_dbg, level, str ); } #endif /* POLARSSL_BIGNUM_C */ diff --git a/tests/suites/test_suite_debug.function b/tests/suites/test_suite_debug.function index 0fe0725a3..3a5adaf9a 100644 --- a/tests/suites/test_suite_debug.function +++ b/tests/suites/test_suite_debug.function @@ -14,6 +14,13 @@ void string_debug(void *data, int level, const char *str) memcpy(buffer->ptr, str, strlen(str)); buffer->ptr += strlen(str); + + /* Detect if debug messages output partial lines and mark them */ + if( *(buffer->ptr - 1) != '\n' ) + { + *buffer->ptr = '*'; + buffer->ptr++; + } } /* END_HEADER */