From 12bd6e4687c884e7ec003196523ce28207e4491d Mon Sep 17 00:00:00 2001 From: shixuantong Date: Sat, 8 Mar 2025 09:04:40 +0800 Subject: [PATCH] elf: Keep using minimal malloc after early DTV resize (cherry picked from commit 9eae27b47fc8fcad542f939ee869f65e4405421c) --- ...inimal-malloc-after-early-DTV-resize.patch | 192 ++++++++++++++++++ glibc.spec | 6 +- 2 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 backport-elf-Keep-using-minimal-malloc-after-early-DTV-resize.patch diff --git a/backport-elf-Keep-using-minimal-malloc-after-early-DTV-resize.patch b/backport-elf-Keep-using-minimal-malloc-after-early-DTV-resize.patch new file mode 100644 index 0000000..a7fafdb --- /dev/null +++ b/backport-elf-Keep-using-minimal-malloc-after-early-DTV-resize.patch @@ -0,0 +1,192 @@ +From aa3d7bd5299b33bffc118aa618b59bfa66059bcb Mon Sep 17 00:00:00 2001 +From: Florian Weimer +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 +--- + 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 ++ . */ ++ ++#include ++#include ++ ++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 +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 ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++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 + diff --git a/glibc.spec b/glibc.spec index 8d9af15..db4929e 100644 --- a/glibc.spec +++ b/glibc.spec @@ -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 - 2.38-55 +- elf: Keep using minimal malloc after early DTV resize + * Tue Feb 18 2025 shixuantong - 2.38-54 - glibc testcase use newly built ld.so instead of environment default installed ld.so -- Gitee