From 98298a276b1c471380929accd060f8d8b0f92ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sat, 5 Apr 2025 15:59:11 +0200 Subject: [PATCH] Support reallocarray(3) --- h_malloc.c | 11 +++++++++++ include/h_malloc.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/h_malloc.c b/h_malloc.c index 6221d0b..9f693dc 100644 --- a/h_malloc.c +++ b/h_malloc.c @@ -1656,6 +1656,17 @@ EXPORT void *h_realloc(void *old, size_t size) { return new; } +EXPORT void *h_reallocarray(void *ptr, size_t nmemb, size_t size) { + size_t bytes; + + if (unlikely(__builtin_mul_overflow(nmemb, size, &bytes))) { + errno = ENOMEM; + return NULL; + } + + return h_realloc(ptr, bytes); +} + EXPORT int h_posix_memalign(void **memptr, size_t alignment, size_t size) { return alloc_aligned(memptr, alignment, size, sizeof(void *)); } diff --git a/include/h_malloc.h b/include/h_malloc.h index 0eee395..94bebef 100644 --- a/include/h_malloc.h +++ b/include/h_malloc.h @@ -13,6 +13,7 @@ extern "C" { #define h_malloc malloc #define h_calloc calloc #define h_realloc realloc +#define h_reallocarray reallocarray #define h_aligned_alloc aligned_alloc #define h_free free @@ -51,6 +52,7 @@ extern "C" { __attribute__((malloc)) __attribute__((alloc_size(1))) void *h_malloc(size_t size); __attribute__((malloc)) __attribute__((alloc_size(1, 2))) void *h_calloc(size_t nmemb, size_t size); __attribute__((alloc_size(2))) void *h_realloc(void *ptr, size_t size); +__attribute__((alloc_size(2, 3))) void *h_reallocarray(void *ptr, size_t nmemb, size_t size); __attribute__((malloc)) __attribute__((alloc_size(2))) __attribute__((alloc_align(1))) void *h_aligned_alloc(size_t alignment, size_t size); void h_free(void *ptr);