diff options
Diffstat (limited to 'tests/suites/test_suite_memory_buffer_alloc.function')
-rw-r--r-- | tests/suites/test_suite_memory_buffer_alloc.function | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/tests/suites/test_suite_memory_buffer_alloc.function b/tests/suites/test_suite_memory_buffer_alloc.function new file mode 100644 index 00000000000..2b81097a562 --- /dev/null +++ b/tests/suites/test_suite_memory_buffer_alloc.function @@ -0,0 +1,264 @@ +/* BEGIN_HEADER */ +#include "mbedtls/memory_buffer_alloc.h" +#define TEST_SUITE_MEMORY_BUFFER_ALLOC + +/* END_HEADER */ + +/* BEGIN_DEPENDENCIES + * depends_on:MBEDTLS_MEMORY_BUFFER_ALLOC_C + * 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(1) == 0); +} +/* END_CASE */ + +/* BEGIN_CASE */ +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; + +#if defined(MBEDTLS_MEMORY_DEBUG) + size_t reported_blocks; + size_t reported_bytes; +#endif + size_t allocated_bytes = 0; + + 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); + } + +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_memory_buffer_alloc_cur_get(&reported_bytes, &reported_blocks); + TEST_ASSERT(reported_bytes == allocated_bytes); +#endif + + 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); + } + +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_memory_buffer_alloc_cur_get(&reported_bytes, &reported_blocks); + TEST_ASSERT(reported_bytes == allocated_bytes); +#endif + + 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; + } + +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_memory_buffer_alloc_cur_get(&reported_bytes, &reported_blocks); + TEST_ASSERT(reported_bytes == 0); +#endif + + TEST_ASSERT(mbedtls_memory_buffer_alloc_verify() == 0); + +exit: + mbedtls_memory_buffer_alloc_free(); +} +/* END_CASE */ + +/* BEGIN_CASE */ +void memory_buffer_alloc_oom_test() +{ + unsigned char buf[1024]; + unsigned char *ptr_a = NULL, *ptr_b = NULL, *ptr_c = NULL; +#if defined(MBEDTLS_MEMORY_DEBUG) + size_t reported_blocks, reported_bytes; +#endif + + (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); + +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_memory_buffer_alloc_cur_get(&reported_bytes, &reported_blocks); + TEST_ASSERT(reported_bytes >= 864 && reported_bytes <= sizeof(buf)); +#endif + + 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); + +#if defined(MBEDTLS_MEMORY_DEBUG) + mbedtls_memory_buffer_alloc_cur_get(&reported_bytes, &reported_blocks); + TEST_ASSERT(reported_bytes == 0); +#endif + + TEST_ASSERT(mbedtls_memory_buffer_alloc_verify() == 0); + +exit: + mbedtls_memory_buffer_alloc_free(); +} +/* END_CASE */ + +/* BEGIN_CASE */ +void memory_buffer_heap_too_small() +{ + unsigned char buf[1]; + + mbedtls_memory_buffer_alloc_init(buf, sizeof(buf)); + /* With MBEDTLS_MEMORY_DEBUG enabled, this prints a message + * "FATAL: verification of first header failed". + */ + TEST_ASSERT(mbedtls_memory_buffer_alloc_verify() != 0); +} +/* END_CASE */ + +/* BEGIN_CASE */ +void memory_buffer_underalloc() +{ + unsigned char buf[100]; + size_t i; + + mbedtls_memory_buffer_alloc_init(buf, sizeof(buf)); + for (i = 1; i < MBEDTLS_MEMORY_ALIGN_MULTIPLE; i++) { + TEST_ASSERT(mbedtls_calloc(1, + (size_t) -(MBEDTLS_MEMORY_ALIGN_MULTIPLE - i)) == NULL); + TEST_ASSERT(mbedtls_memory_buffer_alloc_verify() == 0); + } + +exit: + mbedtls_memory_buffer_alloc_free(); +} +/* END_CASE */ |