about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-10-11 09:18:04 +0000
committerRoland McGrath <roland@gnu.org>2002-10-11 09:18:04 +0000
commit2a4f7d66b926bc58b6b5e87d227fd8f01b218ca0 (patch)
treead36dc09c3e28bb07170f23a8fde46ef7b0b8ef5
parentcfd8a63a1d2b2c28ea5741f76127c9347d686c2e (diff)
downloadglibc-2a4f7d66b926bc58b6b5e87d227fd8f01b218ca0.tar.gz
glibc-2a4f7d66b926bc58b6b5e87d227fd8f01b218ca0.tar.xz
glibc-2a4f7d66b926bc58b6b5e87d227fd8f01b218ca0.zip
* sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in
	now-unused dtv slot, reset the slot to TLS_DTV_UNALLOCATED.

	* elf/tls-macros.h [__x86_64__] (TLS_GD): Fix the sequence with the
	proper set of no-op insn prefixes.

	* elf/tst-tls8.c (do_test): Use %zd format for l_tls_modid members.
-rw-r--r--ChangeLog10
-rw-r--r--elf/tst-tls8.c8
-rw-r--r--sysdeps/generic/dl-tls.c5
3 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 082b332f42..f9d0630c30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2002-10-11  Roland McGrath  <roland@redhat.com>
+
+	* sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in
+	now-unused dtv slot, reset the slot to TLS_DTV_UNALLOCATED.
+
+	* elf/tls-macros.h [__x86_64__] (TLS_GD): Fix the sequence with the
+	proper set of no-op insn prefixes.
+
+	* elf/tst-tls8.c (do_test): Use %zd format for l_tls_modid members.
+
 2002-10-11  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/generic/pselect.c: Avoid unnecessary sigprocmask calls.
diff --git a/elf/tst-tls8.c b/elf/tst-tls8.c
index 971ee565cb..e300bc53d8 100644
--- a/elf/tst-tls8.c
+++ b/elf/tst-tls8.c
@@ -39,7 +39,7 @@ do_test (void)
 	modid1 = ((struct link_map *) h1)->l_tls_modid;
       else if (((struct link_map *) h1)->l_tls_modid != modid1)
 	{
-	  printf ("round %d: modid now %d, initially %d\n",
+	  printf ("round %d: modid now %zd, initially %d\n",
 		  i, ((struct link_map *) h1)->l_tls_modid, modid1);
 	  result = 1;
 	}
@@ -69,7 +69,7 @@ do_test (void)
 	modid2 = ((struct link_map *) h1)->l_tls_modid;
       else if (((struct link_map *) h1)->l_tls_modid != modid2)
 	{
-	  printf ("round %d: modid now %d, initially %d\n",
+	  printf ("round %d: modid now %zd, initially %d\n",
 		  i, ((struct link_map *) h1)->l_tls_modid, modid2);
 	  result = 1;
 	}
@@ -108,7 +108,7 @@ do_test (void)
 	 time.  The value of the first round is used.  */
       if (((struct link_map *) h1)->l_tls_modid != modid1)
 	{
-	  printf ("round %d: modid now %d, initially %d\n",
+	  printf ("round %d: modid now %zd, initially %d\n",
 		  i, ((struct link_map *) h1)->l_tls_modid, modid1);
 	  result = 1;
 	}
@@ -136,7 +136,7 @@ do_test (void)
 	 time.  The value of the first round is used.  */
       if (((struct link_map *) h1)->l_tls_modid != modid2)
 	{
-	  printf ("round %d: modid now %d, initially %d\n",
+	  printf ("round %d: modid now %zd, initially %d\n",
 		  i, ((struct link_map *) h1)->l_tls_modid, modid2);
 	  result = 1;
 	}
diff --git a/sysdeps/generic/dl-tls.c b/sysdeps/generic/dl-tls.c
index fe8f791638..a6428652cf 100644
--- a/sysdeps/generic/dl-tls.c
+++ b/sysdeps/generic/dl-tls.c
@@ -500,7 +500,10 @@ __tls_get_addr (GET_ADDR_ARGS)
 		      /* If this modid was used at some point the memory
 			 might still be allocated.  */
 		      if (dtv[total + cnt].pointer != TLS_DTV_UNALLOCATED)
-			free (dtv[total + cnt].pointer);
+			{
+			  free (dtv[total + cnt].pointer);
+			  dtv[total + cnt].pointer = TLS_DTV_UNALLOCATED;
+			}
 
 		      continue;
 		    }