Skip to content

Commit 9482d14

Browse files
committed
preserve PROT_MTE when releasing memory
1 parent 3808d43 commit 9482d14

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

h_malloc.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,15 @@ static void *memory_map_tagged(size_t size) {
103103
return memory_map(size);
104104
}
105105

106+
static bool memory_map_fixed_tagged(void *ptr, size_t size) {
107+
#ifdef HAS_ARM_MTE
108+
if (is_memtag_enabled()) {
109+
return memory_map_fixed_mte(ptr, size);
110+
}
111+
#endif
112+
return memory_map_fixed(ptr, size);
113+
}
114+
106115
#define SLAB_METADATA_COUNT
107116

108117
struct slab_metadata {
@@ -899,7 +908,7 @@ static inline void deallocate_small(void *p, const size_t *expected_size) {
899908

900909
if (c->empty_slabs_total + slab_size > max_empty_slabs_total) {
901910
int saved_errno = errno;
902-
if (!memory_map_fixed(slab, slab_size)) {
911+
if (!memory_map_fixed_tagged(slab, slab_size)) {
903912
label_slab(slab, slab_size, class);
904913
stats_slab_deallocate(c, slab_size);
905914
enqueue_free_slab(c, metadata);
@@ -1896,7 +1905,7 @@ EXPORT int h_malloc_trim(UNUSED size_t pad) {
18961905
struct slab_metadata *iterator = c->empty_slabs;
18971906
while (iterator) {
18981907
void *slab = get_slab(c, slab_size, iterator);
1899-
if (memory_map_fixed(slab, slab_size)) {
1908+
if (memory_map_fixed_tagged(slab, slab_size)) {
19001909
break;
19011910
}
19021911
label_slab(slab, slab_size, class);

memory.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,26 @@ void *memory_map_mte(size_t size) {
3939
}
4040
#endif
4141

42-
bool memory_map_fixed(void *ptr, size_t size) {
43-
void *p = mmap(ptr, size, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0);
42+
static bool memory_map_fixed_prot(void *ptr, size_t size, int prot) {
43+
void *p = mmap(ptr, size, prot, MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0);
4444
bool ret = p == MAP_FAILED;
4545
if (unlikely(ret) && errno != ENOMEM) {
4646
fatal_error("non-ENOMEM MAP_FIXED mmap failure");
4747
}
4848
return ret;
4949
}
5050

51+
bool memory_map_fixed(void *ptr, size_t size) {
52+
return memory_map_fixed_prot(ptr, size, PROT_NONE);
53+
}
54+
55+
#ifdef HAS_ARM_MTE
56+
// Note that PROT_MTE can't be cleared via mprotect
57+
bool memory_map_fixed_mte(void *ptr, size_t size) {
58+
return memory_map_fixed_prot(ptr, size, PROT_MTE);
59+
}
60+
#endif
61+
5162
bool memory_unmap(void *ptr, size_t size) {
5263
bool ret = munmap(ptr, size);
5364
if (unlikely(ret) && errno != ENOMEM) {

memory.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ void *memory_map(size_t size);
1515
void *memory_map_mte(size_t size);
1616
#endif
1717
bool memory_map_fixed(void *ptr, size_t size);
18+
#ifdef HAS_ARM_MTE
19+
bool memory_map_fixed_mte(void *ptr, size_t size);
20+
#endif
1821
bool memory_unmap(void *ptr, size_t size);
1922
bool memory_protect_ro(void *ptr, size_t size);
2023
bool memory_protect_rw(void *ptr, size_t size);

0 commit comments

Comments
 (0)