Loading...
tests/magazine_malloc.c libmalloc-657.80.3 libmalloc-409.40.6
--- libmalloc/libmalloc-657.80.3/tests/magazine_malloc.c
+++ libmalloc/libmalloc-409.40.6/tests/magazine_malloc.c
@@ -8,10 +8,9 @@
 #include <stdlib.h>
 #include <malloc/malloc.h>
 
-T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true), T_META_TAG_VM_PREFERRED);
+T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
 
-T_DECL(malloc_zone_batch, "malloc_zone_batch_malloc and malloc_zone_batch_free",
-		T_META_ENVVAR("MallocProbGuard=0"))
+T_DECL(malloc_zone_batch, "malloc_zone_batch_malloc and malloc_zone_batch_free")
 {
 	const unsigned count = 10;
 	void **results;
@@ -39,3 +38,31 @@
 	malloc_zone_batch_free(malloc_default_zone(), results, count);
 	free(results);
 }
+
+T_DECL(malloc_zone_batch_zero_on_free, "malloc_zone_batch_free must zero-on-free",
+		T_META_ENVVAR("MallocZeroOnFree=1"),
+		T_META_ENVVAR("MallocCheckZeroOnFreeCorruption=1"),
+		T_META_ENVVAR("MallocNanoZone=0"))
+{
+	const int n = 3;
+	const size_t size = 272;
+	void *allocations[n];
+	for (int i = 0; i < n; i++) {
+		allocations[i] = malloc(size);
+		T_QUIET; T_ASSERT_NOTNULL(allocations[i], "malloc()");
+		memset(allocations[i], 'a', size);
+	}
+
+	malloc_zone_batch_free(malloc_default_zone(), allocations, n);
+
+	char *allocation = calloc(1, size);
+	T_QUIET; T_ASSERT_NOTNULL(allocation, "calloc()");
+
+	for (size_t i = 0; i < size; i++) {
+		T_QUIET; T_ASSERT_EQ(allocation[i], '\0', "byte %zu should be 0", i);
+	}
+
+	free(allocation);
+
+	T_PASS("Successful calloc after batch free");
+}