Debug module only outputs full lines instead of parts
diff --git a/ChangeLog b/ChangeLog
index ac01f32..53cc592 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,9 +3,11 @@
 = 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 8e24a84..40a4399 100644
--- a/library/debug.c
+++ b/library/debug.c
@@ -127,6 +127,7 @@
     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 @@
         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 @@
     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 @@
             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 @@
     {
         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 0fe0725..3a5adaf 100644
--- a/tests/suites/test_suite_debug.function
+++ b/tests/suites/test_suite_debug.function
@@ -14,6 +14,13 @@
 
     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 */