1#ifndef JEMALLOC_INTERNAL_SAFETY_CHECK_H
2#define JEMALLOC_INTERNAL_SAFETY_CHECK_H
3
4#define SAFETY_CHECK_DOUBLE_FREE_MAX_SCAN_DEFAULT 32
5
6void safety_check_fail_sized_dealloc(bool current_dealloc, const void *ptr,
7 size_t true_size, size_t input_size);
8void safety_check_fail(const char *format, ...);
9
10typedef void (*safety_check_abort_hook_t)(const char *message);
11
12/* Can set to NULL for a default. */
13void safety_check_set_abort(safety_check_abort_hook_t abort_fn);
14
15JEMALLOC_ALWAYS_INLINE void
16safety_check_set_redzone(void *ptr, size_t usize, size_t bumped_usize) {
17 assert(usize < bumped_usize);
18 for (size_t i = usize; i < bumped_usize && i < usize + 32; ++i) {
19 *((unsigned char *)ptr + i) = 0xBC;
20 }
21}
22
23JEMALLOC_ALWAYS_INLINE void
24safety_check_verify_redzone(const void *ptr, size_t usize, size_t bumped_usize)
25{
26 for (size_t i = usize; i < bumped_usize && i < usize + 32; ++i) {
27 if (unlikely(*((unsigned char *)ptr + i) != 0xBC)) {
28 safety_check_fail("Use after free error\n");
29 }
30 }
31}
32
33#endif /*JEMALLOC_INTERNAL_SAFETY_CHECK_H */
34