diff options
author | Daan Leijen <daan@microsoft.com> | 2022-04-20 17:33:31 -0700 |
---|---|---|
committer | Daan Leijen <daan@microsoft.com> | 2022-04-20 17:33:31 -0700 |
commit | 864e4be5ce34b90421acec405fcc8b795038248d (patch) | |
tree | 0610af4b15c9458a279f73037178b10f700a2ab7 | |
parent | d9f6ab58c5310a2972e626b0c180228fa7f0322e (diff) |
add is_aligned check
-rw-r--r-- | include/mimalloc-internal.h | 6 | ||||
-rw-r--r-- | src/alloc.c | 4 |
2 files changed, 9 insertions, 1 deletions
diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index ca9e9c4..9fa3710 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -217,6 +217,12 @@ static inline bool _mi_is_power_of_two(uintptr_t x) { return ((x & (x - 1)) == 0); } +// Is a pointer aligned? +static inline bool _mi_is_aligned(void* p, size_t alignment) { + mi_assert_internal(alignment != 0); + return (((uintptr_t)p % alignment) == 0); +} + // Align upwards static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) { mi_assert_internal(alignment != 0); diff --git a/src/alloc.c b/src/alloc.c index 3023594..1984484 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -633,7 +633,9 @@ void* _mi_heap_realloc_zero(mi_heap_t* heap, void* p, size_t newsize, bool zero) memset((uint8_t*)newp + start, 0, newsize - start); } if mi_likely(p != NULL) { - _mi_memcpy_aligned(newp, p, (newsize > size ? size : newsize)); + if mi_likely(_mi_is_aligned(p, sizeof(uintptr_t))) { // a client may pass in an arbitrary pointer `p`.. + _mi_memcpy_aligned(newp, p, (newsize > size ? size : newsize)); + } mi_free(p); // only free the original pointer if successful } } |