summaryrefslogtreecommitdiff
path: root/test/sanitizer_common
diff options
context:
space:
mode:
authorJulian Lettner <jlettner@apple.com>2019-08-09 21:46:32 +0000
committerJulian Lettner <jlettner@apple.com>2019-08-09 21:46:32 +0000
commite91386822dcd432b3ed0f3fade68b3a34ce7faff (patch)
tree4bde86064d852809dfbfc25e1f577bc73c51266c /test/sanitizer_common
parentd0814dbbffc23932c7919ec16ba1206bbe3cb125 (diff)
downloadcompiler-rt-e91386822dcd432b3ed0f3fade68b3a34ce7faff.tar.gz
[Sanitizer][Darwin] Add interceptor for malloc_zone_from_ptr
Ensure that malloc_default_zone and malloc_zone_from_ptr return the sanitizer-installed malloc zone even when MallocStackLogging (MSL) is requested. This prevents crashes in certain situations. Note that the sanitizers and MSL cannot be used together. If both are enabled, MSL functionality is essentially deactivated since it only hooks the default allocator which is replaced by a custom sanitizer allocator. rdar://53686175 Reviewed By: kubamracek Differential Revision: https://reviews.llvm.org/D65990 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@368492 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/sanitizer_common')
-rw-r--r--test/sanitizer_common/TestCases/Darwin/malloc_zone.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/test/sanitizer_common/TestCases/Darwin/malloc_zone.cpp b/test/sanitizer_common/TestCases/Darwin/malloc_zone.cpp
new file mode 100644
index 000000000..fd6ef0362
--- /dev/null
+++ b/test/sanitizer_common/TestCases/Darwin/malloc_zone.cpp
@@ -0,0 +1,45 @@
+// Check that malloc_default_zone and malloc_zone_from_ptr return the
+// sanitizer-installed malloc zone even when MallocStackLogging (MSL) is
+// requested. This prevents crashes in certain situations. Note that the
+// sanitizers and MSL cannot be used together. If both are enabled, MSL
+// functionality is essentially deactivated since it only hooks the default
+// allocator which is replaced by a custom sanitizer allocator.
+//
+// MSL=lite creates its own special malloc zone, copies the passed zone name,
+// and leaks it.
+// RUN: echo "leak:create_and_insert_msl_lite_zone" >> lsan.supp
+//
+// RUN: %clangxx -g %s -o %t
+// RUN: %run %t | FileCheck %s
+// RUN: %env MallocStackLogging=lite LSAN_OPTIONS=suppressions=lsan.supp %run %t | FileCheck %s
+// RUN: %env MallocStackLogging=full %run %t | FileCheck %s
+//
+// UBSan does not install a malloc zone.
+// XFAIL: ubsan
+//
+
+#include <malloc/malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(void) {
+ malloc_zone_t *default_zone = malloc_default_zone();
+ printf("default zone name: %s\n", malloc_get_zone_name(default_zone));
+// CHECK: default zone name: {{a|l|t}}san
+
+ void *ptr1 = malloc(10);
+ void *ptr2 = malloc_zone_malloc(default_zone, 10);
+
+ malloc_zone_t* zone1 = malloc_zone_from_ptr(ptr1);
+ malloc_zone_t* zone2 = malloc_zone_from_ptr(ptr2);
+
+ printf("zone1: %d\n", zone1 == default_zone);
+ printf("zone2: %d\n", zone2 == default_zone);
+// CHECK: zone1: 1
+// CHECK: zone2: 1
+
+ free(ptr1);
+ malloc_zone_free(zone2, ptr2);
+
+ return 0;
+}