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 | |
6 | void safety_check_fail_sized_dealloc(bool current_dealloc, const void *ptr, |
7 | size_t true_size, size_t input_size); |
8 | void safety_check_fail(const char *format, ...); |
9 | |
10 | typedef void (*safety_check_abort_hook_t)(const char *message); |
11 | |
12 | /* Can set to NULL for a default. */ |
13 | void safety_check_set_abort(safety_check_abort_hook_t abort_fn); |
14 | |
15 | JEMALLOC_ALWAYS_INLINE void |
16 | safety_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 | |
23 | JEMALLOC_ALWAYS_INLINE void |
24 | safety_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 |