This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]