From: Sebastian Andrzej Siewior Date: Sun, 13 Oct 2024 16:05:55 +0000 (+0200) Subject: mem: Don't use posix_memalign() and friends with custom wrapper X-Git-Tag: openssl-3.5.0-alpha1~1006 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50e9d2b188b8dce070f388640c06a7dc04417390;p=thirdparty%2Fopenssl.git mem: Don't use posix_memalign() and friends with custom wrapper If the application provides custom memory allocations functions via CRYPTO_set_mem_functions() then those should be used instead something else like posix_memalign(). The applications might verify alloc and free calls and pointers from posix_memalign() were never returned by the implementations. At least stunnel4 complains here. Use posix_memalign() or if aligned_alloc() only if the application did not provide a custom malloc() implementation. In case of a custom implementation use CRYPTO_malloc() and align the memory accordingly. Fixes #25678 Signed-off-by: Sebastian Andrzej Siewior Reviewed-by: Saša Nedvědický Reviewed-by: Matt Caswell Reviewed-by: Shane Lontis Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/25682) --- diff --git a/crypto/mem.c b/crypto/mem.c index d788afaadbd..032f2a9cd17 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -238,15 +238,19 @@ void *CRYPTO_aligned_alloc(size_t num, size_t alignment, void **freeptr, return ret; #endif -#if defined (_BSD_SOURCE) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) - if (posix_memalign(&ret, alignment, num)) - return NULL; - *freeptr = ret; - return ret; + /* Allow non-malloc() allocations as long as no malloc_impl is provided. */ + if (malloc_impl == CRYPTO_malloc) { +#if defined(_BSD_SOURCE) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) + if (posix_memalign(&ret, alignment, num)) + return NULL; + *freeptr = ret; + return ret; #elif defined(_ISOC11_SOURCE) - ret = *freeptr = aligned_alloc(alignment, num); - return ret; -#else + ret = *freeptr = aligned_alloc(alignment, num); + return ret; +#endif + } + /* we have to do this the hard way */ /* @@ -261,7 +265,7 @@ void *CRYPTO_aligned_alloc(size_t num, size_t alignment, void **freeptr, * Step 1: Allocate an amount of memory that is * bytes bigger than requested */ - *freeptr = malloc(num + alignment); + *freeptr = CRYPTO_malloc(num + alignment, file, line); if (*freeptr == NULL) return NULL; @@ -282,7 +286,6 @@ void *CRYPTO_aligned_alloc(size_t num, size_t alignment, void **freeptr, */ ret = (void *)((uintptr_t)ret & (uintptr_t)(~(alignment - 1))); return ret; -#endif } void *CRYPTO_realloc(void *str, size_t num, const char *file, int line)