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