1 #include "jemalloc/internal/jemalloc_preamble.h" 2 #include "jemalloc/internal/jemalloc_internal_includes.h" 3 4 static safety_check_abort_hook_t safety_check_abort; 5 6 void safety_check_fail_sized_dealloc(bool current_dealloc, const void *ptr, 7 size_t true_size, size_t input_size) { 8 char *src = current_dealloc ? "the current pointer being freed" : 9 "in thread cache, possibly from previous deallocations"; 10 11 safety_check_fail("<jemalloc>: size mismatch detected (true size %zu " 12 "vs input size %zu), likely caused by application sized " 13 "deallocation bugs (source address: %p, %s). Suggest building with " 14 "--enable-debug or address sanitizer for debugging. Abort.\n", 15 true_size, input_size, ptr, src); 16 } 17 18 void safety_check_set_abort(safety_check_abort_hook_t abort_fn) { 19 safety_check_abort = abort_fn; 20 } 21 22 void safety_check_fail(const char *format, ...) { 23 char buf[MALLOC_PRINTF_BUFSIZE]; 24 25 va_list ap; 26 va_start(ap, format); 27 malloc_vsnprintf(buf, MALLOC_PRINTF_BUFSIZE, format, ap); 28 va_end(ap); 29 30 if (safety_check_abort == NULL) { 31 malloc_write(buf); 32 abort(); 33 } else { 34 safety_check_abort(buf); 35 } 36 } 37