From 6eca4b402e7b32c9d75192845e417c76d262fa1b Mon Sep 17 00:00:00 2001 From: Ondrej Sury Date: Tue, 13 Jul 2021 12:35:52 +0200 Subject: [PATCH] Use max_align_t for memory sizeinfo alignment on OpenBSD On OpenBSD and more generally on platforms without either jemalloc or malloc_(usable_)size, we need to increase the alignment for the memory to sizeof(max_align_t) as with plain sizeof(void *), the compiled code would be crashing when accessing the returned memory. --- lib/isc/jemalloc_shim.h | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/lib/isc/jemalloc_shim.h b/lib/isc/jemalloc_shim.h index d04ac22ac3..95dbf0dc15 100644 --- a/lib/isc/jemalloc_shim.h +++ b/lib/isc/jemalloc_shim.h @@ -13,6 +13,8 @@ #if !defined(HAVE_JEMALLOC) +#include + #include const char *malloc_conf = NULL; @@ -76,41 +78,58 @@ sallocx(void *ptr, int flags) { #include +typedef union { + size_t size; + max_align_t __alignment; +} size_info; + static inline void * mallocx(size_t size, int flags) { + void *ptr = NULL; + UNUSED(flags); - size_t *__ptr = malloc(size + sizeof(size_t)); - REQUIRE(__ptr != NULL); - __ptr[0] = size; + size_info *si = malloc(size + sizeof(*si)); + REQUIRE(si != NULL); - return (&__ptr[1]); + si->size = size; + ptr = &si[1]; + + return (ptr); } static inline void sdallocx(void *ptr, size_t size, int flags) { + size_info *si = &(((size_info *)ptr)[-1]); + UNUSED(size); UNUSED(flags); - free(&((size_t *)ptr)[-1]); + free(si); } static inline size_t sallocx(void *ptr, int flags) { + size_info *si = &(((size_info *)ptr)[-1]); + UNUSED(flags); - return (((size_t *)ptr)[-1]); + return (si[0].size); } static inline void * rallocx(void *ptr, size_t size, int flags) { + size_info *si = &(((size_info *)ptr)[-1]); + UNUSED(flags); - size_t *__ptr = realloc(&((size_t *)ptr)[-1], size + sizeof(size_t)); - REQUIRE(__ptr != NULL); - __ptr[0] = size; + si = realloc(si, size + sizeof(*si)); + REQUIRE(si != NULL); - return (&__ptr[1]); + si->size = size; + ptr = &si[1]; + + return (ptr); } #endif /* defined(HAVE_MALLOC_SIZE) || defined (HAVE_MALLOC_USABLE_SIZE) */