summaryrefslogtreecommitdiff
path: root/libpthread/nptl/allocatestack.c
diff options
context:
space:
mode:
authorMingxiang Lu <lu.mingxiang@h3c.com>2024-09-29 20:26:43 +0800
committerWaldemar Brodkorb <wbx@openadk.org>2024-10-30 12:07:59 +0100
commitf8028afeaffd727bc335681491b25a6f8fe51f4d (patch)
tree46d9d114ae33a3191b9f24e3278a92d25e452cde /libpthread/nptl/allocatestack.c
parent3e7f46572e4a2e12c8cae5f04b37f3ea30d41656 (diff)
fix TLS memory leak with dlopenHEADmaster
Signed-off-by: Mingxiang Lu <lu.mingxiang@h3c.com> Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org>
Diffstat (limited to 'libpthread/nptl/allocatestack.c')
-rw-r--r--libpthread/nptl/allocatestack.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/libpthread/nptl/allocatestack.c b/libpthread/nptl/allocatestack.c
index 7ef884543..941ef22f0 100644
--- a/libpthread/nptl/allocatestack.c
+++ b/libpthread/nptl/allocatestack.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <sys/mman.h>
#include <sys/param.h>
+#include <dl-tls.h>
#include <tls.h>
#include <lowlevellock.h>
#include <link.h>
@@ -241,6 +242,10 @@ get_cached_stack (size_t *sizep, void **memp)
/* Clear the DTV. */
dtv_t *dtv = GET_DTV (TLS_TPADJ (result));
+ for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
+ if (! dtv[1 + cnt].pointer.is_static
+ && dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
+ free (dtv[1 + cnt].pointer.val);
memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
/* Re-initialize the TLS. */