1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/util.h"
4*1208bc7eSAndroid Build Coastguard Worker
5*1208bc7eSAndroid Build Coastguard Worker static arena_dalloc_junk_small_t *arena_dalloc_junk_small_orig;
6*1208bc7eSAndroid Build Coastguard Worker static large_dalloc_junk_t *large_dalloc_junk_orig;
7*1208bc7eSAndroid Build Coastguard Worker static large_dalloc_maybe_junk_t *large_dalloc_maybe_junk_orig;
8*1208bc7eSAndroid Build Coastguard Worker static void *watch_for_junking;
9*1208bc7eSAndroid Build Coastguard Worker static bool saw_junking;
10*1208bc7eSAndroid Build Coastguard Worker
11*1208bc7eSAndroid Build Coastguard Worker static void
watch_junking(void * p)12*1208bc7eSAndroid Build Coastguard Worker watch_junking(void *p) {
13*1208bc7eSAndroid Build Coastguard Worker watch_for_junking = p;
14*1208bc7eSAndroid Build Coastguard Worker saw_junking = false;
15*1208bc7eSAndroid Build Coastguard Worker }
16*1208bc7eSAndroid Build Coastguard Worker
17*1208bc7eSAndroid Build Coastguard Worker static void
arena_dalloc_junk_small_intercept(void * ptr,const bin_info_t * bin_info)18*1208bc7eSAndroid Build Coastguard Worker arena_dalloc_junk_small_intercept(void *ptr, const bin_info_t *bin_info) {
19*1208bc7eSAndroid Build Coastguard Worker size_t i;
20*1208bc7eSAndroid Build Coastguard Worker
21*1208bc7eSAndroid Build Coastguard Worker arena_dalloc_junk_small_orig(ptr, bin_info);
22*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < bin_info->reg_size; i++) {
23*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(((uint8_t *)ptr)[i], JEMALLOC_FREE_JUNK,
24*1208bc7eSAndroid Build Coastguard Worker "Missing junk fill for byte %zu/%zu of deallocated region",
25*1208bc7eSAndroid Build Coastguard Worker i, bin_info->reg_size);
26*1208bc7eSAndroid Build Coastguard Worker }
27*1208bc7eSAndroid Build Coastguard Worker if (ptr == watch_for_junking) {
28*1208bc7eSAndroid Build Coastguard Worker saw_junking = true;
29*1208bc7eSAndroid Build Coastguard Worker }
30*1208bc7eSAndroid Build Coastguard Worker }
31*1208bc7eSAndroid Build Coastguard Worker
32*1208bc7eSAndroid Build Coastguard Worker static void
large_dalloc_junk_intercept(void * ptr,size_t usize)33*1208bc7eSAndroid Build Coastguard Worker large_dalloc_junk_intercept(void *ptr, size_t usize) {
34*1208bc7eSAndroid Build Coastguard Worker size_t i;
35*1208bc7eSAndroid Build Coastguard Worker
36*1208bc7eSAndroid Build Coastguard Worker large_dalloc_junk_orig(ptr, usize);
37*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < usize; i++) {
38*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(((uint8_t *)ptr)[i], JEMALLOC_FREE_JUNK,
39*1208bc7eSAndroid Build Coastguard Worker "Missing junk fill for byte %zu/%zu of deallocated region",
40*1208bc7eSAndroid Build Coastguard Worker i, usize);
41*1208bc7eSAndroid Build Coastguard Worker }
42*1208bc7eSAndroid Build Coastguard Worker if (ptr == watch_for_junking) {
43*1208bc7eSAndroid Build Coastguard Worker saw_junking = true;
44*1208bc7eSAndroid Build Coastguard Worker }
45*1208bc7eSAndroid Build Coastguard Worker }
46*1208bc7eSAndroid Build Coastguard Worker
47*1208bc7eSAndroid Build Coastguard Worker static void
large_dalloc_maybe_junk_intercept(void * ptr,size_t usize)48*1208bc7eSAndroid Build Coastguard Worker large_dalloc_maybe_junk_intercept(void *ptr, size_t usize) {
49*1208bc7eSAndroid Build Coastguard Worker large_dalloc_maybe_junk_orig(ptr, usize);
50*1208bc7eSAndroid Build Coastguard Worker if (ptr == watch_for_junking) {
51*1208bc7eSAndroid Build Coastguard Worker saw_junking = true;
52*1208bc7eSAndroid Build Coastguard Worker }
53*1208bc7eSAndroid Build Coastguard Worker }
54*1208bc7eSAndroid Build Coastguard Worker
55*1208bc7eSAndroid Build Coastguard Worker static void
test_junk(size_t sz_min,size_t sz_max)56*1208bc7eSAndroid Build Coastguard Worker test_junk(size_t sz_min, size_t sz_max) {
57*1208bc7eSAndroid Build Coastguard Worker uint8_t *s;
58*1208bc7eSAndroid Build Coastguard Worker size_t sz_prev, sz, i;
59*1208bc7eSAndroid Build Coastguard Worker
60*1208bc7eSAndroid Build Coastguard Worker if (opt_junk_free) {
61*1208bc7eSAndroid Build Coastguard Worker arena_dalloc_junk_small_orig = arena_dalloc_junk_small;
62*1208bc7eSAndroid Build Coastguard Worker arena_dalloc_junk_small = arena_dalloc_junk_small_intercept;
63*1208bc7eSAndroid Build Coastguard Worker large_dalloc_junk_orig = large_dalloc_junk;
64*1208bc7eSAndroid Build Coastguard Worker large_dalloc_junk = large_dalloc_junk_intercept;
65*1208bc7eSAndroid Build Coastguard Worker large_dalloc_maybe_junk_orig = large_dalloc_maybe_junk;
66*1208bc7eSAndroid Build Coastguard Worker large_dalloc_maybe_junk = large_dalloc_maybe_junk_intercept;
67*1208bc7eSAndroid Build Coastguard Worker }
68*1208bc7eSAndroid Build Coastguard Worker
69*1208bc7eSAndroid Build Coastguard Worker sz_prev = 0;
70*1208bc7eSAndroid Build Coastguard Worker s = (uint8_t *)mallocx(sz_min, 0);
71*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null((void *)s, "Unexpected mallocx() failure");
72*1208bc7eSAndroid Build Coastguard Worker
73*1208bc7eSAndroid Build Coastguard Worker for (sz = sallocx(s, 0); sz <= sz_max;
74*1208bc7eSAndroid Build Coastguard Worker sz_prev = sz, sz = sallocx(s, 0)) {
75*1208bc7eSAndroid Build Coastguard Worker if (sz_prev > 0) {
76*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(s[0], 'a',
77*1208bc7eSAndroid Build Coastguard Worker "Previously allocated byte %zu/%zu is corrupted",
78*1208bc7eSAndroid Build Coastguard Worker ZU(0), sz_prev);
79*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(s[sz_prev-1], 'a',
80*1208bc7eSAndroid Build Coastguard Worker "Previously allocated byte %zu/%zu is corrupted",
81*1208bc7eSAndroid Build Coastguard Worker sz_prev-1, sz_prev);
82*1208bc7eSAndroid Build Coastguard Worker }
83*1208bc7eSAndroid Build Coastguard Worker
84*1208bc7eSAndroid Build Coastguard Worker for (i = sz_prev; i < sz; i++) {
85*1208bc7eSAndroid Build Coastguard Worker if (opt_junk_alloc) {
86*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(s[i], JEMALLOC_ALLOC_JUNK,
87*1208bc7eSAndroid Build Coastguard Worker "Newly allocated byte %zu/%zu isn't "
88*1208bc7eSAndroid Build Coastguard Worker "junk-filled", i, sz);
89*1208bc7eSAndroid Build Coastguard Worker }
90*1208bc7eSAndroid Build Coastguard Worker s[i] = 'a';
91*1208bc7eSAndroid Build Coastguard Worker }
92*1208bc7eSAndroid Build Coastguard Worker
93*1208bc7eSAndroid Build Coastguard Worker if (xallocx(s, sz+1, 0, 0) == sz) {
94*1208bc7eSAndroid Build Coastguard Worker uint8_t *t;
95*1208bc7eSAndroid Build Coastguard Worker watch_junking(s);
96*1208bc7eSAndroid Build Coastguard Worker t = (uint8_t *)rallocx(s, sz+1, 0);
97*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null((void *)t,
98*1208bc7eSAndroid Build Coastguard Worker "Unexpected rallocx() failure");
99*1208bc7eSAndroid Build Coastguard Worker assert_zu_ge(sallocx(t, 0), sz+1,
100*1208bc7eSAndroid Build Coastguard Worker "Unexpectedly small rallocx() result");
101*1208bc7eSAndroid Build Coastguard Worker if (!background_thread_enabled()) {
102*1208bc7eSAndroid Build Coastguard Worker assert_ptr_ne(s, t,
103*1208bc7eSAndroid Build Coastguard Worker "Unexpected in-place rallocx()");
104*1208bc7eSAndroid Build Coastguard Worker assert_true(!opt_junk_free || saw_junking,
105*1208bc7eSAndroid Build Coastguard Worker "Expected region of size %zu to be "
106*1208bc7eSAndroid Build Coastguard Worker "junk-filled", sz);
107*1208bc7eSAndroid Build Coastguard Worker }
108*1208bc7eSAndroid Build Coastguard Worker s = t;
109*1208bc7eSAndroid Build Coastguard Worker }
110*1208bc7eSAndroid Build Coastguard Worker }
111*1208bc7eSAndroid Build Coastguard Worker
112*1208bc7eSAndroid Build Coastguard Worker watch_junking(s);
113*1208bc7eSAndroid Build Coastguard Worker dallocx(s, 0);
114*1208bc7eSAndroid Build Coastguard Worker assert_true(!opt_junk_free || saw_junking,
115*1208bc7eSAndroid Build Coastguard Worker "Expected region of size %zu to be junk-filled", sz);
116*1208bc7eSAndroid Build Coastguard Worker
117*1208bc7eSAndroid Build Coastguard Worker if (opt_junk_free) {
118*1208bc7eSAndroid Build Coastguard Worker arena_dalloc_junk_small = arena_dalloc_junk_small_orig;
119*1208bc7eSAndroid Build Coastguard Worker large_dalloc_junk = large_dalloc_junk_orig;
120*1208bc7eSAndroid Build Coastguard Worker large_dalloc_maybe_junk = large_dalloc_maybe_junk_orig;
121*1208bc7eSAndroid Build Coastguard Worker }
122*1208bc7eSAndroid Build Coastguard Worker }
123*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_junk_small)124*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_junk_small) {
125*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_fill);
126*1208bc7eSAndroid Build Coastguard Worker test_junk(1, SMALL_MAXCLASS-1);
127*1208bc7eSAndroid Build Coastguard Worker }
128*1208bc7eSAndroid Build Coastguard Worker TEST_END
129*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_junk_large)130*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_junk_large) {
131*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_fill);
132*1208bc7eSAndroid Build Coastguard Worker test_junk(SMALL_MAXCLASS+1, (1U << (LG_LARGE_MINCLASS+1)));
133*1208bc7eSAndroid Build Coastguard Worker }
134*1208bc7eSAndroid Build Coastguard Worker TEST_END
135*1208bc7eSAndroid Build Coastguard Worker
136*1208bc7eSAndroid Build Coastguard Worker int
main(void)137*1208bc7eSAndroid Build Coastguard Worker main(void) {
138*1208bc7eSAndroid Build Coastguard Worker return test(
139*1208bc7eSAndroid Build Coastguard Worker test_junk_small,
140*1208bc7eSAndroid Build Coastguard Worker test_junk_large);
141*1208bc7eSAndroid Build Coastguard Worker }
142