Hello community, here is the log from the commit of package glibc checked in at Fri Apr 20 16:01:01 CEST 2007. -------- --- glibc/glibc.changes 2007-03-25 10:01:24.000000000 +0200 +++ /mounts/work_src_done/STABLE/glibc/glibc.changes 2007-04-20 13:30:46.000000000 +0200 @@ -1,0 +2,23 @@ +Fri Apr 20 13:13:52 CEST 2007 - dmueller@suse.de + +- only keep symtab for libpthread* + +------------------------------------------------------------------- +Thu Apr 19 23:22:35 CEST 2007 - pbaudis@suse.cz + +- Fix strtod() exponent limit calculations [#230909] +- Fix random nscd crashes under very heavy passwd/group queries + load [#192391] +- Add some enums from CVS to sys/personality.h [#253710] +- Fix pthread_atfork()-induced hangs in threaded programs [#256237] +- Fix llrintl() on ppc64 [#241183] +- Fix makecontext() segfault [#249780] +- Fix potential dladdr() breakage [#241464] +- Fix some races in client programs with nscd garbage collection [#252138] + +------------------------------------------------------------------- +Fri Mar 30 02:54:06 CEST 2007 - pbaudis@suse.cz + +- Update localtime during timezone update [#239888] + +------------------------------------------------------------------- New: ---- glibc-2.5-dladdr.diff glibc-2.5-makecontext.diff glibc-2.5-nptl-forkref.diff glibc-2.5-nscd-gc-clientraces.diff glibc-2.5-nscd-getpwnam.diff glibc-2.5-personality.diff glibc-2.5-ppc-llrintl.diff glibc-2.5-strtod.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glibc.spec ++++++ --- /var/tmp/diff_new_pack.T30361/_old 2007-04-20 16:00:41.000000000 +0200 +++ /var/tmp/diff_new_pack.T30361/_new 2007-04-20 16:00:41.000000000 +0200 @@ -26,7 +26,7 @@ Obsoletes: ngpt ngpt-devel Autoreqprov: on Version: 2.5 -Release: 39 +Release: 42 %define snapshot_date 2006101200 URL: http://www.gnu.org/software/libc/libc.html PreReq: filesystem @@ -76,6 +76,14 @@ Patch34: glibc-2.5-ldconfig-old-cache.diff Patch35: glibc-2.5-mallopt.diff Patch36: timezone.diff +Patch37: glibc-2.5-strtod.diff +Patch38: glibc-2.5-nscd-getpwnam.diff +Patch39: glibc-2.5-personality.diff +Patch40: glibc-2.5-dladdr.diff +Patch41: glibc-2.5-makecontext.diff +Patch42: glibc-2.5-nscd-gc-clientraces.diff +Patch43: glibc-2.5-ppc-llrintl.diff +Patch44: glibc-2.5-nptl-forkref.diff %description The GNU C Library provides the most important standard libraries used @@ -241,6 +249,14 @@ %patch34 %patch35 %patch36 +%patch37 +%patch38 +%patch39 +%patch40 +%patch41 +%patch42 +%patch43 +%patch44 %patch5 find . -name configure | xargs touch @@ -394,7 +410,7 @@ # should be enabled. These symbols are _not_ exported, and we can't easily # export them retroactively without changing the API. So we have to # continue to "export" them via .symtab, instead of .dynsym :-( -export STRIP_KEEP_SYMTAB=yes +export STRIP_KEEP_SYMTAB=libpthread* # Make sure we will create the gconv-modules.cache mkdir -p $RPM_BUILD_ROOT%{_libdir}/gconv touch $RPM_BUILD_ROOT%{_libdir}/gconv/gconv-modules.cache @@ -592,6 +608,17 @@ %postun info %install_info_delete --info-dir=%{_infodir} %{_infodir}/libc.info.gz +%post -n timezone +if [ -f /etc/sysconfig/clock ]; +then + . /etc/sysconfig/clock + if [ -n "$TIMEZONE" -a -f /etc/localtime -a -f /usr/share/zoneinfo/$TIMEZONE ]; then + cp /usr/share/zoneinfo/$TIMEZONE /etc/localtime + else + [ -f /etc/localtime ] && echo "WARNING: Not updating /etc/localtime with new zone file" >&2 + fi +fi + %preun -n nscd %stop_on_removal nscd @@ -905,6 +932,20 @@ %{_libdir}/libdl_p.a %changelog +* Fri Apr 20 2007 - dmueller@suse.de +- only keep symtab for libpthread* +* Thu Apr 19 2007 - pbaudis@suse.cz +- Fix strtod() exponent limit calculations [#230909] +- Fix random nscd crashes under very heavy passwd/group queries + load [#192391] +- Add some enums from CVS to sys/personality.h [#253710] +- Fix pthread_atfork()-induced hangs in threaded programs [#256237] +- Fix llrintl() on ppc64 [#241183] +- Fix makecontext() segfault [#249780] +- Fix potential dladdr() breakage [#241464] +- Fix some races in client programs with nscd garbage collection [#252138] +* Fri Mar 30 2007 - pbaudis@suse.cz +- Update localtime during timezone update [#239888] * Sun Mar 25 2007 - olh@suse.de - temporary disable powerpc cputuned libs to reduce turnaround time * Fri Feb 09 2007 - pbaudis@suse.cz ++++++ glibc-2.5-dladdr.diff ++++++ elf/dl-addr.c : (_dl_addr) : Ensure the addres lies in one of the segments loaded for a lib. Sometimes, an entirely unrelated map (say libB) can be allocated in between the mapped segments of a lib (say libA). So, in these cases the _dl_addr for an address within libB, would return libA as the result. We fix this by ensuring that the address falls *IN ANY* of the loaded segments. Index: glibc-2.5/elf/dl-addr.c =================================================================== --- elf/dl-addr.c 2006-08-27 15:49:04.000000000 -0700 +++ elf/dl-addr.c 2007-02-27 15:34:27.000000000 -0800 @@ -28,6 +28,7 @@ struct link_map **mapp, const ElfW(Sym) **symbolp) { const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address); + int result = 0; /* Protect against concurrent loads and unloads. */ __rtld_lock_lock_recursive (GL(dl_load_lock)); @@ -39,24 +40,26 @@ if (addr >= l->l_map_start && addr < l->l_map_end) { /* We know ADDRESS lies within L if in any shared object. - Make sure it isn't past the end of L's segments. */ - size_t n = l->l_phnum; - if (n > 0) + Make sure it lies within one of L's segments. */ + int n = l->l_phnum; + while (--n >= 0) { - do - --n; - while (l->l_phdr[n].p_type != PT_LOAD); - if (addr >= (l->l_addr + - l->l_phdr[n].p_vaddr + l->l_phdr[n].p_memsz)) - /* Off the end of the highest-addressed shared object. */ + if (l->l_phdr[n].p_type != PT_LOAD) continue; + if ((addr >= l->l_addr + + l->l_phdr[n].p_vaddr) && + (addr < l->l_addr + + l->l_phdr[n].p_vaddr + l->l_phdr[n].p_memsz)) + { + match = l; + goto found_match; + } } - match = l; - break; } - int result = 0; +found_match: + if (match != NULL) { /* Now we know what object the address lies in. */ ++++++ glibc-2.5-makecontext.diff ++++++ 2006-12-19 Jakub Jelinek <jakub@redhat.com> * stdlib/Makefile (tests): Add tst-makecontext. * stdlib/tst-makecontext.c: New test. * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S (__makecontext): Don't realign uc_mcontext.uc_regs. 2006-12-13 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include kernel-features.h. diff -urN glibc-2.4-sles10GA/stdlib/Makefile glibc-2.4-sles10GA-patched/stdlib/Makefile --- stdlib/Makefile 2006-02-28 03:55:21.000000000 -0600 +++ stdlib/Makefile 2007-03-14 11:17:31.566057264 -0500 @@ -66,7 +66,8 @@ test-canon test-canon2 tst-strtoll tst-environ \ tst-xpg-basename tst-random tst-random2 tst-bsearch \ tst-limits tst-rand48 bug-strtod tst-setcontext \ - test-a64l tst-qsort tst-system testmb2 bug-strtod2 + test-a64l tst-qsort tst-system testmb2 bug-strtod2 \ + test-makecontext include ../Makeconfig diff -urN glibc-2.4-sles10GA/stdlib/tst-makecontext.c glibc-2.4-sles10GA-patched/stdlib/tst-makecontext.c --- stdlib/tst-makecontext.c Wed Dec 31 18:00:00 1969 +++ stdlib/tst-makecontext.c Wed Mar 14 11:15:53 2007 @@ -0,0 +1,67 @@ +/* Copyright (C) 2006, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <ucontext.h> + +ucontext_t ucp; +char st1[8192]; +__thread int thr; + +void +cf (int i) +{ + if (i != 78 || thr != 94) + { + printf ("i %d thr %d\n", i, thr); + exit (1); + } + exit (0); +} + +int +do_test (void) +{ + if (getcontext (&ucp) != 0) + { + if (errno == ENOSYS) + { + puts ("context handling not supported"); + return 0; + } + + puts ("getcontext failed"); + return 1; + } + thr = 94; + ucp.uc_link = NULL; + ucp.uc_stack.ss_sp = st1; + ucp.uc_stack.ss_size = sizeof st1; + makecontext (&ucp, (void (*) (void)) cf, 1, 78); + if (setcontext (&ucp) != 0) + { + puts ("setcontext failed"); + return 1; + } + return 2; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff -urN glibc-2.4-sles10GA/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S glibc-2.4-sles10GA-patched/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S --- sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S 2006-01-07 01:11:17.000000000 -0600 +++ sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S 2007-03-14 11:15:53.553047320 -0500 @@ -26,9 +26,7 @@ ENTRY(__makecontext) /* Set up the first 7 args to the function in its registers */ - addi r11,r3,_UC_REG_SPACE+12 - clrrwi r11,r11,4 - stw r11,_UC_REGS_PTR(r3) + lwz r11,_UC_REGS_PTR(r3) stw r6,_UC_GREGS+(PT_R3*4)(r11) stw r7,_UC_GREGS+(PT_R4*4)(r11) stw r8,_UC_GREGS+(PT_R5*4)(r11) diff -urN glibc-2.4-sles10GA/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S glibc-2.4-sles10GA-patched/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S --- sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S 2006-01-05 02:11:09.000000000 -0600 +++ sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S 2007-03-14 11:15:53.554047168 -0500 @@ -1,5 +1,5 @@ /* Jump to a new context. - Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,6 +20,7 @@ #include <sysdep.h> #include <rtld-global-offsets.h> #include <shlib-compat.h> +#include <kernel-features.h> #define __ASSEMBLY__ #include <asm/ptrace.h> ++++++ glibc-2.5-nptl-forkref.diff ++++++ nptl/sysdeps/unix/sysv/linux/fork.c : __libc_fork() Reset the refcntr for the fork-handlers in the child process to 1. The refcntr may have been bumped up by the *OTHER* thread(s) doing a fork() in the parent process. This would leave the child with an incorrect refcntr for the fork-handlers leading us to wait for non-existing threads to drop the refcntr while doing __unregister_atfork(). Since there is only one thread in the child process, we reset it to 1, to reflect the actual count. Index: libc/nptl/sysdeps/unix/sysv/linux/fork.c =================================================================== --- nptl/sysdeps/unix/sysv/linux/fork.c 2003-12-20 15:37:13.000000000 -0800 +++ nptl/sysdeps/unix/sysv/linux/fork.c 2007-02-23 12:25:45.000000000 -0800 @@ -167,8 +167,12 @@ allp->handler->child_handler (); /* Note that we do not have to wake any possible waiter. - This is the only thread in the new process. */ - --allp->handler->refcntr; + This is the only thread in the new process. + The count may have been bumped up by the other threads in + the parent, doing a fork. We reset it to 1, to avoid waiting + for non-existing thread(s) to release the count. + */ + allp->handler->refcntr = 1; /* XXX We could at this point look through the object pool and mark all objects not on the __fork_handlers list as ++++++ glibc-2.5-nscd-gc-clientraces.diff ++++++ ++++ 1117 lines (skipped) ++++++ glibc-2.5-nscd-getpwnam.diff ++++++ diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index 010cf0c..56e4759 100644 --- nscd/pwdcache.c +++ nscd/pwdcache.c @@ -271,6 +271,7 @@ cache_addpw (struct database_dyn *db, in { /* Adjust pointer into the memory block. */ cp = (char *) newp + (cp - (char *) dataset); + key_copy = (char *) newp + (key_copy - (char *) dataset); dataset = memcpy (newp, dataset, total + n); alloca_used = false; diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 54d1ef1..3852e8c 100644 --- nscd/grpcache.c +++ nscd/grpcache.c @@ -279,6 +279,7 @@ cache_addgr (struct database_dyn *db, in /* Adjust pointers into the memory block. */ gr_name = (char *) newp + (gr_name - (char *) dataset); cp = (char *) newp + (cp - (char *) dataset); + key_copy = (char *) newp + (key_copy - (char *) dataset); dataset = memcpy (newp, dataset, total + n); alloca_used = false; ++++++ glibc-2.5-personality.diff ++++++ --- sysdeps/unix/sysv/linux/sys/personality.h- 2007-03-15 03:55:27.946448000 +0100 +++ sysdeps/unix/sysv/linux/sys/personality.h 2007-03-15 03:55:47.106273000 +0100 @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,7 +16,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* Taken verbatim from Linux 2.4 (include/linux/personality.h). */ +/* Taken verbatim from Linux 2.6 (include/linux/personality.h). */ #ifndef _SYS_PERSONALITY_H #define _SYS_PERSONALITY_H 1 @@ -27,11 +27,14 @@ These occupy the top three bytes. */ enum { + ADDR_NO_RANDOMIZE = 0x0040000, + FDPIC_FUNCPTRS = 0x0080000, MMAP_PAGE_ZERO = 0x0100000, ADDR_LIMIT_32BIT = 0x0800000, SHORT_INODE = 0x1000000, WHOLE_SECONDS = 0x2000000, STICKY_TIMEOUTS = 0x4000000, + ADDR_LIMIT_3GB = 0x8000000 }; /* Personality types. @@ -52,6 +55,7 @@ PER_SUNOS = 0x0006 | STICKY_TIMEOUTS, PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE, PER_LINUX32 = 0x0008, + PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB, PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS, /* IRIX5 32-bit */ PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS, /* IRIX6 new 32-bit */ PER_IRIX64 = 0x000b | STICKY_TIMEOUTS, /* IRIX6 64-bit */ ++++++ glibc-2.5-ppc-llrintl.diff ++++++ diff -urN dummy-cpu/powerpc-cpu-v0.05/sysdeps/powerpc/powerpc32/powerpc64/fpu/s_llrint.S libc25/powerpc-cpu/sysdeps/powerpc/powerpc32/powerpc64/fpu/s_llrint.S --- powerpc-cpu-v0.05/sysdeps/powerpc/powerpc32/powerpc64/fpu/s_llrint.S 2006-04-06 10:50:35.000000000 -0500 +++ powerpc-cpu/sysdeps/powerpc/powerpc32/powerpc64/fpu/s_llrint.S 2007-03-14 14:55:19.113013712 -0500 @@ -18,6 +18,7 @@ 02110-1301 USA. */ #include <sysdep.h> +#include <math_ldbl_opt.h> /* long long int[r3, r4] __llrint (double x[fp1]) */ ENTRY (__llrint) @@ -41,3 +42,6 @@ strong_alias (__llrint, __llrintl) weak_alias (__llrint, llrintl) #endif +#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) +compat_symbol (libm, __llrint, llrintl, GLIBC_2_1) +#endif ++++++ glibc-2.5-strtod.diff ++++++ http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/strtod_l.c.diff?cvsroot... =================================================================== RCS file: /cvs/glibc/libc/stdlib/strtod_l.c,v retrieving revision 1.14 retrieving revision 1.14.2.1 diff -u -r1.14 -r1.14.2.1 --- stdlib/strtod_l.c 2006/01/14 12:09:09 1.14 +++ stdlib/strtod_l.c 2007/01/12 18:07:19 1.14.2.1 @@ -662,20 +662,20 @@ /* If no other digit but a '0' is found the result is 0.0. Return current read pointer. */ - if ((c < L_('0') || c > L_('9')) - && (base == 16 && (c < (CHAR_TYPE) TOLOWER (L_('a')) - || c > (CHAR_TYPE) TOLOWER (L_('f')))) + if (!((c >= L_('0') && c <= L_('9')) + || (base == 16 && ((CHAR_TYPE) TOLOWER (c) >= L_('a') + && (CHAR_TYPE) TOLOWER (c) <= L_('f'))) #ifdef USE_WIDE_CHAR - && c != (wint_t) decimal + || c == (wint_t) decimal #else - && ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + || ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) if (decimal[cnt] != cp[cnt]) break; - decimal[cnt] != '\0'; }) + decimal[cnt] == '\0'; }) #endif - && (base == 16 && (cp == start_of_digits - || (CHAR_TYPE) TOLOWER (c) != L_('p'))) - && (base != 16 && (CHAR_TYPE) TOLOWER (c) != L_('e'))) + || (base == 16 && (cp != start_of_digits + && (CHAR_TYPE) TOLOWER (c) == L_('p'))) + || (base != 16 && (CHAR_TYPE) TOLOWER (c) == L_('e')))) { #ifdef USE_WIDE_CHAR tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands, @@ -721,7 +721,7 @@ c = *++cp; } - if (grouping && dig_no > 0) + if (grouping && cp > start_of_digits) { /* Check the grouping of the digits. */ #ifdef USE_WIDE_CHAR @@ -759,13 +759,15 @@ } } - /* We have the number digits in the integer part. Whether these are all or - any is really a fractional digit will be decided later. */ + /* We have the number of digits in the integer part. Whether these + are all or any is really a fractional digit will be decided + later. */ int_no = dig_no; lead_zero = int_no == 0 ? -1 : 0; - /* Read the fractional digits. A special case are the 'american style' - numbers like `16.' i.e. with decimal but without trailing digits. */ + /* Read the fractional digits. A special case are the 'american + style' numbers like `16.' i.e. with decimal point but without + trailing digits. */ if ( #ifdef USE_WIDE_CHAR c == (wint_t) decimal @@ -815,15 +817,16 @@ if (base == 16) exp_limit = (exp_negative ? -MIN_EXP + MANT_DIG + 4 * int_no : - MAX_EXP - 4 * int_no + lead_zero); + MAX_EXP - 4 * int_no + 4 * lead_zero + 3); else exp_limit = (exp_negative ? -MIN_10_EXP + MANT_DIG + int_no : - MAX_10_EXP - int_no + lead_zero); + MAX_10_EXP - int_no + lead_zero + 1); do { exponent *= 10; + exponent += c - L_('0'); if (exponent > exp_limit) /* The exponent is too large/small to represent a valid @@ -853,7 +856,6 @@ /* NOTREACHED */ } - exponent += c - L_('0'); c = *++cp; } while (c >= L_('0') && c <= L_('9')); @@ -888,7 +890,7 @@ --expp; --dig_no; --int_no; - ++exponent; + exponent += base == 16 ? 4 : 1; } while (dig_no > 0 && exponent < 0); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org