]> sourceware.org Git - valgrind.git/commitdiff
Bug 474332 - aligned_alloc under Valgrind returns nullptr when alignment is not a...
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 10 Sep 2023 13:05:57 +0000 (15:05 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 10 Sep 2023 13:05:57 +0000 (15:05 +0200)
At configure time use glibc version to set a HAVE flag for C17 aligned_alloc.
The use the HAVE flag to select which redir macro to use.
Also make the (normally unused) glibc ALIGNED_ALLOC macro
the same as MEMALIGN, just in case.

NEWS
configure.ac
coregrind/m_replacemalloc/vg_replace_malloc.c

diff --git a/NEWS b/NEWS
index c3ee77d516aa9c28b2ff22bf42b1b57a68177bc0..da6f4f816ab70053d0308e6e4732030986a45a8f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -74,6 +74,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 473745  must-be-redirected function - strlen
 473870  FreeBSD 14 applications fail early at startup
 473944  Handle mold linker split RW PT_LOAD segments correctly
+474332  aligned_alloc under Valgrind returns nullptr when alignment is not a multiple of sizeof(void *)
 n-i-bz  Allow arguments with spaces in .valgrindrc files
 
 To see details of a given bug, visit
index e6c3f79956e196183004c6053b630d4bedb71e0a..d745497e80cb8d0c35f74c57064db3908f32444a 100755 (executable)
@@ -5424,6 +5424,26 @@ CXXFLAGS=$safe_CXXFLAGS
 AM_CONDITIONAL([HAVE_SHARED_POINTER_ANNOTATION],
                [test x$ac_have_shared_pointer_annotation = xyes])
 
+# checking for GNU libc C17 aligned_alloc
+# just check glibc version rather than trying to muck around
+# checking the runtime behaviour or seeing if it is a weak alias
+AC_MSG_CHECKING([for AT_GNU_LIBC_C17_ALIGNED_ALLOC])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <features.h>
+]], [[
+#if !defined(__GLIBC__) || __GLIBC__ != 2 || !defined(__GLIBC_MINOR__) || __GLIBC_MINOR__ < 38
+#error "not GNU libc 2.38 or later"
+#endif
+]])], [
+    AC_MSG_RESULT([yes])
+    AC_DEFINE([HAVE_GNU_LIBC_C17_ALIGNED_ALLOC], 1,
+              [Define to 1 if you have GNU libc C17 aligned_alloc.])
+
+], [
+    AC_MSG_RESULT([no])
+])
+
+
 
 #----------------------------------------------------------------------------
 # Ok.  We're done checking.
index 6c6f0d60f755ee477dfd773c102727c7bf93c044..23bd2657592da6aeb0b072f1391d8bf895a725a0 100644 (file)
@@ -2157,7 +2157,15 @@ extern int * __error(void) __attribute__((weak));
 #define VG_ALIGNED_ALLOC_NO_SIZE_ZERO 1
 #endif
 
-#if defined (VGO_linux) && !defined(MUSL_LIBC)
+#if defined (VGO_linux) && !defined(MUSL_LIBC) && !defined(HAVE_GNU_LIBC_C17_ALIGNED_ALLOC)
+
+/*
+ * Normally for GNU libc <= 2.37 aligned_alloc is a weak alias for memalign
+ * so this redir is not used.
+ * For libc 2.38 and later it is a separate function but then HAVE_GNU_LIBC_C17_ALIGNED_ALLOC
+ * should be true and this version doesn't get compiled.
+ * Leaving it here to be on the safe side.
+ */
 
  #define ALIGNED_ALLOC(soname, fnname) \
     \
@@ -2175,12 +2183,13 @@ extern int * __error(void) __attribute__((weak));
        VERIFY_ALIGNMENT(&aligned_alloc_info); \
        MALLOC_TRACE("aligned_alloc(al %llu, size %llu)", \
                 (ULong)alignment, (ULong)size ); \
-       /* Test whether the alignment argument is valid.  It must be \
-          a power of two multiple of sizeof (void *).  */ \
-       if (alignment == 0 \
-           || alignment % sizeof (void *) != 0 \
-           || (alignment & (alignment - 1)) != 0) \
-          return 0; \
+       \
+       /* Round up to minimum alignment if necessary. */ \
+       if (alignment < VG_MIN_MALLOC_SZB) \
+          alignment = VG_MIN_MALLOC_SZB; \
+       \
+       /* Round up to nearest power-of-two if necessary (like glibc). */ \
+       while (0 != (alignment & (alignment - 1))) alignment++; \
        \
        mem = (void*)VALGRIND_NON_SIMD_CALL3( info.tl_memalign, \
                  alignment, orig_alignment, size ); \
This page took 0.042842 seconds and 5 git commands to generate.