diff options
author | Julian Lettner <jlettner@apple.com> | 2019-08-09 21:46:32 +0000 |
---|---|---|
committer | Julian Lettner <jlettner@apple.com> | 2019-08-09 21:46:32 +0000 |
commit | e91386822dcd432b3ed0f3fade68b3a34ce7faff (patch) | |
tree | 4bde86064d852809dfbfc25e1f577bc73c51266c /test/sanitizer_common | |
parent | d0814dbbffc23932c7919ec16ba1206bbe3cb125 (diff) | |
download | compiler-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.cpp | 45 |
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; +} |