Always check dtv before freeing dtv[-1]
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 5 Sep 2012 19:24:37 +0000 (12:24 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 6 Sep 2012 18:51:52 +0000 (11:51 -0700)
ChangeLog
csu/libc-tls.c
elf/dl-tls.c

index 08fa5a1..7385bcb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2012-09-06  H.J. Lu  <hongjiu.lu@intel.com>
 
+       [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  <hongjiu.lu@intel.com>
+
        [BZ #14544]
        * Makeconfig (link-static-before-libc): Replace $(+prector)
        with $(+prectorT).
index b00a5cc..eb9c502 100644 (file)
@@ -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;
index 4138312..ff59e9e 100644 (file)
@@ -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)