Hello community, here is the log from the commit of package glibc for openSUSE:11.4 checked in at Tue Feb 22 17:28:18 CET 2011.
-------- --- old-versions/11.4/all/glibc/glibc.changes 2011-02-04 05:30:37.000000000 +0100 +++ 11.4/glibc/glibc.changes 2011-02-22 13:33:00.000000000 +0100 @@ -1,0 +2,6 @@ +Tue Feb 22 12:57:07 CET 2011 - [email protected] + +- Fix potential removal of required local scope from shared objects + marked as NODELETE [bnc#657627] + +------------------------------------------------------------------- calling whatdependson for 11.4-i586 Old: ---- minmem New: ---- glibc-elf-localscope.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glibc.spec ++++++ --- /var/tmp/diff_new_pack.MQ1rk9/_old 2011-02-22 17:27:48.000000000 +0100 +++ /var/tmp/diff_new_pack.MQ1rk9/_new 2011-02-22 17:27:48.000000000 +0100 @@ -64,7 +64,7 @@ Provides: rtld(GNU_HASH) AutoReqProv: on Version: 2.11.3 -Release: 4 +Release: 12.<RELEASE2> Url: http://www.gnu.org/software/libc/libc.html PreReq: filesystem BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -137,6 +137,7 @@ Patch49: glibc-fini-unwind.diff Patch50: glibc-gconvcache-s390.diff Patch51: glibc-vfprintf-positional.diff +Patch52: glibc-elf-localscope.diff Patch500: ARM_glibc-2.10.1-local-eabi-wchar.diff Patch501: ARM_glibc-2.10.1-local-hwcap-updates.diff Patch502: ARM_glibc-2.10.1-local-lowlevellock.diff @@ -355,6 +356,7 @@ %patch49 %patch50 %patch51 -p1 +%patch52 %ifarch %arm armv5tel armv7l %patch500 %patch501 ++++++ glibc-elf-localscope.diff ++++++ diff -ru elf~/dl-close.c elf/dl-close.c --- elf~/dl-close.c 2011-02-04 00:35:03.000000000 +0100 +++ elf/dl-close.c 2011-02-22 02:16:12.367883000 +0100 @@ -180,24 +186,28 @@ /* Signal the object is still needed. */ l->l_idx = IDX_STILL_USED; +#define mark_used(dmap) \ + do { \ + if ((dmap)->l_idx != IDX_STILL_USED) \ + { \ + assert ((dmap)->l_idx >= 0 && (dmap)->l_idx < nloaded); \ + \ + if (!used[(dmap)->l_idx]) \ + { \ + used[(dmap)->l_idx] = 1; \ + if ((dmap)->l_idx - 1 < done_index) \ + done_index = (dmap)->l_idx - 1; \ + } \ + } \ + } while (0) + /* Mark all dependencies as used. */ if (l->l_initfini != NULL) { struct link_map **lp = &l->l_initfini[1]; while (*lp != NULL) { - if ((*lp)->l_idx != IDX_STILL_USED) - { - assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded); - - if (!used[(*lp)->l_idx]) - { - used[(*lp)->l_idx] = 1; - if ((*lp)->l_idx - 1 < done_index) - done_index = (*lp)->l_idx - 1; - } - } - + mark_used(*lp); ++lp; } } @@ -206,19 +216,25 @@ for (unsigned int j = 0; j < l->l_reldeps->act; ++j) { struct link_map *jmap = l->l_reldeps->list[j]; - - if (jmap->l_idx != IDX_STILL_USED) - { - assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded); - - if (!used[jmap->l_idx]) - { - used[jmap->l_idx] = 1; - if (jmap->l_idx - 1 < done_index) - done_index = jmap->l_idx - 1; - } - } + mark_used(jmap); } + /* And the same for owners of our scopes; normally, our last + scope provider would render us unused, but this can be + prevented by the NODELETE flag. */ + if (__builtin_expect(l->l_type == lt_loaded + && (l->l_flags_1 & DF_1_NODELETE), 0)) + for (size_t cnt = 0; l->l_scope[cnt] != NULL; ++cnt) + /* This relies on l_scope[] entries being always set either + to its own l_symbolic_searchlist address, or some map's + l_searchlist address. */ + if (l->l_scope[cnt] != &l->l_symbolic_searchlist) + { + struct link_map *ls = (struct link_map *) + ((char *) l->l_scope[cnt] + - offsetof (struct link_map, l_searchlist)); + assert (ls->l_ns == nsid); + mark_used(ls); + } } /* Sort the entries. */ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
