| 1 | // Check that malloc_default_zone and malloc_zone_from_ptr return the |
| 2 | // sanitizer-installed malloc zone even when MallocStackLogging (MSL) is |
| 3 | // requested. This prevents crashes in certain situations. Note that the |
| 4 | // sanitizers and MSL cannot be used together. If both are enabled, MSL |
| 5 | // functionality is essentially deactivated since it only hooks the default |
| 6 | // allocator which is replaced by a custom sanitizer allocator. |
| 7 | // |
| 8 | // MSL=lite creates its own special malloc zone, copies the passed zone name, |
| 9 | // and leaks it. |
| 10 | // RUN: echo "leak:create_and_insert_msl_lite_zone" >> lsan.supp |
| 11 | // |
| 12 | // RUN: %clangxx -g %s -o %t |
| 13 | // RUN: %run %t | FileCheck %s |
| 14 | // RUN: %env MallocStackLogging=lite LSAN_OPTIONS=suppressions=lsan.supp %run %t | FileCheck %s |
| 15 | // RUN: %env MallocStackLogging=full %run %t | FileCheck %s |
| 16 | // |
| 17 | // UBSan does not install a malloc zone. |
| 18 | // XFAIL: ubsan |
| 19 | // |
| 20 | // Currently fails on darwin/lsan |
| 21 | // XFAIL: darwin && lsan |
| 22 | |
| 23 | #include <malloc/malloc.h> |
| 24 | #include <stdlib.h> |
| 25 | #include <stdio.h> |
| 26 | |
| 27 | int main(void) { |
| 28 | malloc_zone_t *default_zone = malloc_default_zone(); |
| 29 | printf("default zone name: %s\n" , malloc_get_zone_name(default_zone)); |
| 30 | // CHECK: default zone name: {{a|l|t}}san |
| 31 | |
| 32 | void *ptr1 = malloc(size: 10); |
| 33 | void *ptr2 = malloc_zone_malloc(default_zone, 10); |
| 34 | |
| 35 | malloc_zone_t* zone1 = malloc_zone_from_ptr(ptr1); |
| 36 | malloc_zone_t* zone2 = malloc_zone_from_ptr(ptr2); |
| 37 | |
| 38 | printf("zone1: %d\n" , zone1 == default_zone); |
| 39 | printf("zone2: %d\n" , zone2 == default_zone); |
| 40 | // CHECK: zone1: 1 |
| 41 | // CHECK: zone2: 1 |
| 42 | |
| 43 | free(ptr: ptr1); |
| 44 | malloc_zone_free(zone2, ptr2); |
| 45 | |
| 46 | return 0; |
| 47 | } |
| 48 | |