Skip to content

Commit 864e4be

Browse files
committed
add is_aligned check
1 parent d9f6ab5 commit 864e4be

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

include/mimalloc-internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ static inline bool _mi_is_power_of_two(uintptr_t x) {
217217
return ((x & (x - 1)) == 0);
218218
}
219219

220+
// Is a pointer aligned?
221+
static inline bool _mi_is_aligned(void* p, size_t alignment) {
222+
mi_assert_internal(alignment != 0);
223+
return (((uintptr_t)p % alignment) == 0);
224+
}
225+
220226
// Align upwards
221227
static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) {
222228
mi_assert_internal(alignment != 0);

src/alloc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,9 @@ void* _mi_heap_realloc_zero(mi_heap_t* heap, void* p, size_t newsize, bool zero)
633633
memset((uint8_t*)newp + start, 0, newsize - start);
634634
}
635635
if mi_likely(p != NULL) {
636-
_mi_memcpy_aligned(newp, p, (newsize > size ? size : newsize));
636+
if mi_likely(_mi_is_aligned(p, sizeof(uintptr_t))) { // a client may pass in an arbitrary pointer `p`..
637+
_mi_memcpy_aligned(newp, p, (newsize > size ? size : newsize));
638+
}
637639
mi_free(p); // only free the original pointer if successful
638640
}
639641
}

0 commit comments

Comments
 (0)