blob: 2b81097a562fb34cf0c7ea7c3bf194ff828e623a [file] [log] [blame]
/* 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 */