diff options
author | Martin Schlemmer <azarah@gentoo.org> | 2005-03-15 21:50:18 +0000 |
---|---|---|
committer | Martin Schlemmer <azarah@gentoo.org> | 2005-03-15 21:50:18 +0000 |
commit | a37de0597be7242942676745a94f6fd921eae1e9 (patch) | |
tree | 7e3bf05100cc053618c77dbcda1909a2a0f42f9b /sys-libs | |
parent | Moved net-www/prozgui to www-client/prozgui (diff) | |
download | gentoo-2-a37de0597be7242942676745a94f6fd921eae1e9.tar.gz gentoo-2-a37de0597be7242942676745a94f6fd921eae1e9.tar.bz2 gentoo-2-a37de0597be7242942676745a94f6fd921eae1e9.zip |
Fix assert in _dl_next_tls_modid-assert (sysdeps/generic/dl-tls.c), bug #52374.
(Portage version: 2.0.51.19)
Diffstat (limited to 'sys-libs')
-rw-r--r-- | sys-libs/glibc/ChangeLog | 7 | ||||
-rw-r--r-- | sys-libs/glibc/files/2.3.4/glibc-2.3.4-fix-_dl_next_tls_modid-assert.patch | 268 | ||||
-rw-r--r-- | sys-libs/glibc/glibc-2.3.4.20050125.ebuild | 6 |
3 files changed, 279 insertions, 2 deletions
diff --git a/sys-libs/glibc/ChangeLog b/sys-libs/glibc/ChangeLog index 3613e250de74..59a601e2ad6f 100644 --- a/sys-libs/glibc/ChangeLog +++ b/sys-libs/glibc/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog for sys-libs/glibc # Copyright 2002-2005 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/ChangeLog,v 1.325 2005/03/15 20:00:21 eradicator Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/ChangeLog,v 1.326 2005/03/15 21:50:18 azarah Exp $ + + 15 Mar 2005; Martin Schlemmer <azarah@gentoo.org> + +files/2.3.4/glibc-2.3.4-fix-_dl_next_tls_modid-assert.patch, + glibc-2.3.4.20050125.ebuild: + Fix assert in _dl_next_tls_modid-assert (sysdeps/generic/dl-tls.c), bug #52374. 15 Mar 2005; Jeremy Huddleston <eradicator@gentoo.org> glibc-2.3.4.20050125-r1.ebuild: diff --git a/sys-libs/glibc/files/2.3.4/glibc-2.3.4-fix-_dl_next_tls_modid-assert.patch b/sys-libs/glibc/files/2.3.4/glibc-2.3.4-fix-_dl_next_tls_modid-assert.patch new file mode 100644 index 000000000000..212b2b1fcf00 --- /dev/null +++ b/sys-libs/glibc/files/2.3.4/glibc-2.3.4-fix-_dl_next_tls_modid-assert.patch @@ -0,0 +1,268 @@ +Gentoo bug #52374. +================== + +Note, this patch includes both: + +----- +2005-01-10 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Fix assertion and + recognition of last entry. +----- + +and: + +----- +2005-03-15 Jakub Jelinek <jakub@redhat.com> + + [BZ#786] + * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Handle + GL(dl_tls_static_nelem) == GL(dl_tls_max_dtv_idx). + * elf/Makefile: Add rules to build and run tst-tls15. + * elf/tst-tls15.c: New test. + * elf/tst-tlsmod15a.c: New file. + * elf/tst-tlsmod15b.c: New file. +----- + +================================================================================ +On Sun, Mar 13, 2005 at 09:39:04PM +0200, Martin Schlemmer wrote: +> Basically the issue above. This is valid for glibc 2.3.[234] if I did +> not miss anything. Here is a good test case: +> +> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=219352#msg122 +> +> I came up with attached patch that seems to work and passes all the +> tests (except for the one or two usual ones). Is this the correct fix, +> or are the problem deeper? +> +>--- glibc-2.3.4/sysdeps/generic/dl-tls.c.az 2005-03-13 19:26:55.000000000 +0200 +>+++ glibc-2.3.4/sysdeps/generic/dl-tls.c 2005-03-13 19:29:14.000000000 +0200 +>@@ -69,7 +69,10 @@ +> result = GL(dl_tls_static_nelem) + 1; +> /* If the following would not be true we mustn't have assumed +> there is a gap. */ +>- assert (result <= GL(dl_tls_max_dtv_idx)); +>+ /* The +1 is needed, as we add +1 above, but dl_tls_static_nelem +>+ is only once set as far as I can see in dl_main (elf/rtld.c), +>+ and that is equal to dl_tls_max_dtv_idx ... */ +>+ assert (result <= (GL(dl_tls_max_dtv_idx) + 1)); +> do +> { +> while (result - disp < runp->len) +>@@ -92,7 +95,8 @@ +> { +> /* The new index must indeed be exactly one higher than the +> previous high. */ +>- assert (result == GL(dl_tls_max_dtv_idx)); +>+ /* Once again +1 for the same reasons as above ... */ +>+ assert (result == (GL(dl_tls_max_dtv_idx) + 1)); +> +> /* There is no gap anymore. */ +> GL(dl_tls_dtv_gaps) = false; +> + +That patch certainly doesn't apply to neither HEAD nor glibc-2_3-branch, +see especially: +2005-01-10 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Fix assertion and + recognition of last entry. + +The fix can either be that dl-open.c only sets GL(dl_tls_dtv_gaps) +to true if GL(dl_tls_static_nelem) < GL(dl_tls_max_dtv_idx) +(if it is equal, there are certainly no gaps), or handling that case +in _dl_next_tls_modid. In _dl_next_tls_modid, the choices are either +to do what the patch below does, i.e. just clear GL(dl_tls_dtv_gaps) +if that happens, or just change the assert and let the do ... while +loop run, it shouldn't increment result anyway. + +2005-03-15 Jakub Jelinek <jakub@redhat.com> + + [BZ#786] + * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Handle + GL(dl_tls_static_nelem) == GL(dl_tls_max_dtv_idx). + * elf/Makefile: Add rules to build and run tst-tls15. + * elf/tst-tls15.c: New test. + * elf/tst-tlsmod15a.c: New file. + * elf/tst-tlsmod15b.c: New file. + +diff -urpN glibc-2.3.4.az/elf/Makefile glibc-2.3.4/elf/Makefile +--- glibc-2.3.4.az/elf/Makefile 2005-03-15 17:38:36.000000000 +0200 ++++ glibc-2.3.4/elf/Makefile 2005-03-15 17:39:07.000000000 +0200 +@@ -152,7 +152,7 @@ tests += loadtest restest1 preloadtest l + neededtest3 neededtest4 unload2 lateglobal initfirst global \ + restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \ + circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \ +- tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-align \ ++ tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 tst-align \ + $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \ + tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 + # reldep9 +@@ -182,6 +182,7 @@ modules-names = testobj1 testobj2 testob + tst-tlsmod5 tst-tlsmod6 tst-tlsmod7 tst-tlsmod8 \ + tst-tlsmod9 tst-tlsmod10 tst-tlsmod11 tst-tlsmod12 \ + tst-tlsmod13 tst-tlsmod13a tst-tlsmod14a tst-tlsmod14b \ ++ tst-tlsmod15a tst-tlsmod15b \ + circlemod1 circlemod1a circlemod2 circlemod2a \ + circlemod3 circlemod3a \ + reldep8mod1 reldep8mod2 reldep8mod3 \ +@@ -454,6 +455,7 @@ tst-tlsmod10.so-no-z-defs = yes + tst-tlsmod12.so-no-z-defs = yes + tst-tlsmod14a.so-no-z-defs = yes + tst-tlsmod14b.so-no-z-defs = yes ++tst-tlsmod15a.so-no-z-defs = yes + circlemod2.so-no-z-defs = yes + circlemod3.so-no-z-defs = yes + circlemod3a.so-no-z-defs = yes +@@ -664,8 +666,11 @@ $(objpfx)tst-tls12: $(objpfx)tst-tlsmod1 + $(objpfx)tst-tls13: $(libdl) + $(objpfx)tst-tls13.out: $(objpfx)tst-tlsmod13a.so + +-$(objpfx)tst-tls14: $(objpfx)tst-tlsmod14a.so $(libdl) +-$(objpfx)tst-tls14.out:$(objpfx)tst-tlsmod14b.so ++$(objpfx)tst-tls14: $(objpfx)tst-tlsmod14a.so $(libdl) ++$(objpfx)tst-tls14.out: $(objpfx)tst-tlsmod14b.so ++ ++$(objpfx)tst-tls15: $(libdl) ++$(objpfx)tst-tls15.out: $(objpfx)tst-tlsmod15a.so $(objpfx)tst-tlsmod15b.so + + CFLAGS-tst-align.c = $(stack-align-test-flags) + CFLAGS-tst-alignmod.c = $(stack-align-test-flags) +diff -urpN glibc-2.3.4.az/elf/tst-tls15.c glibc-2.3.4/elf/tst-tls15.c +--- glibc-2.3.4.az/elf/tst-tls15.c 1970-01-01 02:00:00.000000000 +0200 ++++ glibc-2.3.4/elf/tst-tls15.c 2005-03-15 17:39:07.000000000 +0200 +@@ -0,0 +1,32 @@ ++#include <dlfcn.h> ++#include <stdio.h> ++ ++static int ++do_test (void) ++{ ++ void *h = dlopen ("tst-tlsmod15a.so", RTLD_NOW); ++ if (h != NULL) ++ { ++ puts ("unexpectedly succeeded to open tst-tlsmod15a.so"); ++ exit (1); ++ } ++ ++ h = dlopen ("tst-tlsmod15b.so", RTLD_NOW); ++ if (h == NULL) ++ { ++ puts ("failed to open tst-tlsmod15b.so"); ++ exit (1); ++ } ++ ++ int (*fp) (void) = (int (*) (void)) dlsym (h, "in_dso"); ++ if (fp == NULL) ++ { ++ puts ("cannot find in_dso"); ++ exit (1); ++ } ++ ++ return fp (); ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff -urpN glibc-2.3.4.az/elf/tst-tlsmod15a.c glibc-2.3.4/elf/tst-tlsmod15a.c +--- glibc-2.3.4.az/elf/tst-tlsmod15a.c 1970-01-01 02:00:00.000000000 +0200 ++++ glibc-2.3.4/elf/tst-tlsmod15a.c 2005-03-15 17:39:07.000000000 +0200 +@@ -0,0 +1,6 @@ ++extern int nonexistent_dummy_var; ++int * ++foo (void) ++{ ++ return &nonexistent_dummy_var; ++} +diff -urpN glibc-2.3.4.az/elf/tst-tlsmod15b.c glibc-2.3.4/elf/tst-tlsmod15b.c +--- glibc-2.3.4.az/elf/tst-tlsmod15b.c 1970-01-01 02:00:00.000000000 +0200 ++++ glibc-2.3.4/elf/tst-tlsmod15b.c 2005-03-15 17:39:07.000000000 +0200 +@@ -0,0 +1,17 @@ ++#include "tst-tls10.h" ++ ++#ifdef USE_TLS__THREAD ++__thread int mod15b_var __attribute__((tls_model("initial-exec"))); ++ ++int ++in_dso (void) ++{ ++ return mod15b_var; ++} ++#else ++int ++in_dso (void) ++{ ++ return 0; ++} ++#endif +diff -urpN glibc-2.3.4.az/sysdeps/generic/dl-tls.c glibc-2.3.4/sysdeps/generic/dl-tls.c +--- glibc-2.3.4.az/sysdeps/generic/dl-tls.c 2005-03-15 17:40:56.000000000 +0200 ++++ glibc-2.3.4/sysdeps/generic/dl-tls.c 2005-03-15 17:39:07.000000000 +0200 +@@ -65,34 +65,35 @@ _dl_next_tls_modid (void) + /* Note that this branch will never be executed during program + start since there are no gaps at that time. Therefore it + does not matter that the dl_tls_dtv_slotinfo is not allocated +- yet when the function is called for the first times. */ +- result = GL(dl_tls_static_nelem) + 1; +- /* If the following would not be true we mustn't have assumed +- there is a gap. */ +- assert (result <= GL(dl_tls_max_dtv_idx)); +- do +- { +- while (result - disp < runp->len) +- { +- if (runp->slotinfo[result - disp].map == NULL) +- break; +- +- ++result; +- assert (result <= GL(dl_tls_max_dtv_idx) + 1); +- } ++ yet when the function is called for the first times. + +- if (result - disp < runp->len) +- break; +- +- disp += runp->len; +- } +- while ((runp = runp->next) != NULL); ++ NB: the offset +1 is due to the fact that DTV[0] is used ++ for something else. */ ++ result = GL(dl_tls_static_nelem) + 1; ++ if (result <= GL(dl_tls_max_dtv_idx)) ++ do ++ { ++ while (result - disp < runp->len) ++ { ++ if (runp->slotinfo[result - disp].map == NULL) ++ break; ++ ++ ++result; ++ assert (result <= GL(dl_tls_max_dtv_idx) + 1); ++ } ++ ++ if (result - disp < runp->len) ++ break; ++ ++ disp += runp->len; ++ } ++ while ((runp = runp->next) != NULL); + +- if (result >= GL(dl_tls_max_dtv_idx)) ++ if (result > GL(dl_tls_max_dtv_idx)) + { + /* The new index must indeed be exactly one higher than the + previous high. */ +- assert (result == GL(dl_tls_max_dtv_idx)); ++ assert (result == GL(dl_tls_max_dtv_idx) + 1); + + /* There is no gap anymore. */ + GL(dl_tls_dtv_gaps) = false; +@@ -577,7 +578,7 @@ __tls_get_addr (GET_ADDR_ARGS) + { + size_t cnt; + +- for (cnt = total = 0 ? 1 : 0; cnt < listp->len; ++cnt) ++ for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt) + { + size_t gen = listp->slotinfo[cnt].gen; + struct link_map *map; diff --git a/sys-libs/glibc/glibc-2.3.4.20050125.ebuild b/sys-libs/glibc/glibc-2.3.4.20050125.ebuild index a07c17e054ef..acaee76d551a 100644 --- a/sys-libs/glibc/glibc-2.3.4.20050125.ebuild +++ b/sys-libs/glibc/glibc-2.3.4.20050125.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/glibc-2.3.4.20050125.ebuild,v 1.32 2005/03/15 20:45:17 eradicator Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-libs/glibc/glibc-2.3.4.20050125.ebuild,v 1.33 2005/03/15 21:50:18 azarah Exp $ KEYWORDS="~amd64 ~mips ~sparc ~x86" @@ -1033,6 +1033,10 @@ src_unpack() { toolchain-glibc_src_unpack + # Fix assert in _dl_next_tls_modid-assert (sysdeps/generic/dl-tls.c), + # bug #52374. + epatch ${FILESDIR}/2.3.4/${PN}-2.3.4-fix-_dl_next_tls_modid-assert.patch + case $(tc-arch) in alpha) # Is this still needed? |