7e7241f620
Upstream commit: 808a84a8b81468b517a4d721fdc62069cb8c211f - Fix underallocation of abort_msg_s struct (CVE-2025-0395) - x86/string: Fixup alignment of main loop in str{n}cmp-evex [BZ #32212] - x86: Improve large memset perf with non-temporal stores [RHEL-29312] - x86: Avoid integer truncation with large cache sizes (bug 32470) - math: Exclude internal math symbols for tests [BZ #32414] - malloc: add indirection for malloc(-like) functions in tests [BZ #32366] - Pass -nostdlib -nostartfiles together with -r [BZ #31753] - nptl: initialize cpu_id_start prior to rseq registration - nptl: initialize rseq area prior to registration
173 lines
5.8 KiB
Diff
173 lines
5.8 KiB
Diff
commit 51da74a97e0f024fd89b57304b3ab010a3cfaef1
|
|
Author: Sam James <sam@gentoo.org>
|
|
Date: Mon Dec 9 23:11:25 2024 +0000
|
|
|
|
malloc: add indirection for malloc(-like) functions in tests [BZ #32366]
|
|
|
|
GCC 15 introduces allocation dead code removal (DCE) for PR117370 in
|
|
r15-5255-g7828dc070510f8. This breaks various glibc tests which want
|
|
to assert various properties of the allocator without doing anything
|
|
obviously useful with the allocated memory.
|
|
|
|
Alexander Monakov rightly pointed out that we can and should do better
|
|
than passing -fno-malloc-dce to paper over the problem. Not least because
|
|
GCC 14 already does such DCE where there's no testing of malloc's return
|
|
value against NULL, and LLVM has such optimisations too.
|
|
|
|
Handle this by providing malloc (and friends) wrappers with a volatile
|
|
function pointer to obscure that we're calling malloc (et. al) from the
|
|
compiler.
|
|
|
|
Reviewed-by: Paul Eggert <eggert@cs.ucla.edu>
|
|
(cherry picked from commit a9944a52c967ce76a5894c30d0274b824df43c7a)
|
|
|
|
diff --git a/malloc/tst-aligned-alloc.c b/malloc/tst-aligned-alloc.c
|
|
index 91167d1392c0e626..b0f05a8fec78d5e8 100644
|
|
--- a/malloc/tst-aligned-alloc.c
|
|
+++ b/malloc/tst-aligned-alloc.c
|
|
@@ -25,6 +25,8 @@
|
|
#include <libc-diag.h>
|
|
#include <support/check.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
+
|
|
static int
|
|
do_test (void)
|
|
{
|
|
diff --git a/malloc/tst-compathooks-off.c b/malloc/tst-compathooks-off.c
|
|
index d0106f3fb74ff3b1..4cce6e5a8076f6b6 100644
|
|
--- a/malloc/tst-compathooks-off.c
|
|
+++ b/malloc/tst-compathooks-off.c
|
|
@@ -25,6 +25,8 @@
|
|
#include <support/check.h>
|
|
#include <support/support.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
+
|
|
extern void (*volatile __free_hook) (void *, const void *);
|
|
extern void *(*volatile __malloc_hook)(size_t, const void *);
|
|
extern void *(*volatile __realloc_hook)(void *, size_t, const void *);
|
|
diff --git a/malloc/tst-malloc-aux.h b/malloc/tst-malloc-aux.h
|
|
new file mode 100644
|
|
index 0000000000000000..54908b4a2464d510
|
|
--- /dev/null
|
|
+++ b/malloc/tst-malloc-aux.h
|
|
@@ -0,0 +1,41 @@
|
|
+/* Wrappers for malloc-like functions to allow testing the implementation
|
|
+ without optimization.
|
|
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
|
+ This file is part of the GNU C Library.
|
|
+
|
|
+ The GNU C Library is free software; you can redistribute it and/or
|
|
+ modify it under the terms of the GNU Lesser General Public License as
|
|
+ published by the Free Software Foundation; either version 2.1 of the
|
|
+ License, or (at your option) any later version.
|
|
+
|
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ Lesser General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU Lesser General Public
|
|
+ License along with the GNU C Library; see the file COPYING.LIB. If
|
|
+ not, see <https://www.gnu.org/licenses/>. */
|
|
+
|
|
+#ifndef TST_MALLOC_AUX_H
|
|
+#define TST_MALLOC_AUX_H
|
|
+
|
|
+#include <stddef.h>
|
|
+#include <stdlib.h>
|
|
+
|
|
+static void *(*volatile aligned_alloc_indirect)(size_t, size_t) = aligned_alloc;
|
|
+static void *(*volatile calloc_indirect)(size_t, size_t) = calloc;
|
|
+static void *(*volatile malloc_indirect)(size_t) = malloc;
|
|
+static void *(*volatile realloc_indirect)(void*, size_t) = realloc;
|
|
+
|
|
+#undef aligned_alloc
|
|
+#undef calloc
|
|
+#undef malloc
|
|
+#undef realloc
|
|
+
|
|
+#define aligned_alloc aligned_alloc_indirect
|
|
+#define calloc calloc_indirect
|
|
+#define malloc malloc_indirect
|
|
+#define realloc realloc_indirect
|
|
+
|
|
+#endif /* TST_MALLOC_AUX_H */
|
|
diff --git a/malloc/tst-malloc-check.c b/malloc/tst-malloc-check.c
|
|
index fde8863ad7561a71..cc88bff3b39a421c 100644
|
|
--- a/malloc/tst-malloc-check.c
|
|
+++ b/malloc/tst-malloc-check.c
|
|
@@ -20,6 +20,8 @@
|
|
#include <stdlib.h>
|
|
#include <libc-diag.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
+
|
|
static int errors = 0;
|
|
|
|
static void
|
|
diff --git a/malloc/tst-malloc-too-large.c b/malloc/tst-malloc-too-large.c
|
|
index 8e9e0d5fa2b4b907..2b91377e54cdc485 100644
|
|
--- a/malloc/tst-malloc-too-large.c
|
|
+++ b/malloc/tst-malloc-too-large.c
|
|
@@ -43,6 +43,7 @@
|
|
#include <unistd.h>
|
|
#include <sys/param.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
|
|
/* This function prepares for each 'too-large memory allocation' test by
|
|
performing a small successful malloc/free and resetting errno prior to
|
|
diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c
|
|
index f7a6e4654c374d01..68af399022543111 100644
|
|
--- a/malloc/tst-malloc.c
|
|
+++ b/malloc/tst-malloc.c
|
|
@@ -22,6 +22,8 @@
|
|
#include <libc-diag.h>
|
|
#include <time.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
+
|
|
static int errors = 0;
|
|
|
|
static void
|
|
diff --git a/malloc/tst-realloc.c b/malloc/tst-realloc.c
|
|
index f50499ecb114d574..74a28fb45ed80bf5 100644
|
|
--- a/malloc/tst-realloc.c
|
|
+++ b/malloc/tst-realloc.c
|
|
@@ -23,6 +23,8 @@
|
|
#include <libc-diag.h>
|
|
#include <support/check.h>
|
|
|
|
+#include "tst-malloc-aux.h"
|
|
+
|
|
static int
|
|
do_test (void)
|
|
{
|
|
diff --git a/support/support.h b/support/support.h
|
|
index ba21ec9b5add7c02..1a77f7979330d60c 100644
|
|
--- a/support/support.h
|
|
+++ b/support/support.h
|
|
@@ -113,7 +113,7 @@ void *xposix_memalign (size_t alignment, size_t n)
|
|
__attribute_malloc__ __attribute_alloc_align__ ((1))
|
|
__attribute_alloc_size__ ((2)) __attr_dealloc_free __returns_nonnull;
|
|
char *xasprintf (const char *format, ...)
|
|
- __attribute__ ((format (printf, 1, 2), malloc)) __attr_dealloc_free
|
|
+ __attribute__ ((format (printf, 1, 2), __malloc__)) __attr_dealloc_free
|
|
__returns_nonnull;
|
|
char *xstrdup (const char *) __attr_dealloc_free __returns_nonnull;
|
|
char *xstrndup (const char *, size_t) __attr_dealloc_free __returns_nonnull;
|
|
diff --git a/test-skeleton.c b/test-skeleton.c
|
|
index ae185a4f2821de00..690f26e7cf229622 100644
|
|
--- a/test-skeleton.c
|
|
+++ b/test-skeleton.c
|
|
@@ -27,7 +27,6 @@
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <getopt.h>
|
|
-#include <malloc.h>
|
|
#include <paths.h>
|
|
#include <search.h>
|
|
#include <signal.h>
|