elf: Keep using minimal malloc after early DTV resize
(cherry picked from commit 9eae27b47fc8fcad542f939ee869f65e4405421c)
This commit is contained in:
parent
2b4695acd8
commit
e214ed3103
@ -0,0 +1,192 @@
|
||||
From aa3d7bd5299b33bffc118aa618b59bfa66059bcb Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Thu, 13 Feb 2025 21:56:52 +0100
|
||||
Subject: [PATCH] elf: Keep using minimal malloc after early DTV resize (bug
|
||||
32412)
|
||||
|
||||
If an auditor loads many TLS-using modules during startup, it is
|
||||
possible to trigger DTV resizing. Previously, the DTV was marked
|
||||
as allocated by the main malloc afterwards, even if the minimal
|
||||
malloc was still in use. With this change, _dl_resize_dtv marks
|
||||
the resized DTV as allocated with the minimal malloc.
|
||||
|
||||
The new test reuses TLS-using modules from other auditing tests.
|
||||
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
---
|
||||
elf/Makefile | 5 +++
|
||||
elf/dl-tls.c | 7 ++++
|
||||
elf/tst-audit-tlsdesc-dlopen2.c | 46 +++++++++++++++++++++++++
|
||||
elf/tst-auditmod-tlsdesc2.c | 59 +++++++++++++++++++++++++++++++++
|
||||
4 files changed, 117 insertions(+)
|
||||
create mode 100644 elf/tst-audit-tlsdesc-dlopen2.c
|
||||
create mode 100644 elf/tst-auditmod-tlsdesc2.c
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 5c833871d0..1ea0e7037e 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -379,6 +379,7 @@ tests += \
|
||||
tst-align3 \
|
||||
tst-audit-tlsdesc \
|
||||
tst-audit-tlsdesc-dlopen \
|
||||
+ tst-audit-tlsdesc-dlopen2 \
|
||||
tst-audit1 \
|
||||
tst-audit2 \
|
||||
tst-audit8 \
|
||||
@@ -863,6 +864,7 @@ modules-names += \
|
||||
tst-auditmanymod8 \
|
||||
tst-auditmanymod9 \
|
||||
tst-auditmod-tlsdesc \
|
||||
+ tst-auditmod-tlsdesc2 \
|
||||
tst-auditmod1 \
|
||||
tst-auditmod11 \
|
||||
tst-auditmod12 \
|
||||
@@ -3189,6 +3191,9 @@ $(objpfx)tst-audit-tlsdesc.out: $(objpfx)tst-auditmod-tlsdesc.so
|
||||
tst-audit-tlsdesc-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so
|
||||
$(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-auditmod-tlsdesc.so
|
||||
tst-audit-tlsdesc-dlopen-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so
|
||||
+$(objpfx)tst-audit-tlsdesc-dlopen2.out: $(objpfx)tst-auditmod-tlsdesc2.so \
|
||||
+ $(patsubst %, $(objpfx)%.so, $(tlsmod17a-modules))
|
||||
+tst-audit-tlsdesc-dlopen2-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc2.so
|
||||
|
||||
$(objpfx)tst-dlmopen-twice.out: \
|
||||
$(objpfx)tst-dlmopen-twice-mod1.so \
|
||||
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||
index 5178d9b66a..a083a82933 100644
|
||||
--- a/elf/dl-tls.c
|
||||
+++ b/elf/dl-tls.c
|
||||
@@ -566,6 +566,13 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid)
|
||||
if (newp == NULL)
|
||||
oom ();
|
||||
memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t));
|
||||
+#ifdef SHARED
|
||||
+ /* Auditors can trigger a DTV resize event while the full malloc
|
||||
+ is not yet in use. Mark the new DTV allocation as the
|
||||
+ initial allocation. */
|
||||
+ if (!__rtld_malloc_is_complete ())
|
||||
+ GL(dl_initial_dtv) = &newp[1];
|
||||
+#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
diff --git a/elf/tst-audit-tlsdesc-dlopen2.c b/elf/tst-audit-tlsdesc-dlopen2.c
|
||||
new file mode 100644
|
||||
index 0000000000..7ba2c4129a
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit-tlsdesc-dlopen2.c
|
||||
@@ -0,0 +1,46 @@
|
||||
+/* Loading TLS-using modules from auditors (bug 32412). Main program.
|
||||
+ Copyright (C) 2021-2025 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; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <support/xdlfcn.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ puts ("info: start of main program");
|
||||
+
|
||||
+ /* Load TLS-using modules, to trigger DTV resizing. The dynamic
|
||||
+ linker will load them again (requiring their own TLS) because the
|
||||
+ dlopen calls from the auditor were in the auditing namespace. */
|
||||
+ for (int i = 1; i <= 19; ++i)
|
||||
+ {
|
||||
+ char dso[30];
|
||||
+ snprintf (dso, sizeof (dso), "tst-tlsmod17a%d.so", i);
|
||||
+ char sym[30];
|
||||
+ snprintf (sym, sizeof(sym), "tlsmod17a%d", i);
|
||||
+
|
||||
+ void *handle = xdlopen (dso, RTLD_LAZY);
|
||||
+ int (*func) (void) = xdlsym (handle, sym);
|
||||
+ /* Trigger TLS allocation. */
|
||||
+ func ();
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod-tlsdesc2.c b/elf/tst-auditmod-tlsdesc2.c
|
||||
new file mode 100644
|
||||
index 0000000000..50275cd34d
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod-tlsdesc2.c
|
||||
@@ -0,0 +1,59 @@
|
||||
+/* Loading TLS-using modules from auditors (bug 32412). Audit module.
|
||||
+ Copyright (C) 2021-2025 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; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+#include <link.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <stdio.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ /* Open some modules, to trigger DTV resizing before the switch to
|
||||
+ the main malloc. */
|
||||
+ for (int i = 1; i <= 19; ++i)
|
||||
+ {
|
||||
+ char dso[30];
|
||||
+ snprintf (dso, sizeof (dso), "tst-tlsmod17a%d.so", i);
|
||||
+ char sym[30];
|
||||
+ snprintf (sym, sizeof(sym), "tlsmod17a%d", i);
|
||||
+
|
||||
+ void *handle = dlopen (dso, RTLD_LAZY);
|
||||
+ if (handle == NULL)
|
||||
+ {
|
||||
+ printf ("error: dlmopen from auditor: %s\n", dlerror ());
|
||||
+ fflush (stdout);
|
||||
+ _exit (1);
|
||||
+ }
|
||||
+ int (*func) (void) = dlsym (handle, sym);
|
||||
+ if (func == NULL)
|
||||
+ {
|
||||
+ printf ("error: dlsym from auditor: %s\n", dlerror ());
|
||||
+ fflush (stdout);
|
||||
+ _exit (1);
|
||||
+ }
|
||||
+ /* Trigger TLS allocation. */
|
||||
+ func ();
|
||||
+ }
|
||||
+
|
||||
+ puts ("info: TLS-using modules loaded from auditor");
|
||||
+ fflush (stdout);
|
||||
+
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -67,7 +67,7 @@
|
||||
##############################################################################
|
||||
Name: glibc
|
||||
Version: 2.38
|
||||
Release: 54
|
||||
Release: 55
|
||||
Summary: The GNU libc libraries
|
||||
License: %{all_license}
|
||||
URL: http://www.gnu.org/software/glibc/
|
||||
@ -267,6 +267,7 @@ Patch177: elf-Avoid-some-free-NULL-calls-in-_dl_update_slotinf.patch
|
||||
Patch178: elf-Support-recursive-use-of-dynamic-TLS-in-interpos.patch
|
||||
Patch179: Fix-underallocation-of-abort_msg_s-struct-CVE-2025-0.patch
|
||||
Patch180: stdlib-Test-using-setenv-with-updated-environ-BZ-325.patch
|
||||
Patch181: backport-elf-Keep-using-minimal-malloc-after-early-DTV-resize.patch
|
||||
|
||||
#openEuler patch list
|
||||
Patch9000: turn-default-value-of-x86_rep_stosb_threshold_form_2K_to_1M.patch
|
||||
@ -1491,6 +1492,9 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Sat Mar 08 2025 shixuantong <shixuantong1@huawei.com> - 2.38-55
|
||||
- elf: Keep using minimal malloc after early DTV resize
|
||||
|
||||
* Tue Feb 18 2025 shixuantong <shixuantong1@huawei.com> - 2.38-54
|
||||
- glibc testcase use newly built ld.so instead of environment default installed ld.so
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user