Rework the calloc buffer initialization test in selftest.c

This way it's more in line with development.
Signed-off-by: Andrzej Kurek <andrzej.kurek@arm.com>
diff --git a/programs/test/selftest.c b/programs/test/selftest.c
index 3adf2e5..be97a58 100644
--- a/programs/test/selftest.c
+++ b/programs/test/selftest.c
@@ -77,23 +77,49 @@
     void *empty2 = mbedtls_calloc(0, 1);
     void *buffer1 = mbedtls_calloc(1, 1);
     void *buffer2 = mbedtls_calloc(1, 1);
+    unsigned int buf_size = 256;
+    unsigned char *buffer3 = mbedtls_calloc(buf_size, sizeof(unsigned char));
 
     if (empty1 == NULL && empty2 == NULL) {
         if (verbose) {
-            mbedtls_printf("  CALLOC(0): passed (NULL)\n");
+            mbedtls_printf("  CALLOC(0,1): passed (NULL)\n");
         }
     } else if (empty1 == NULL || empty2 == NULL) {
         if (verbose) {
-            mbedtls_printf("  CALLOC(0): failed (mix of NULL and non-NULL)\n");
+            mbedtls_printf("  CALLOC(0,1): failed (mix of NULL and non-NULL)\n");
         }
         ++failures;
     } else if (empty1 == empty2) {
         if (verbose) {
-            mbedtls_printf("  CALLOC(0): passed (same non-null)\n");
+            mbedtls_printf("  CALLOC(0,1): passed (same non-null)\n");
         }
     } else {
         if (verbose) {
-            mbedtls_printf("  CALLOC(0): passed (distinct non-null)\n");
+            mbedtls_printf("  CALLOC(0,1): passed (distinct non-null)\n");
+        }
+    }
+
+    mbedtls_free(empty1);
+    mbedtls_free(empty2);
+
+    empty1 = mbedtls_calloc(1, 0);
+    empty2 = mbedtls_calloc(1, 0);
+    if (empty1 == NULL && empty2 == NULL) {
+        if (verbose) {
+            mbedtls_printf("  CALLOC(1,0): passed (NULL)\n");
+        }
+    } else if (empty1 == NULL || empty2 == NULL) {
+        if (verbose) {
+            mbedtls_printf("  CALLOC(1,0): failed (mix of NULL and non-NULL)\n");
+        }
+        ++failures;
+    } else if (empty1 == empty2) {
+        if (verbose) {
+            mbedtls_printf("  CALLOC(1,0): passed (same non-null)\n");
+        }
+    } else {
+        if (verbose) {
+            mbedtls_printf("  CALLOC(1,0): passed (distinct non-null)\n");
         }
     }
 
@@ -126,6 +152,16 @@
         }
     }
 
+    for (unsigned int i = 0; i < buf_size; i++) {
+        if (buffer3[i] != 0) {
+            ++failures;
+            if (verbose) {
+                mbedtls_printf("  CALLOC(%u): failed (memory not initialized to 0)\n", buf_size);
+            }
+            break;
+        }
+    }
+
     if (verbose) {
         mbedtls_printf("\n");
     }
@@ -133,6 +169,7 @@
     mbedtls_free(empty2);
     mbedtls_free(buffer1);
     mbedtls_free(buffer2);
+    mbedtls_free(buffer3);
     return failures;
 }
 #endif /* MBEDTLS_SELF_TEST */
@@ -167,23 +204,6 @@
            test_snprintf(5, "123",         3) != 0;
 }
 
-static int run_test_mbedtls_calloc(void)
-{
-    unsigned int buf_size = 256;
-    unsigned char *buf;
-    int ret = -1;
-    buf = mbedtls_calloc(buf_size, sizeof(unsigned char));
-    for (unsigned int i = 0; i < buf_size; i++) {
-        if (buf[i] != 0) {
-            ret = -1;
-            goto exit;
-        }
-    }
-    ret = 0;
-exit:
-    mbedtls_free(buf);
-    return ret;
-}
 /*
  * Check if a seed file is present, and if not create one for the entropy
  * self-test. If this fails, we attempt the test anyway, so no error is passed
@@ -393,12 +413,6 @@
         mbedtls_exit(MBEDTLS_EXIT_FAILURE);
     }
 
-    /* Make sure that mbedtls_calloc zeroizes the buffer */
-    if (run_test_mbedtls_calloc() != 0) {
-        mbedtls_printf("the calloc implementation does not zeroize the buffer\n");
-        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
-    }
-
     for (argp = argv + (argc >= 1 ? 1 : argc); *argp != NULL; ++argp) {
         if (strcmp(*argp, "--quiet") == 0 ||
             strcmp(*argp, "-q") == 0) {