|
| 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 | + |
| 21 | +#include <malloc/malloc.h> |
| 22 | +#include <stdlib.h> |
| 23 | +#include <stdio.h> |
| 24 | + |
| 25 | +int main(void) { |
| 26 | + malloc_zone_t *default_zone = malloc_default_zone(); |
| 27 | + printf("default zone name: %s\n", malloc_get_zone_name(default_zone)); |
| 28 | +// CHECK: default zone name: {{a|l|t}}san |
| 29 | + |
| 30 | + void *ptr1 = malloc(10); |
| 31 | + void *ptr2 = malloc_zone_malloc(default_zone, 10); |
| 32 | + |
| 33 | + malloc_zone_t* zone1 = malloc_zone_from_ptr(ptr1); |
| 34 | + malloc_zone_t* zone2 = malloc_zone_from_ptr(ptr2); |
| 35 | + |
| 36 | + printf("zone1: %d\n", zone1 == default_zone); |
| 37 | + printf("zone2: %d\n", zone2 == default_zone); |
| 38 | +// CHECK: zone1: 1 |
| 39 | +// CHECK: zone2: 1 |
| 40 | + |
| 41 | + free(ptr1); |
| 42 | + malloc_zone_free(zone2, ptr2); |
| 43 | + |
| 44 | + return 0; |
| 45 | +} |
0 commit comments