]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use max_align_t for memory sizeinfo alignment on OpenBSD
authorOndrej Sury <ondrej@openbsd-6-9.home.sury.org>
Tue, 13 Jul 2021 10:35:52 +0000 (12:35 +0200)
committerOndřej Surý <ondrej@sury.org>
Tue, 13 Jul 2021 11:48:33 +0000 (13:48 +0200)
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

index d04ac22ac3e961c86750b417072af103adec8a84..95dbf0dc15369e5716fb0219842f9ad859eea22c 100644 (file)
@@ -13,6 +13,8 @@
 
 #if !defined(HAVE_JEMALLOC)
 
+#include <stddef.h>
+
 #include <isc/util.h>
 
 const char *malloc_conf = NULL;
@@ -76,41 +78,58 @@ sallocx(void *ptr, int flags) {
 
 #include <stdlib.h>
 
+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);
+
+       si->size = size;
+       ptr = &si[1];
 
-       return (&__ptr[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);
+
+       si->size = size;
+       ptr = &si[1];
 
-       return (&__ptr[1]);
+       return (ptr);
 }
 
 #endif /* defined(HAVE_MALLOC_SIZE) || defined (HAVE_MALLOC_USABLE_SIZE) */