xref: /netbsd-src/external/bsd/jemalloc/dist/test/unit/san_bump.c (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
1 #include "test/jemalloc_test.h"
2 #include "test/arena_util.h"
3 
4 #include "jemalloc/internal/arena_structs.h"
5 #include "jemalloc/internal/san_bump.h"
6 
7 TEST_BEGIN(test_san_bump_alloc) {
8 	test_skip_if(!maps_coalesce || !opt_retain);
9 
10 	tsdn_t *tsdn = tsdn_fetch();
11 
12 	san_bump_alloc_t sba;
13 	san_bump_alloc_init(&sba);
14 
15 	unsigned arena_ind = do_arena_create(0, 0);
16 	assert_u_ne(arena_ind, UINT_MAX, "Failed to create an arena");
17 
18 	arena_t *arena = arena_get(tsdn, arena_ind, false);
19 	pac_t *pac = &arena->pa_shard.pac;
20 
21 	size_t alloc_size = PAGE * 16;
22 	size_t alloc_n = alloc_size / sizeof(unsigned);
23 	edata_t* edata = san_bump_alloc(tsdn, &sba, pac, pac_ehooks_get(pac),
24 	    alloc_size, /* zero */ false);
25 
26 	expect_ptr_not_null(edata, "Failed to allocate edata");
27 	expect_u_eq(edata_arena_ind_get(edata), arena_ind,
28 	    "Edata was assigned an incorrect arena id");
29 	expect_zu_eq(edata_size_get(edata), alloc_size,
30 	    "Allocated edata of incorrect size");
31 	expect_false(edata_slab_get(edata),
32 	    "Bump allocator incorrectly assigned 'slab' to true");
33 	expect_true(edata_committed_get(edata), "Edata is not committed");
34 
35 	void *ptr = edata_addr_get(edata);
36 	expect_ptr_not_null(ptr, "Edata was assigned an invalid address");
37 	/* Test that memory is allocated; no guard pages are misplaced */
38 	for (unsigned i = 0; i < alloc_n; ++i) {
39 		((unsigned *)ptr)[i] = 1;
40 	}
41 
42 	size_t alloc_size2 = PAGE * 28;
43 	size_t alloc_n2 = alloc_size / sizeof(unsigned);
44 	edata_t *edata2 = san_bump_alloc(tsdn, &sba, pac, pac_ehooks_get(pac),
45 	    alloc_size2, /* zero */ true);
46 
47 	expect_ptr_not_null(edata2, "Failed to allocate edata");
48 	expect_u_eq(edata_arena_ind_get(edata2), arena_ind,
49 	    "Edata was assigned an incorrect arena id");
50 	expect_zu_eq(edata_size_get(edata2), alloc_size2,
51 	    "Allocated edata of incorrect size");
52 	expect_false(edata_slab_get(edata2),
53 	    "Bump allocator incorrectly assigned 'slab' to true");
54 	expect_true(edata_committed_get(edata2), "Edata is not committed");
55 
56 	void *ptr2 = edata_addr_get(edata2);
57 	expect_ptr_not_null(ptr, "Edata was assigned an invalid address");
58 
59 	uintptr_t ptrdiff = ptr2 > ptr ? (uintptr_t)ptr2 - (uintptr_t)ptr
60 	    : (uintptr_t)ptr - (uintptr_t)ptr2;
61 	size_t between_allocs = (size_t)ptrdiff - alloc_size;
62 
63 	expect_zu_ge(between_allocs, PAGE,
64 	    "Guard page between allocs is missing");
65 
66 	for (unsigned i = 0; i < alloc_n2; ++i) {
67 		expect_u_eq(((unsigned *)ptr2)[i], 0, "Memory is not zeroed");
68 	}
69 }
70 TEST_END
71 
72 TEST_BEGIN(test_large_alloc_size) {
73 	test_skip_if(!maps_coalesce || !opt_retain);
74 
75 	tsdn_t *tsdn = tsdn_fetch();
76 
77 	san_bump_alloc_t sba;
78 	san_bump_alloc_init(&sba);
79 
80 	unsigned arena_ind = do_arena_create(0, 0);
81 	assert_u_ne(arena_ind, UINT_MAX, "Failed to create an arena");
82 
83 	arena_t *arena = arena_get(tsdn, arena_ind, false);
84 	pac_t *pac = &arena->pa_shard.pac;
85 
86 	size_t alloc_size = SBA_RETAINED_ALLOC_SIZE * 2;
87 	edata_t* edata = san_bump_alloc(tsdn, &sba, pac, pac_ehooks_get(pac),
88 	    alloc_size, /* zero */ false);
89 	expect_u_eq(edata_arena_ind_get(edata), arena_ind,
90 	    "Edata was assigned an incorrect arena id");
91 	expect_zu_eq(edata_size_get(edata), alloc_size,
92 	    "Allocated edata of incorrect size");
93 	expect_false(edata_slab_get(edata),
94 	    "Bump allocator incorrectly assigned 'slab' to true");
95 	expect_true(edata_committed_get(edata), "Edata is not committed");
96 
97 	void *ptr = edata_addr_get(edata);
98 	expect_ptr_not_null(ptr, "Edata was assigned an invalid address");
99 	/* Test that memory is allocated; no guard pages are misplaced */
100 	for (unsigned i = 0; i < alloc_size / PAGE; ++i) {
101 		*((char *)ptr + PAGE * i) = 1;
102 	}
103 }
104 TEST_END
105 
106 int
107 main(void) {
108 	return test(
109 	    test_san_bump_alloc,
110 	    test_large_alloc_size);
111 }
112