From 2a4f7d66b926bc58b6b5e87d227fd8f01b218ca0 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 11 Oct 2002 09:18:04 +0000 Subject: [PATCH] * 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. --- ChangeLog | 10 ++++++++++ elf/tst-tls8.c | 8 ++++---- sysdeps/generic/dl-tls.c | 5 ++++- 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 + + * 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 * 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; }