Merge 'development' into development
diff --git a/include/mbedtls/memory_buffer_alloc.h b/include/mbedtls/memory_buffer_alloc.h
index 661bc08..d5df316 100644
--- a/include/mbedtls/memory_buffer_alloc.h
+++ b/include/mbedtls/memory_buffer_alloc.h
@@ -98,8 +98,10 @@
/**
* \brief Get the peak heap usage so far
*
- * \param max_used Peak number of bytes reauested by the application
- * \param max_blocks Peak number of blocks reauested by the application
+ * \param max_used Peak number of bytes in use or committed. This
+ * includes bytes in allocated blocks too small to split
+ * into smaller blocks but larger than the requested size.
+ * \param max_blocks Peak number of blocks in use, including free and used
*/
void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks );
@@ -111,8 +113,10 @@
/**
* \brief Get the current heap usage
*
- * \param cur_used Number of bytes reauested by the application
- * \param cur_blocks Number of blocks reauested by the application
+ * \param cur_used Current number of bytes in use or committed. This
+ * includes bytes in allocated blocks too small to split
+ * into smaller blocks but larger than the requested size.
+ * \param cur_blocks Current number of blocks in use, including free and used
*/
void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks );
#endif /* MBEDTLS_MEMORY_DEBUG */
diff --git a/include/mbedtls/pk.h b/include/mbedtls/pk.h
index 458bb51..f9f9b9b 100644
--- a/include/mbedtls/pk.h
+++ b/include/mbedtls/pk.h
@@ -496,11 +496,12 @@
* \brief Load and parse a public key
*
* \param ctx key to be initialized
- * \param path filename to read the private key from
+ * \param path filename to read the public key from
*
* \note On entry, ctx must be empty, either freshly initialised
- * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a
- * specific key type, check the result with mbedtls_pk_can_do().
+ * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If
+ * you need a specific key type, check the result with
+ * mbedtls_pk_can_do().
*
* \note The key is also checked for correctness.
*
diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h
index 67c62b7..96643eb 100644
--- a/include/mbedtls/ssl.h
+++ b/include/mbedtls/ssl.h
@@ -976,7 +976,7 @@
* pointers and data.
*
* \param ssl SSL context
- * \return 0 if successful, or POLASSL_ERR_SSL_MALLOC_FAILED,
+ * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED,
MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or
* MBEDTLS_ERR_SSL_COMPRESSION_FAILED
*/
diff --git a/library/ctr_drbg.c b/library/ctr_drbg.c
index aefddfa..6962d68 100644
--- a/library/ctr_drbg.c
+++ b/library/ctr_drbg.c
@@ -67,7 +67,7 @@
}
/*
- * Non-public function wrapped by ctr_crbg_init(). Necessary to allow NIST
+ * Non-public function wrapped by mbedtls_ctr_drbg_init(). Necessary to allow NIST
* tests to succeed (which require known length fixed entropy)
*/
int mbedtls_ctr_drbg_seed_entropy_len(
diff --git a/library/memory_buffer_alloc.c b/library/memory_buffer_alloc.c
index b2c775a..545d5a2 100644
--- a/library/memory_buffer_alloc.c
+++ b/library/memory_buffer_alloc.c
@@ -417,6 +417,12 @@
heap.total_used -= hdr->size;
#endif
+#if defined(MBEDTLS_MEMORY_BACKTRACE)
+ free( hdr->trace );
+ hdr->trace = NULL;
+ hdr->trace_count = 0;
+#endif
+
// Regroup with block before
//
if( hdr->prev != NULL && hdr->prev->alloc == 0 )
@@ -432,9 +438,6 @@
if( hdr->next != NULL )
hdr->next->prev = hdr;
-#if defined(MBEDTLS_MEMORY_BACKTRACE)
- free( old->trace );
-#endif
memset( old, 0, sizeof(memory_header) );
}
@@ -474,9 +477,6 @@
if( hdr->next != NULL )
hdr->next->prev = hdr;
-#if defined(MBEDTLS_MEMORY_BACKTRACE)
- free( old->trace );
-#endif
memset( old, 0, sizeof(memory_header) );
}
@@ -491,11 +491,6 @@
heap.first_free = hdr;
}
-#if defined(MBEDTLS_MEMORY_BACKTRACE)
- hdr->trace = NULL;
- hdr->trace_count = 0;
-#endif
-
if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 )
mbedtls_exit( 1 );
}
diff --git a/tests/scripts/generate_code.pl b/tests/scripts/generate_code.pl
index 93c003b..49af2db 100755
--- a/tests/scripts/generate_code.pl
+++ b/tests/scripts/generate_code.pl
@@ -77,7 +77,7 @@
open(TEST_MAIN, "$test_main_file") or die "Opening test main '$test_main_file': $!";
my @test_main_lines = split/^/, <TEST_MAIN>;
my $test_main;
-my $index = 1;
+my $index = 2;
for my $line (@test_main_lines) {
$line =~ s/!LINE_NO!/$index/;
$test_main = $test_main.$line;
@@ -88,13 +88,20 @@
open(TEST_CASES, "$test_case_file") or die "Opening test cases '$test_case_file': $!";
my @test_cases_lines = split/^/, <TEST_CASES>;
my $test_cases;
-my $index = 1;
+my $index = 2;
for my $line (@test_cases_lines) {
+ if ($line =~ /^\/\* BEGIN_SUITE_HELPERS .*\*\//)
+ {
+ $line = $line."#line $index \"$test_case_file\"\n";
+ }
+
if ($line =~ /^\/\* BEGIN_CASE .*\*\//)
{
$line = $line."#line $index \"$test_case_file\"\n";
}
+ $line =~ s/!LINE_NO!/$index/;
+
$test_cases = $test_cases.$line;
$index++;
}
diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function
index cc9ab7c..f0d0520 100644
--- a/tests/suites/helpers.function
+++ b/tests/suites/helpers.function
@@ -57,7 +57,7 @@
do { \
if( ! (TEST) ) \
{ \
- test_fail( #TEST ); \
+ test_fail( #TEST, __LINE__, __FILE__ ); \
goto exit; \
} \
} while( 0 )
@@ -348,11 +348,11 @@
return( 0 );
}
-static void test_fail( const char *test )
+static void test_fail( const char *test, int line_no, const char* filename )
{
test_errors++;
if( test_errors == 1 )
mbedtls_printf( "FAILED\n" );
- mbedtls_printf( " %s\n", test );
+ mbedtls_printf( " %s\n at line %d, %s\n", test, line_no, filename );
}
diff --git a/tests/suites/test_suite_memory_buffer_alloc.data b/tests/suites/test_suite_memory_buffer_alloc.data
index a0b0460..8d3813a 100644
--- a/tests/suites/test_suite_memory_buffer_alloc.data
+++ b/tests/suites/test_suite_memory_buffer_alloc.data
@@ -1,2 +1,18 @@
Memory buffer alloc self test
mbedtls_memory_buffer_alloc_self_test:
+
+Memory buffer alloc - free in middle, alloc at end
+memory_buffer_alloc_free_alloc:100:100:100:0:0:1:0:0:200:0
+
+Memory buffer alloc - free in middle, realloc
+memory_buffer_alloc_free_alloc:100:100:100:0:0:1:0:0:100:0
+
+Memory buffer alloc - free in middle, merge, realloc
+memory_buffer_alloc_free_alloc:100:100:100:100:0:1:1:0:201:0
+
+Memory buffer alloc - free at end, merge, realloc
+memory_buffer_alloc_free_alloc:100:64:100:100:0:0:0:1:200:0
+
+Memory buffer alloc - Out of Memory test
+memory_buffer_alloc_oom_test:
+
diff --git a/tests/suites/test_suite_memory_buffer_alloc.function b/tests/suites/test_suite_memory_buffer_alloc.function
index 59b0643..04dd68b 100644
--- a/tests/suites/test_suite_memory_buffer_alloc.function
+++ b/tests/suites/test_suite_memory_buffer_alloc.function
@@ -1,6 +1,7 @@
/* BEGIN_HEADER */
#include "mbedtls/memory_buffer_alloc.h"
#define TEST_SUITE_MEMORY_BUFFER_ALLOC
+
/* END_HEADER */
/* BEGIN_DEPENDENCIES
@@ -8,9 +9,226 @@
* END_DEPENDENCIES
*/
+/* BEGIN_SUITE_HELPERS */
+static int check_pointer( void *p )
+{
+ if( p == NULL )
+ return( -1 );
+
+ if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 )
+ return( -1 );
+
+ return( 0 );
+}
+/* END_SUITE_HELPERS */
+
/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
void mbedtls_memory_buffer_alloc_self_test( )
{
TEST_ASSERT( mbedtls_memory_buffer_alloc_self_test( 0 ) == 0 );
}
/* END_CASE */
+
+/* BEGIN_CASE depends_on:MBEDTLS_MEMORY_DEBUG */
+void memory_buffer_alloc_free_alloc( int a_bytes, int b_bytes, int c_bytes,
+ int d_bytes,
+ int free_a, int free_b, int free_c,
+ int free_d,
+ int e_bytes, int f_bytes )
+{
+ unsigned char buf[1024];
+ unsigned char *ptr_a = NULL, *ptr_b = NULL, *ptr_c = NULL, *ptr_d = NULL,
+ *ptr_e = NULL, *ptr_f = NULL;
+
+ size_t reported_blocks;
+ size_t allocated_bytes = 0, reported_bytes;
+
+ mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
+
+ mbedtls_memory_buffer_set_verify( MBEDTLS_MEMORY_VERIFY_ALWAYS );
+
+ if( a_bytes > 0 )
+ {
+ ptr_a = mbedtls_calloc( a_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_a ) == 0 );
+
+ allocated_bytes += a_bytes * sizeof(char);
+ }
+
+ if( b_bytes > 0 )
+ {
+ ptr_b = mbedtls_calloc( b_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_b ) == 0 );
+
+ allocated_bytes += b_bytes * sizeof(char);
+ }
+
+ if( c_bytes > 0 )
+ {
+ ptr_c = mbedtls_calloc( c_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_c ) == 0 );
+
+ allocated_bytes += c_bytes * sizeof(char);
+ }
+
+ if( d_bytes > 0 )
+ {
+ ptr_d = mbedtls_calloc( d_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_d ) == 0 );
+
+ allocated_bytes += d_bytes * sizeof(char);
+ }
+
+ mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
+ TEST_ASSERT( reported_bytes == allocated_bytes );
+
+ if( free_a )
+ {
+ mbedtls_free( ptr_a );
+ ptr_a = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ allocated_bytes -= a_bytes * sizeof(char);
+ }
+
+ if( free_b )
+ {
+ mbedtls_free( ptr_b );
+ ptr_b = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ allocated_bytes -= b_bytes * sizeof(char);
+ }
+
+ if( free_c )
+ {
+ mbedtls_free( ptr_c );
+ ptr_c = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ allocated_bytes -= c_bytes * sizeof(char);
+ }
+
+ if( free_d )
+ {
+ mbedtls_free( ptr_d );
+ ptr_d = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ allocated_bytes -= d_bytes * sizeof(char);
+ }
+
+ mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
+ TEST_ASSERT( reported_bytes == allocated_bytes );
+
+ if( e_bytes > 0 )
+ {
+ ptr_e = mbedtls_calloc( e_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_e ) == 0 );
+ }
+
+ if( f_bytes > 0 )
+ {
+ ptr_f = mbedtls_calloc( f_bytes, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_f ) == 0 );
+ }
+
+ /* Once blocks are reallocated, the block allocated to the memory request
+ * may be bigger than the request itself, which is indicated by the reported
+ * bytes, and makes it hard to know what the reported size will be, so
+ * we don't check the size after blocks have been reallocated. */
+
+ if( ptr_a != NULL )
+ {
+ mbedtls_free( ptr_a );
+ ptr_a = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+ }
+
+ if( ptr_b != NULL )
+ {
+ mbedtls_free( ptr_b );
+ ptr_b = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+ }
+
+ if( ptr_c != NULL )
+ {
+ mbedtls_free( ptr_c );
+ ptr_c = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+ }
+
+ if( ptr_d != NULL )
+ {
+ mbedtls_free( ptr_d );
+ ptr_d = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+ }
+
+ if( ptr_e != NULL )
+ {
+ mbedtls_free( ptr_e );
+ ptr_e = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+ }
+
+ if( ptr_f != NULL )
+ {
+ mbedtls_free( ptr_f );
+ ptr_f = NULL;
+ }
+
+ mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
+ TEST_ASSERT( reported_bytes == 0 );
+
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+exit:
+ mbedtls_memory_buffer_alloc_free( );
+}
+/* END_CASE */
+
+/* BEGIN_CASE depends_on:MBEDTLS_MEMORY_DEBUG */
+void memory_buffer_alloc_oom_test()
+{
+ unsigned char buf[1024];
+ unsigned char *ptr_a = NULL, *ptr_b = NULL, *ptr_c = NULL;
+ size_t reported_blocks, reported_bytes;
+
+ (void)ptr_c;
+
+ mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
+
+ mbedtls_memory_buffer_set_verify( MBEDTLS_MEMORY_VERIFY_ALWAYS );
+
+ ptr_a = mbedtls_calloc( 432, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_a ) == 0 );
+
+ ptr_b = mbedtls_calloc( 432, sizeof(char) );
+ TEST_ASSERT( check_pointer( ptr_b ) == 0 );
+
+ ptr_c = mbedtls_calloc( 431, sizeof(char) );
+ TEST_ASSERT( ptr_c == NULL );
+
+ mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
+ TEST_ASSERT( reported_bytes >= 864 && reported_bytes <= sizeof(buf) );
+
+ mbedtls_free( ptr_a );
+ ptr_a = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ mbedtls_free( ptr_b );
+ ptr_b = NULL;
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+ mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
+ TEST_ASSERT( reported_bytes == 0 );
+
+ TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
+
+exit:
+ mbedtls_memory_buffer_alloc_free( );
+}
+/* END_CASE */
+