Skip to content

Commit d89a630

Browse files
committed
follow-up reallocarr(ay) BSD implementations,
here OpenBSD malloc_conceal api. not much different of classic malloc/calloc but content not to be dumped in core files.
1 parent 43e5cd2 commit d89a630

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-0
lines changed

include/mimalloc-override.h

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ not accidentally mix pointers from different allocators).
4949
#define pvalloc(n) mi_pvalloc(n)
5050
#define reallocarray(p,s,n) mi_reallocarray(p,s,n)
5151
#define reallocarr(p,s,n) mi_reallocarr(p,s,n)
52+
#define malloc_conceal(n) mi_malloc_conceal(n)
53+
#define calloc_conceal(n,c) mi_calloc_conceal(n,c)
54+
#define freezero(p,n) mi_freezero(p,n)
5255
#define memalign(a,n) mi_memalign(a,n)
5356
#define aligned_alloc(a,n) mi_aligned_alloc(a,n)
5457
#define posix_memalign(p,a,n) mi_posix_memalign(p,a,n)

include/mimalloc.h

+3
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,9 @@ mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_aligned_alloc(size_t
358358

359359
mi_decl_nodiscard mi_decl_export void* mi_reallocarray(void* p, size_t count, size_t size) mi_attr_noexcept mi_attr_alloc_size2(2,3);
360360
mi_decl_nodiscard mi_decl_export int mi_reallocarr(void* p, size_t count, size_t size) mi_attr_noexcept;
361+
mi_decl_nodiscard mi_decl_export void* mi_malloc_conceal(size_t size) mi_attr_noexcept;
362+
mi_decl_nodiscard mi_decl_export void* mi_calloc_conceal(size_t count, size_t size) mi_attr_noexcept;
363+
mi_decl_export void mi_freezero(void* p, size_t size) mi_attr_noexcept;
361364
mi_decl_nodiscard mi_decl_export void* mi_aligned_recalloc(void* p, size_t newcount, size_t size, size_t alignment) mi_attr_noexcept;
362365
mi_decl_nodiscard mi_decl_export void* mi_aligned_offset_recalloc(void* p, size_t newcount, size_t size, size_t alignment, size_t offset) mi_attr_noexcept;
363366

src/alloc-override.c

+3
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,9 @@ void* reallocarray(void* p, size_t count, size_t size) { return mi_reallocarray
248248
int reallocarr(void* p, size_t count, size_t size) { return mi_reallocarr(p, count, size); }
249249
void* memalign(size_t alignment, size_t size) { return mi_memalign(alignment, size); }
250250
void* _aligned_malloc(size_t alignment, size_t size) { return mi_aligned_alloc(alignment, size); }
251+
void* malloc_conceal(size_t size) { return mi_malloc_conceal(size); }
252+
void* calloc_conceal(size_t count, size_t size) { return mi_calloc_conceal(count, size); }
253+
void freezero(void* p, size_t size) { mi_freezero(p, size); }
251254

252255
#if defined(__GLIBC__) && defined(__linux__)
253256
// forward __libc interface (needed for glibc-based Linux distributions)

src/alloc.c

+43
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,49 @@ extern inline mi_decl_restrict void* mi_malloc(size_t size) mi_attr_noexcept {
119119
return mi_heap_malloc(mi_get_default_heap(), size);
120120
}
121121

122+
mi_decl_restrict void* mi_malloc_conceal(size_t size) mi_attr_noexcept {
123+
void* p;
124+
p = mi_heap_malloc(mi_get_default_heap(), size);
125+
if (mi_likely(p != NULL)) {
126+
#if defined(MADV_DONTDUMP)
127+
madvise(p, size, MADV_DONTDUMP);
128+
#elif defined(MADV_NOCORE)
129+
madvise(p, size, MADV_NOCORE);
130+
#endif
131+
}
132+
return p;
133+
}
134+
135+
mi_decl_restrict void* mi_calloc_conceal(size_t count, size_t size) mi_attr_noexcept {
136+
void* p;
137+
p = mi_heap_calloc(mi_get_default_heap(),count,size);
138+
if (mi_likely(p != NULL)) {
139+
#if defined(MADV_DONTDUMP)
140+
madvise(p, size, MADV_DONTDUMP);
141+
#elif defined(MADV_NOCORE)
142+
madvise(p, size, MADV_NOCORE);
143+
#endif
144+
}
145+
return p;
146+
}
147+
148+
void mi_freezero(void* p, size_t size) mi_attr_noexcept {
149+
mi_free(p);
150+
#if (MI_DEBUG==0)
151+
if (size > 0) {
152+
#if defined(_MSC_VER)
153+
SecureZeroMemory(p, size);
154+
#else
155+
// reusing memset return value and using memory fence
156+
// so memset call is generated regardless of the optimisation level
157+
p = memset(p, 0, size);
158+
__asm__ volatile("" :: "r"(p) : "memory");
159+
#endif
160+
}
161+
#else
162+
MI_UNUSED(size);
163+
#endif
164+
}
122165

123166
void _mi_block_zero_init(const mi_page_t* page, void* p, size_t size) {
124167
// note: we need to initialize the whole usable block size to zero, not just the requested size,

test/test-api.c

+6
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ int main(void) {
9898
CHECK_BODY("calloc0",{
9999
result = (mi_usable_size(mi_calloc(0,1000)) <= 16);
100100
});
101+
CHECK_BODY("malloc_conceal",{
102+
char* p = (char *)mi_malloc(24);
103+
p[0] = 1;
104+
mi_freezero(p, 24);
105+
result = p[0] == 0;
106+
});
101107

102108
// ---------------------------------------------------
103109
// Extended

0 commit comments

Comments
 (0)