Loading...
--- libmalloc/libmalloc-474.0.13/tests/zone_names.c
+++ libmalloc/libmalloc-646.40.3/tests/zone_names.c
@@ -9,14 +9,12 @@
T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
+#include <mach/mach.h> // mach_task_self()
#include <malloc/malloc.h>
+#include <malloc_private.h> // malloc_get_wrapped_zone()
#include <stdlib.h> // free()
#include "../src/platform.h" // CONFIG_NANOZONE
-
-T_GLOBAL_META(T_META_ENVVAR("MallocProbGuard=0"));
-// A local T_META_ENVVAR declaration will override all global ones so we have to
-// restate this on tests that use T_META_ENVVAR.
static void
check_zone_names(malloc_zone_t **zones, const char **names, uint32_t count)
@@ -38,14 +36,15 @@
T_DECL(default_zone, "Zone names: default",
T_META_ENVVAR("MallocNanoZone=0"), T_META_ENVVAR("MallocProbGuard=0"),
- T_META_TAG_XZONE)
+ T_META_TAG_XZONE, T_META_TAG_VM_PREFERRED)
{
const char *names[] = {"DefaultMallocZone"};
check_default_zone_names(names, 1);
}
T_DECL(default_zone_and_nano, "Zone names: default + nano",
- T_META_ENVVAR("MallocNanoZone=1"), T_META_ENVVAR("MallocProbGuard=0"))
+ T_META_ENVVAR("MallocNanoZone=1"), T_META_ENVVAR("MallocProbGuard=0"),
+ T_META_TAG_VM_PREFERRED)
{
#if CONFIG_NANOZONE
const char *names[] = {"DefaultMallocZone", "MallocHelperZone"};
@@ -57,13 +56,13 @@
T_DECL(default_zone_and_pgm, "Zone names: default + ProbGuard",
T_META_ENVVAR("MallocProbGuard=1"), T_META_ENVVAR("MallocNanoZone=0"),
- T_META_TAG_XZONE)
+ T_META_TAG_XZONE, T_META_TAG_VM_PREFERRED)
{
const char *names[] = {"ProbGuardMallocZone", "DefaultMallocZone"};
check_default_zone_names(names, 2);
}
-T_DECL(zone_singletons, "Zone singletons", T_META_TAG_XZONE)
+T_DECL(zone_singletons, "Zone singletons", T_META_TAG_XZONE, T_META_TAG_VM_PREFERRED)
{
malloc_zone_t *zones[] = {
malloc_default_zone(),
@@ -85,14 +84,15 @@
return zone;
}
-T_DECL(virtual_zone0, "Ensure we return the virtual zone in place of zone 0")
+T_DECL(virtual_zone0, "Ensure we return the virtual zone in place of zone 0", T_META_TAG_VM_PREFERRED)
{
malloc_zone_t *virtual_zone = malloc_default_zone();
T_EXPECT_NE(virtual_zone, malloc_zones[0], NULL);
T_EXPECT_EQ(call_malloc_zone_from_ptr(), virtual_zone, NULL);
}
-T_DECL(zone_creation, "Zone creation", T_META_TAG_XZONE)
+T_DECL(zone_creation, "Zone creation",
+ T_META_ENVVAR("MallocProbGuard=0"), T_META_TAG_XZONE, T_META_TAG_VM_NOT_PREFERRED)
{
T_EXPECT_NULL(malloc_create_zone(0, 0)->zone_name, "No name");
}
@@ -115,12 +115,14 @@
const char *copy = zone_name;
malloc_set_zone_name(zone, NULL);
T_EXPECT_NULL(zone_name, "zone name set to NULL");
- if (!getenv("MallocSecureAllocator")) {
+ if (!malloc_engaged_secure_allocator()) {
+ // Xzone Malloc can mistakenly report tiny freed chunks as allocated if
+ // the chunk is madvised
T_EXPECT_EQ(malloc_size(copy), 0ul, "copy freed");
}
}
-T_DECL(malloc_set_zone_name, "malloc_set_zone_name", T_META_TAG_XZONE)
+T_DECL(malloc_set_zone_name, "malloc_set_zone_name", T_META_TAG_XZONE, T_META_TAG_VM_PREFERRED)
{
malloc_zone_t *zones[] = {
malloc_default_zone(),
@@ -132,3 +134,31 @@
check_set_zone_name(zones[i]);
}
}
+
+static malloc_zone_t *
+get_wrapped_zone(malloc_zone_t *zone)
+{
+ malloc_zone_t *wrapped_zone;
+ kern_return_t kr = malloc_get_wrapped_zone(mach_task_self(),
+ /*memory_reader=*/NULL, (vm_address_t)zone, (vm_address_t *)&wrapped_zone);
+ T_QUIET; T_ASSERT_EQ(kr, KERN_SUCCESS, "malloc_get_wrapped_zone() failed");
+ T_EXPECT_NOTNULL(wrapped_zone, "Wrapped zone");
+ return wrapped_zone;
+}
+
+T_DECL(malloc_set_zone_name_on_wrapper_zone,
+ "Setting name of wrapper zone delegates to wrapped zone",
+ T_META_ENVVAR("MallocProbGuard=1"),
+ T_META_CHECK_LEAKS(false), // rdar://114740269
+ T_META_TAG_XZONE,
+ T_META_TAG_VM_PREFERRED)
+{
+ malloc_zone_t *zone = malloc_zones[0];
+ malloc_zone_t *wrapped_zone = get_wrapped_zone(zone);
+
+ malloc_set_zone_name(zone, "test");
+
+ T_EXPECT_EQ_STR(malloc_get_zone_name(zone), "test", "Wrapper zone name");
+ T_EXPECT_EQ_STR(malloc_get_zone_name(wrapped_zone), "test-PGM-Wrapped",
+ "Wrapped zone name");
+}