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 */