This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, ibm/2.13/master, updated. glibc-2.13-22-g381c661
- From: rsa at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 3 May 2011 22:36:18 -0000
- Subject: GNU C Library master sources branch, ibm/2.13/master, updated. glibc-2.13-22-g381c661
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, ibm/2.13/master has been updated
via 381c66161e9a98efb1903d10197fbc2122746f08 (commit)
from 1fe05ea95e1460e5e1cf1568a8ce3982f0f02de6 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=381c66161e9a98efb1903d10197fbc2122746f08
commit 381c66161e9a98efb1903d10197fbc2122746f08
Author: Alan Modra <amodra@gmail.com>
Date: Tue May 3 17:35:24 2011 -0500
Static TLS memory leak fix (DTV case)
diff --git a/ChangeLog b/ChangeLog
index 5913162..189187b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-03-15 Alan Modra <amodra@gmail.com>
+
+ * elf/dl-reloc.c (_dl_try_allocate_static_tls <TLS_DTV_AT_TP>): Handle
+ l_tls_firstbyte_offset non-zero. Save padding offset in
+ l_tls_firstbyte_offset for later use. Add debug print.
+ * elf/dl-close.c (_dl_close_worker <TLS_DTV_AT_TP>): Correct code
+ freeing static tls block. Add debug print.
+ * elf/fl-tls.c (_dl_determine_tlsoffset): Add debug print.
+
2011-05-03 Ryan S. Arnold <rsa@us.ibm.com>
* sysdeps/powerpc/powerpc64/Makefile (CFLAGS-initfini.s): Add
diff --git a/elf/dl-close.c b/elf/dl-close.c
index efb2b58..fa32591 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -591,25 +591,51 @@ _dl_close_worker (struct link_map *map)
}
}
#elif TLS_DTV_AT_TP
- if ((size_t) imap->l_tls_offset == tls_free_end)
+ if (tls_free_start == NO_TLS_OFFSET)
+ {
+ tls_free_start = imap->l_tls_firstbyte_offset;
+ tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
+ }
+ else if (imap->l_tls_firstbyte_offset == tls_free_end)
/* Extend the contiguous chunk being reclaimed. */
- tls_free_end -= imap->l_tls_blocksize;
+ tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
else if (imap->l_tls_offset + imap->l_tls_blocksize
== tls_free_start)
/* Extend the chunk backwards. */
- tls_free_start = imap->l_tls_offset;
- else
+ tls_free_start = imap->l_tls_firstbyte_offset;
+
+ /* This isn't contiguous with the last chunk freed.
+ One of them will be leaked unless we can free
+ one block right away. */
+ else if (imap->l_tls_offset + imap->l_tls_blocksize
+ == GL(dl_tls_static_used))
+ GL(dl_tls_static_used) = imap->l_tls_firstbyte_offset;
+ else if (tls_free_end == GL(dl_tls_static_used))
{
- /* This isn't contiguous with the last chunk freed.
- One of them will be leaked. */
- if (tls_free_end == GL(dl_tls_static_used))
- GL(dl_tls_static_used) = tls_free_start;
- tls_free_start = imap->l_tls_offset;
- tls_free_end = tls_free_start + imap->l_tls_blocksize;
+ GL(dl_tls_static_used) = tls_free_start;
+ tls_free_start = imap->l_tls_firstbyte_offset;
+ tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
+ }
+ else if (tls_free_end < imap->l_tls_firstbyte_offset)
+ {
+ /* We pick the later block. It has a chance to
+ be freed. */
+ tls_free_start = imap->l_tls_firstbyte_offset;
+ tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
}
#else
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif
+ if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
+ _dl_debug_printf ("\nstatic tls free: %s\n"
+ " tls_free_start = %Zu, "
+ "tls_free_end = %Zu, "
+ "dl_tls_static_used = %Zu\n",
+ imap->l_name[0] ? imap->l_name
+ : rtld_progname,
+ tls_free_start, tls_free_end,
+ GL(dl_tls_static_used));
+
}
}
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 23cb59c..9d07fd6 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -77,23 +77,33 @@ _dl_try_allocate_static_tls (struct link_map *map)
map->l_tls_offset = GL(dl_tls_static_used) = offset;
#elif TLS_DTV_AT_TP
+ size_t offset;
size_t used;
- size_t check;
- size_t offset = roundup (GL(dl_tls_static_used), map->l_tls_align);
- used = offset + map->l_tls_blocksize;
- check = used;
/* dl_tls_static_used includes the TCB at the beginning. */
+ offset = (((GL(dl_tls_static_used)
+ - map->l_tls_firstbyte_offset
+ + map->l_tls_align - 1) & -map->l_tls_align)
+ + map->l_tls_firstbyte_offset);
+ used = offset + map->l_tls_blocksize;
- if (check > GL(dl_tls_static_size))
+ if (used > GL(dl_tls_static_size))
goto fail;
map->l_tls_offset = offset;
+ map->l_tls_firstbyte_offset = GL(dl_tls_static_used);
GL(dl_tls_static_used) = used;
#else
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif
+ if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
+ _dl_debug_printf ("\nstatic tls: %s\n"
+ " l_tls_offset = %Zu, l_tls_firstbyte_offset = %Zu,"
+ " dl_tls_static_used = %Zu\n",
+ map->l_name[0] ? map->l_name : rtld_progname,
+ map->l_tls_offset, map->l_tls_firstbyte_offset,
+ GL(dl_tls_static_used));
/* If the object is not yet relocated we cannot initialize the
static TLS region. Delay it. */
if (map->l_real->l_relocated)
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index ea94aa0..5c25bac 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -246,6 +246,11 @@ _dl_determine_tlsoffset (void)
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif
+ if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
+ _dl_debug_printf ("\ninitial static tls: "
+ "dl_tls_static_used = %Zu, dl_tls_status_size = %Zu\n",
+ GL(dl_tls_static_used), GL(dl_tls_static_size));
+
/* The alignment requirement for the static TLS block. */
GL(dl_tls_static_align) = max_align;
}
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 9 +++++++++
elf/dl-close.c | 46 ++++++++++++++++++++++++++++++++++++----------
elf/dl-reloc.c | 20 +++++++++++++++-----
elf/dl-tls.c | 5 +++++
4 files changed, 65 insertions(+), 15 deletions(-)
hooks/post-receive
--
GNU C Library master sources