From 0948c3af9dfb3bc1312d6bed2f3a6bfd4e96eef4 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 5 Sep 2012 12:24:37 -0700 Subject: [PATCH] Always check dtv before freeing dtv[-1] --- ChangeLog | 7 +++++++ csu/libc-tls.c | 2 ++ elf/dl-tls.c | 2 -- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 08fa5a1608..7385bcb707 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-09-06 H.J. Lu + + [BZ #14545] + * csu/libc-tls.c (_dl_initial_dtv): New variable. + * elf/dl-tls.c (_dl_deallocate_tls): Always check dtv before + freeing dtv[-1]. + 2012-09-06 H.J. Lu [BZ #14544] diff --git a/csu/libc-tls.c b/csu/libc-tls.c index b00a5ccb9d..eb9c5025ff 100644 --- a/csu/libc-tls.c +++ b/csu/libc-tls.c @@ -65,6 +65,8 @@ size_t _dl_tls_static_size = 2048; size_t _dl_tls_static_used; /* Alignment requirement of the static TLS block. */ size_t _dl_tls_static_align; +/* Initial dtv of the main thread, not allocated with normal malloc. */ +void *_dl_initial_dtv = &static_dtv[1]; /* Generation counter for the dtv. */ size_t _dl_tls_generation; diff --git a/elf/dl-tls.c b/elf/dl-tls.c index 4138312b94..ff59e9e773 100644 --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -477,9 +477,7 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb) free (dtv[1 + cnt].pointer.val); /* The array starts with dtv[-1]. */ -#ifdef SHARED if (dtv != GL(dl_initial_dtv)) -#endif free (dtv - 1); if (dealloc_tcb) -- 2.43.5