summaryrefslogtreecommitdiff
path: root/tests/suites/test_suite_memory_buffer_alloc.function
diff options
context:
space:
mode:
Diffstat (limited to 'tests/suites/test_suite_memory_buffer_alloc.function')
-rw-r--r--tests/suites/test_suite_memory_buffer_alloc.function264
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 */