On Mon, Dec 12, 2011 at 11:03:49PM +0000, Adam D. Barratt wrote: > On Sun, 2011-10-30 at 19:27 +0100, Aurelien Jarno wrote: > > On Sun, Oct 30, 2011 at 05:36:27PM +0000, Adam D. Barratt wrote: > > > Did the 2.11.4 release happen? I'm conscious of the fact that we're now > > > a little way past 6.0.3; apologies for not following up again sooner. > > > > I have asked for it, but I have no answer so far. That said everything > > is already committed in the upstream git/svn, the only difference with > > version 2.11.4 will be the version number. Maybe we should just upload > > the current version without waiting so that it is widely tested, and > > later upload the final 2.11.4 if released in time. > > Ugh, I hadn't realised this was so long ago. :-( Last time we discussed > this on IRC, iirc you mentioned that there were a few more commits you > were planning on including? > Upstream hasn't released anything yet, so I think we should stop waiting, especially given we are starting to get complains about bugs #615120, #635885, #637239 and #646549, especially now that new hardware (Intel Sandy Bridge and AMD Bulldozer) is more and more common. I have attached a new version of what we plan to upload. It includes a few more fixes backported from the unstable version (look at the end of the changelog), and also a few more fixes from upstream (no new stable version have been released, but the stable branch has still evolved a bit). I am using this version (actually this one minus the two last commits) for a few weeks at home and on a dozen of computers at work, so it's already a bit tested. Would it be possible to upload this, and do a call for test for people wanting to test it before the actual point release? That would also help people having problems due the bugs mentioned above. -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net
diff -Nru eglibc-2.11.2/ChangeLog eglibc-2.11.3/ChangeLog
--- eglibc-2.11.2/ChangeLog 2010-06-10 19:20:45.000000000 +0000
+++ eglibc-2.11.3/ChangeLog 2010-12-06 20:55:10.000000000 +0000
@@ -1,3 +1,305 @@
+2010-05-31 Petr Baudis <pasky@suse.cz>
+
+ [BZ #11149]
+ * elf/ldconfig.c (main): Allow aux_cache_file open()ing to fail
+ silently even in the chroot mode.
+
+2010-05-31 Petr Baudis <pasky@suse.cz>
+
+ [BZ #10085]
+ * nis/nss_compat/compat-initgroups.c (internal_getgrent_r): Fix
+ initialization of skip_initgroups_dyn.
+
+2010-09-27 Andreas Schwab <schwab@redhat.com>
+
+ [BZ #11611]
+ * sysdeps/unix/sysv/linux/internal_statvfs.c (INTERNAL_STATVFS):
+ Mask out sign-bit copies when constructing f_fsid.
+
+2010-11-19 Ulrich Drepper <drepper@gmail.com>
+
+ * sysdeps/unix/sysv/linux/i386/bits/mman.h: Define MAP_HUGETLB.
+ * sysdeps/unix/sysv/linux/x86_64/bits/mman.h: Likewise.
+
+2010-11-16 Ulrich Drepper <drepper@gmail.com>
+
+ * sysdeps/unix/sysv/linux/sys/swap.h (SWAP_FLAG_DISCARD): Define.
+
+2010-11-11 Andreas Schwab <schwab@redhat.com>
+
+ * posix/fnmatch_loop.c (NEW_PATTERN): Fix use of alloca.
+ * posix/Makefile (tests): Add $(objpfx)tst-fnmatch-mem.
+ (tst-fnmatch-ENV): Set MALLOC_TRACE.
+ ($(objpfx)tst-fnmatch-mem): New rule.
+ (generated): Add tst-fnmatch-mem and tst-fnmatch.mtrace.
+ * posix/tst-fnmatch.c (main): Call mtrace.
+
+2010-08-09 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #11883]
+ * posix/fnmatch.c: Keep track of alloca use and fall back on malloc.
+ * posix/fnmatch_loop.c: Likewise.
+
+2010-11-10 Luis Machado <luisgpm@br.ibm.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (__ieee754_sqrtl): Force
+ signed comparison.
+
+2010-11-08 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12194]
+ * sysdeps/i386/bits/byteswap.h: Avoid warning in __bswap_16.
+ * sysdeps/x86_64/bits/byteswap.h: Likewise.
+
+2010-09-06 Andreas Schwab <schwab@redhat.com>
+
+ * manual/Makefile: Don't mix pattern rules with normal rules.
+
+2010-08-12 Andreas Schwab <schwab@redhat.com>
+
+ [BZ #11904]
+ * locale/programs/locale.c (print_assignment): New function.
+ (show_locale_vars): Use it.
+
+2010-10-26 Ulrich Drepper <drepper@gmail.com>
+
+ * elf/rtld.c (dl_main): Move assertion after the point where rtld map
+ is added to the list.
+
+2010-10-20 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+ Ulrich Drepper <drepper@gmail.com>
+
+ * elf/dl-object.c (_dl_new_object): Don't append the new object to
+ the global list here. Move code to...
+ (_dl_add_to_namespace_list): ...here. New function.
+ * elf/rtld.c (dl_main): Invoke _dl_add_to_namespace_list.
+ * sysdeps/generic/ldsodefs.h (_dl_add_to_namespace_list): Declare.
+ * elf/dl-load.c (lose): Don't remove the element from the list.
+ (_dl_map_object_from_fd): Invoke _dl_add_to_namespace_list.
+ (_dl_map_object): Likewise.
+
+2010-10-24 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #12140]
+ * malloc/malloc.c (_int_free): Fill correct number of bytes when
+ perturbing.
+
+2010-09-09 Andreas Schwab <schwab@redhat.com>
+
+ * Makeconfig (sysd-rules-patterns): Add rtld-%:rtld-%.
+ (sysd-rules-targets): Remove duplicates.
+ * elf/rtld-Rules ($(objpfx)rtld-%.os): Add pattern rules with
+ rtld-%.$o dependency.
+
+2010-10-18 Andreas Schwab <schwab@redhat.com>
+
+ * elf/dl-open.c (dl_open_worker): Don't expand DST here, let
+ _dl_map_object do it.
+
+2010-10-15 Andreas Schwab <schwab@redhat.com>
+
+ * scripts/data/localplt-s390-linux-gnu.data: New file.
+ * scripts/data/localplt-s390x-linux-gnu.data: New file.
+
+2010-10-12 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #12078]
+ * posix/regcomp.c (parse_branch): One more memory leak plugged.
+ * posix/bug-regex31.input: Add test case.
+
+2010-10-11 Ulrich Drepper <drepper@gmail.com>
+
+ * posix/bug-regex31.c: Rewrite to run multiple tests from stdin.
+ * posix/bug-regex31.input: New file.
+
+ [BZ #12078]
+ * posix/regcomp.c (parse_branch): Free memory when allocation failed.
+ (parse_sub_exp): Fix last change, use postorder.
+
+ * posix/bug-regex31.c: New file.
+ * posix/Makefile: Add rules to build and run bug-regex31.
+
+ * posix/regcomp.c (parse_bracket_exp): Add missing re_free calls.
+
+ [BZ #12078]
+ * posix/regcomp.c (parse_sub_exp): Free tree data when it is not used.
+
+ [BZ #12093]
+ * sysdeps/unix/sysv/linux/check_pf.c (__check_pf): ->ifa_addr might
+ be NULL.
+
+2010-09-15 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/getdents.c (__GETDENTS): When
+ implementing getdents64 using getdents syscall, set d_type if
+ __ASSUME_GETDENTS32_D_TYPE.
+
+2010-09-14 Andreas Schwab <schwab@redhat.com>
+
+ * sysdeps/s390/s390-32/__longjmp.c (__longjmp): Define register
+ variables after CHECK_SP call.
+ * sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise.
+
+2010-09-08 Chung-Lin Tang <cltang@codesourcery.com>
+ Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #11968]
+ * sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
+ (____longjmp_chk): Use %ebx for saving value across system call.
+ Add unwind info.
+
+2010-08-31 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/unix/sysv/linux/sparc/sys/epoll.h (epoll_create2): Delete.
+ (epoll_create1): Declare.
+
+ * sysdeps/unix/sysv/linux/x86_64/sys/epoll.h: Fix typo.
+
+2010-08-31 Andreas Schwab <schwab@redhat.com>
+
+ [BZ #7066]
+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix array overflow when
+ shifting retval into place.
+
+2010-09-14 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/res_init.c (__res_vinit): Count the default server we added.
+
+2010-08-25 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #10851]
+ * resolv/res_init.c (__res_vinit): When no server address at all
+ is given default to loopback.
+
+2010-08-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * sysdeps/i386/elf/Makefile: New file.
+
+2010-07-31 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ * hurd/hurdselect.c (_hurd_select): Round timeout up instead of down
+ when converting to ms.
+
+2010-07-29 Roland McGrath <roland@redhat.com>
+
+ [BZ 11856]
+ * manual/locale.texi (Yes-or-No Questions): Fix example code.
+
+2010-07-27 Andreas Schwab <schwab@redhat.com>
+
+ * manual/memory.texi (Malloc Tunable Parameters): Document
+ M_PERTURB.
+
+2010-07-26 Roland McGrath <roland@redhat.com>
+
+ [BZ #11840]
+ * configure.in (-fgnu89-inline check): Set and substitute
+ gnu89_inline, not libc_cv_gnu89_inline.
+ * configure: Regenerated.
+ * config.make.in (gnu89-inline-CFLAGS): Use @gnu89_inline@.
+
+2010-07-20 Roland McGrath <roland@redhat.com>
+
+ * elf/dl-sysdep.c (_dl_important_hwcaps): Add dsocaps mask to
+ dl_hwcap_mask as well as dl_hwcap. Without this, dsocaps matching in
+ ld.so.cache was broken. With it, there is no way to disable dsocaps
+ like LD_HWCAP_MASK can disable hwcaps.
+
+2010-07-05 Roland McGrath <roland@redhat.com>
+
+ * manual/arith.texi (Rounding Functions): Fix rint description
+ implicit in round description.
+
+2010-07-02 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/Makefile: Fix linking for a few tests to make recent linker
+ happy.
+
+2010-06-02 Emilio Pozuelo Monfort <pochu27@gmail.com>
+
+ * hurd/lookup-at.c (__file_name_lookup_at): Accept
+ AT_SYMLINK_FOLLOW in AT_FLAGS. Fail with EINVAL if both
+ AT_SYMLINK_FOLLOW and AT_SYMLINK_NOFOLLOW are present
+ in AT_FLAGS.
+ * hurd/hurd/fd.h (__file_name_lookup_at): Update comment.
+ * sysdeps/mach/hurd/linkat.c (linkat): Pass O_NOLINK in FLAGS.
+
+2010-11-03 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #12191]
+ * sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Round
+ __x86_64_data_cache_size_half, __x86_64_data_cache_size
+ __x86_64_shared_cache_size_half and __x86_64_shared_cache_size,
+ to multiple of 256 bytes.
+
+2010-11-03 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12167]
+ * sysdeps/unix/sysv/linux/ttyname.c (ttyname): Recognize new mangling
+ of inacessible symlinks. Verify result of symlink before returning it.
+ * sysdeps/unix/sysv/linux/ttyname_r.c (__ttyname_r): Likewise.
+ Patch mostly by Miklos Szeredi <miklos@szeredi.hu>.
+
+2010-10-25 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #12159]
+ * sysdeps/x86_64/multiarch/strchr.S: Fix propagation of search byte
+ into all bytes of SSE register.
+ Patch by Richard Li <richardpku@gmail.com>.
+
+2010-10-22 Andreas Schwab <schwab@redhat.com>
+
+ * include/dlfcn.h (__RTLD_SECURE): Define.
+ * elf/dl-load.c (_dl_map_object): Remove preloaded parameter. Use
+ mode & __RTLD_SECURE instead.
+ (open_path): Rename preloaded parameter to secure.
+ * sysdeps/generic/ldsodefs.h (_dl_map_object): Adjust declaration.
+ * elf/dl-open.c (dl_open_worker): Adjust call to _dl_map_object.
+ * elf/dl-deps.c (openaux): Likewise.
+ * elf/rtld.c (struct map_args): Remove is_preloaded.
+ (map_doit): Don't use it.
+ (dl_main): Likewise.
+ (do_preload): Use __RTLD_SECURE instead of is_preloaded.
+ (dlmopen_doit): Add __RTLD_SECURE to mode bits.
+
+2010-10-06 Ulrich Drepper <drepper@gmail.com>
+
+ * string/bug-strstr1.c: New file.
+ * string/Makefile: Add rules to build and run bug-strstr1.
+
+2010-10-05 Eric Blake <eblake@redhat.com>
+
+ [BZ #12092]
+ * string/str-two-way.h (two_way_long_needle): Always clear memory
+ when skipping input due to the shift table.
+
+2010-10-03 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12005]
+ * malloc/mcheck.c: Handle large requests.
+
+ [BZ #12077]
+ * sysdeps/x86_64/strcmp.S: Fix handling of remaining bytes in buffer
+ for strncmp and strncasecmp.
+ * string/stratcliff.c: Add tests for strcmp and strncmp.
+ * wcsmbs/wcsatcliff.c: Adjust for stratcliff change.
+
+2010-06-02 Kirill A. Shutemov <kirill@shutemov.name>
+
+ * elf/dl-reloc.c: Flush cache after solving TEXTRELs if arch
+ requires it.
+
+2010-06-02 Andreas Schwab <schwab@redhat.com>
+
+ * nis/nss_nis/nis-initgroups.c (get_uid): Properly resize buffer.
+
+2010-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ * libio/stdio.h (sscanf, vsscanf): Use __REDIRECT_NTH instead of
+ __REDIRECT followed by __THROW.
+ * wcsmbs/wchar.h (swscanf, vswscanf): Likewise.
+ * posix/getopt.h (getopt): Likewise.
+
2010-05-26 H.J. Lu <hongjiu.lu@intel.com>
[BZ #11640]
diff -Nru eglibc-2.11.2/INSTALL eglibc-2.11.3/INSTALL
--- eglibc-2.11.2/INSTALL 2007-02-19 19:48:39.000000000 +0000
+++ eglibc-2.11.3/INSTALL 2010-12-06 20:55:10.000000000 +0000
@@ -329,11 +329,12 @@
Check the FAQ for any special compiler issues on particular
platforms.
- * GNU `binutils' 2.15 or later
+ * GNU `binutils'
You must use GNU `binutils' (as and ld) to build the GNU C library.
No other assembler or linker has the necessary functionality at the
- moment.
+ moment. The configure scripts checks for the appropriate version
+ for the platform. Too-old versions will prevent building glibc.
* GNU `texinfo' 3.12f
diff -Nru eglibc-2.11.2/Makeconfig eglibc-2.11.3/Makeconfig
--- eglibc-2.11.2/Makeconfig 2009-06-24 16:26:34.000000000 +0000
+++ eglibc-2.11.3/Makeconfig 2010-12-06 20:55:10.000000000 +0000
@@ -694,7 +694,7 @@
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
$(CPPFLAGS-$(suffix $@)) \
$(foreach lib,$(libof-$(basename $(@F))) \
- $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
+ $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
$(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F)))
override CFLAGS = -std=gnu99 $(gnu89-inline-CFLAGS) \
$(filter-out %frame-pointer,$(+cflags)) $(+gccwarn-c) \
@@ -983,7 +983,7 @@
# emitted into sysd-rules. A sysdeps Makeconfig fragment can
# add its own special object file prefix to this list with e.g. foo-%:%
# to have foo-*.? compiled from *.? using $(foo-CPPFLAGS).
-sysd-rules-patterns := %:% rtld-%:% m_%:s_%
+sysd-rules-patterns := %:% rtld-%:rtld-% rtld-%:% m_%:s_%
# Let sysdeps/ subdirs contain a Makeconfig fragment for us to include here.
sysdep-makeconfigs := $(wildcard $(+sysdep_dirs:=/Makeconfig))
@@ -992,8 +992,8 @@
endif
# Compute just the target patterns. Makeconfig has set sysd-rules-patterns.
-sysd-rules-targets := $(foreach p,$(sysd-rules-patterns),\
- $(firstword $(subst :, ,$p)))
+sysd-rules-targets := $(sort $(foreach p,$(sysd-rules-patterns),\
+ $(firstword $(subst :, ,$p))))
endif # Makeconfig not yet included
diff -Nru eglibc-2.11.2/config.make.in eglibc-2.11.3/config.make.in
--- eglibc-2.11.2/config.make.in 2009-07-29 15:58:14.000000000 +0000
+++ eglibc-2.11.3/config.make.in 2010-12-06 20:55:10.000000000 +0000
@@ -58,7 +58,7 @@
enable-check-abi = @enable_check_abi@
have-forced-unwind = @libc_cv_forced_unwind@
have-fpie = @libc_cv_fpie@
-gnu89-inline-CFLAGS = @libc_cv_gnu89_inline@
+gnu89-inline-CFLAGS = @gnu89_inline@
have-ssp = @libc_cv_ssp@
have-selinux = @have_selinux@
have-libaudit = @have_libaudit@
diff -Nru eglibc-2.11.2/configure eglibc-2.11.3/configure
--- eglibc-2.11.2/configure 2009-11-11 15:45:19.000000000 +0000
+++ eglibc-2.11.3/configure 2010-12-06 20:55:10.000000000 +0000
@@ -681,7 +681,7 @@
exceptions
no_whole_archive
libc_cv_have_initfini
-libc_cv_gnu89_inline
+gnu89_inline
libc_cv_ssp
fno_unit_at_a_time
libc_cv_hashstyle
@@ -6937,9 +6937,9 @@
{ $as_echo "$as_me:$LINENO: result: $libc_cv_gnu89_inline" >&5
$as_echo "$libc_cv_gnu89_inline" >&6; }
if test $libc_cv_gnu89_inline = yes; then
- libc_cv_gnu89_inline=-fgnu89-inline
+ gnu89_inline=-fgnu89-inline
else
- libc_cv_gnu89_inline=
+ gnu89_inline=
fi
diff -Nru eglibc-2.11.2/configure.in eglibc-2.11.3/configure.in
--- eglibc-2.11.2/configure.in 2009-11-11 15:45:19.000000000 +0000
+++ eglibc-2.11.3/configure.in 2010-12-06 20:55:10.000000000 +0000
@@ -1773,11 +1773,11 @@
fi
rm -f conftest*])
if test $libc_cv_gnu89_inline = yes; then
- libc_cv_gnu89_inline=-fgnu89-inline
+ gnu89_inline=-fgnu89-inline
else
- libc_cv_gnu89_inline=
+ gnu89_inline=
fi
-AC_SUBST(libc_cv_gnu89_inline)
+AC_SUBST(gnu89_inline)
if test $elf != yes; then
AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini,
diff -Nru eglibc-2.11.2/debian/changelog eglibc-2.11.3/debian/changelog
--- eglibc-2.11.2/debian/changelog 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/changelog 2011-12-13 13:41:29.000000000 +0000
@@ -1,3 +1,65 @@
+eglibc (2.11.3-1) unstable; urgency=low
+
+ * Update from stable upstream version, and update from the upstream
+ stable branch:
+ - fix wrong memmove/bcopy optimization with gcc-4.6. Closes: #619963.
+ - fix an integer overflow in fnmatch() (CVE-2011-1659). Closes: #626370.
+ - fix spurious warning in bswap_16() with -Wconversion. Closes: #561249.
+ - fix auxiliary cache file creation. Closes: #588218.
+ - fix memory corruption in fnmatch() that can lead to code execution
+ (CVE-2011-1071). Closes: #615120
+ - fix strchr() on x86-64 CPU with SSE4.2. Closes: #635885
+ * Update patches:
+ - patches/locale/locale-print-LANGUAGE.diff
+ - patches/hppa/local-stack-grows-up.diff
+ - patches/m68k/cvs-tls-support.patch
+ - patches/any/local-disable-test-tgmath2.diff
+ - patches/any/submitted-longdouble.diff
+ - patches/any/submitted-bits-fcntl_h-at.diff
+ - patches/kfreebsd/local-readdir_r.diff
+ * Drop obsolete patches:
+ - patches/any/cvs-redirect-throw.diff
+ - patches/any/cvs-flush-cache-textrels.diff
+ - patches/hurd-i386/cvs-linkat.diff
+ - patches/hurd-i386/cvs-select.diff
+ - patches/sparc/submitted-epoll.diff
+ - patches/any/cvs-dont-expand-dst-twice.diff
+ - patches/amd64/cvs-avx-tcb-alignment.diff
+ - patches/any/submitted-etc-resolv.conf.diff
+ - patches/any/cvs-audit-suid.diff
+ * kfreebsd/local-sysdeps.diff, update to r3763 (from squeeze glibc-bsd).
+ - fixes LD_PRELOAD with a kfreebsd-9 kernel. Closes: #630695.
+ - uses upstream RFTSIGZMB for exit signal selection when available.
+ - fixes a crash in if_nameindex() with more than 3 interfaces.
+ - alter faccessat() X_OK tests similarly as access(). See #640334.
+ - fix __libc_sa_len() for AF_LOCAL. See #645527.
+ * Fix preinst script wrt 3.0 kernel. Patch by Colin Watson. Closes:
+ #630077.
+ * Update submitted-resolv.conf-thread.diff from upstream to fix a
+ deadlock in some rare cases.
+ * Add patches/any/cvs-resolv-different-nameserver.diff and
+ patches/any/submitted-resolv-assert.diff to try a different
+ nameserver if the first one returns REFUSED. Closes: #535504.
+ * Add patches/any/cvs-getaddrinfo-single-lookup.diff to fix fallback to
+ single lookup dns requests. Closes: #541167.
+ * Add patches/any/cvs-pthread-setgroups.diff to fix setgroups() with
+ multiple threads.
+ * Add debian/patches/cvs-dl_close-scope-handling.diff from upstream to
+ fix issues with dl_close() when resolving locally-defined symbols.
+ Closes: #625250.
+ * patches/i386/local-cpuid-level2.diff: fix a typo. Closes: #609389.
+ * patches/any/cvs-nptl-pthread-race.diff: fix a race in NPTL code that
+ sometimes causes a deadlock when calling fork() from a thread.
+ * patches/amd64/cvs-avx-detection.diff: do not use AVX if hardware support
+ is present, but not enabled in the kernel. Closes: #646549.
+ * patches/any/cvs-statvfs-mount-flags.diff: get the mount flags directly
+ from the kernel when possible instead of parsing /proc/mounts. Closes:
+ #639897.
+ * patches/any/cvs-dlopen-tls.diff: fix handling of static TLS in
+ dlopen'ed objects. Closes: #637239.
+
+ -- Aurelien Jarno <aurel32@debian.org> Tue, 13 Dec 2011 11:23:12 +0100
+
eglibc (2.11.2-10) unstable; urgency=low
* Add patches/amd64/cvs-avx-tcb-alignment.diff from upstream to fix
diff -Nru eglibc-2.11.2/debian/debhelper.in/libc.preinst eglibc-2.11.3/debian/debhelper.in/libc.preinst
--- eglibc-2.11.2/debian/debhelper.in/libc.preinst 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/debhelper.in/libc.preinst 2011-12-13 13:41:29.000000000 +0000
@@ -25,8 +25,8 @@
}
linux_compare_versions () {
- verA=$(($(echo "$1" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
- verB=$(($(echo "$3" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
+ verA=$(($(echo "$1" | sed 's/^\([0-9]*\.[0-9]*\)\([^.0-9]\|$\)/\1.0\2/; s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
+ verB=$(($(echo "$3" | sed 's/^\([0-9]*\.[0-9]*\)\([^.0-9]\|$\)/\1.0\2/; s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
test $verA -$2 $verB
}
@@ -268,7 +268,7 @@
then
# Test to make sure z < 255, in x.y.z-n form of kernel version
# Also make sure we don't trip on x.y.zFOO-n form
- kernel_rev=$(uname -r | sed 's/\([0-9]*\.[0-9]*\.\)\([0-9]*\)\(.*\)/\2/')
+ kernel_rev=$(uname -r | sed 's/\([0-9]*\.\)\{1,2\}\([0-9]*\)\(.*\)/\2/')
if [ "$kernel_rev" -ge 255 ]
then
echo "WARNING: Your kernel version indicates a revision number"
diff -Nru eglibc-2.11.2/debian/local/manpages/gencat.1 eglibc-2.11.3/debian/local/manpages/gencat.1
--- eglibc-2.11.2/debian/local/manpages/gencat.1 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/local/manpages/gencat.1 2011-12-13 13:41:29.000000000 +0000
@@ -1,5 +1,5 @@
.rn '' }`
-.\" $RCSfile: gencat.1,v $$Revision: 1.1 $$Date: 2008-08-08 21:49:44 +0200 (ven. 08 août 2008) $
+.\" $RCSfile: gencat.1,v $$Revision: 1.1 $$Date: 2011-02-06 16:48:38 +0100 (dim. 06 févr. 2011) $
.\"
.\" $Log: gencat.1,v $
.\" Revision 1.1 2003/11/03 17:37:27 jbailey
diff -Nru eglibc-2.11.2/debian/local/manpages/iconvconfig.8 eglibc-2.11.3/debian/local/manpages/iconvconfig.8
--- eglibc-2.11.2/debian/local/manpages/iconvconfig.8 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/local/manpages/iconvconfig.8 2011-12-13 13:41:29.000000000 +0000
@@ -1,5 +1,5 @@
.rn '' }`
-.\" $RCSfile: iconvconfig.8,v $$Revision: 1.1 $$Date: 2008-08-08 21:49:44 +0200 (ven. 08 août 2008) $
+.\" $RCSfile: iconvconfig.8,v $$Revision: 1.1 $$Date: 2011-02-06 16:48:38 +0100 (dim. 06 févr. 2011) $
.\"
.\" $Log: iconvconfig.8,v $
.\" Revision 1.1 2003/11/03 17:37:27 jbailey
diff -Nru eglibc-2.11.2/debian/local/manpages/mtrace.1 eglibc-2.11.3/debian/local/manpages/mtrace.1
--- eglibc-2.11.2/debian/local/manpages/mtrace.1 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/local/manpages/mtrace.1 2011-12-13 13:41:29.000000000 +0000
@@ -1,5 +1,5 @@
.rn '' }`
-.\" $RCSfile: mtrace.1,v $$Revision: 1.1 $$Date: 2008-08-08 21:49:44 +0200 (ven. 08 août 2008) $
+.\" $RCSfile: mtrace.1,v $$Revision: 1.1 $$Date: 2011-02-06 16:48:38 +0100 (dim. 06 févr. 2011) $
.\"
.\" $Log: mtrace.1,v $
.\" Revision 1.1 2003/11/03 17:37:27 jbailey
diff -Nru eglibc-2.11.2/debian/patches/amd64/cvs-avx-detection.diff eglibc-2.11.3/debian/patches/amd64/cvs-avx-detection.diff
--- eglibc-2.11.2/debian/patches/amd64/cvs-avx-detection.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/amd64/cvs-avx-detection.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,164 @@
+2011-07-23 Ulrich Drepper <drepper@gmail.com>
+
+ * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix one more
+ typo.
+ (_dl_x86_64_save_sse): Likewise.
+
+2011-07-22 Ulrich Drepper <drepper@gmail.com>
+
+ * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix test for
+ OSXSAVE.
+ (_dl_x86_64_save_sse): Likewise.
+
+2011-07-21 Andreas Schwab <schwab@redhat.com>
+
+ * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix last
+ change.
+ (_dl_x86_64_save_sse): Use correct AVX check.
+
+2011-07-20 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #13007]
+ * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): More complete
+ check for AVX enablement so that we don't crash with old kernels and
+ new hardware.
+ * elf/tst-audit4.c: Add same checks here.
+ * elf/tst-audit6.c: Likewise.
+
+---
+ elf/tst-audit4.c | 22 ++++++++++++++++++----
+ elf/tst-audit6.c | 22 ++++++++++++++++++----
+ sysdeps/x86_64/dl-trampoline.S | 36 +++++++++++++++++++++++++++---------
+ 3 files changed, 63 insertions(+), 17 deletions(-)
+
+--- a/elf/tst-audit4.c
++++ b/elf/tst-audit4.c
+@@ -6,16 +6,30 @@
+ #include <cpuid.h>
+ #include <immintrin.h>
+
++
++static int
++avx_enabled (void)
++{
++ unsigned int eax, ebx, ecx, edx;
++
++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
++ return 0;
++
++ /* Check the OS has AVX and SSE saving enabled. */
++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
++
++ return (eax & 6) == 6;
++}
++
++
+ extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i,
+ __m256i, __m256i, __m256i, __m256i);
+ int
+ main (void)
+ {
+- unsigned int eax, ebx, ecx, edx;
+-
+ /* Run AVX test only if AVX is supported. */
+- if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+- && (ecx & bit_AVX))
++ if (avx_enabled ())
+ {
+ __m256i ymm = _mm256_setzero_si256 ();
+ __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm);
+--- a/elf/tst-audit6.c
++++ b/elf/tst-audit6.c
+@@ -9,14 +9,28 @@
+ extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i,
+ __m128i, __m128i, __m128i, __m128i);
+
+-int
+-main (void)
++
++static int
++avx_enabled (void)
+ {
+ unsigned int eax, ebx, ecx, edx;
+
++ if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
++ || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
++ return 0;
++
++ /* Check the OS has AVX and SSE saving enabled. */
++ asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
++
++ return (eax & 6) == 6;
++}
++
++
++int
++main (void)
++{
+ /* Run AVX test only if AVX is supported. */
+- if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+- && (ecx & bit_AVX))
++ if (avx_enabled ())
+ {
+ __m128i xmm = _mm_setzero_si128 ();
+ __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm);
+--- a/sysdeps/x86_64/dl-trampoline.S
++++ b/sysdeps/x86_64/dl-trampoline.S
+@@ -1,5 +1,5 @@
+ /* PLT trampolines. x86-64 version.
+- Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
++ Copyright (C) 2004, 2005, 2007, 2009, 2011 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
+@@ -139,11 +139,20 @@
+ movl $1, %eax
+ cpuid
+ movq %r11,%rbx # Restore rbx
+- movl $1, %eax
+- testl $(1 << 28), %ecx
++ xorl %eax, %eax
++ // AVX and XSAVE supported?
++ andl $((1 << 28) | (1 << 27)), %ecx
++ cmpl $((1 << 28) | (1 << 27)), %ecx
+ jne 2f
+- negl %eax
+-2: movl %eax, L(have_avx)(%rip)
++ xorl %ecx, %ecx
++ // Get XFEATURE_ENABLED_MASK
++ xgetbv
++ andl $0x6, %eax
++ cmpl $0x6, %eax
++ // Nonzero if SSE and AVX state saving is enabled.
++ sete %al
++2: leal -1(%eax,%eax), %eax
++ movl %eax, L(have_avx)(%rip)
+ cmpl $0, %eax
+
+ 1: js L(no_avx)
+@@ -176,11 +185,20 @@
+ movl $1, %eax
+ cpuid
+ movq %r11,%rbx # Restore rbx
+- movl $1, %eax
+- testl $(1 << 28), %ecx
++ xorl %eax, %eax
++ // AVX and XSAVE supported?
++ andl $((1 << 28) | (1 << 27)), %ecx
++ cmpl $((1 << 28) | (1 << 27)), %ecx
+ jne 2f
+- negl %eax
+-2: movl %eax, L(have_avx)(%rip)
++ xorl %ecx, %ecx
++ // Get XFEATURE_ENABLED_MASK
++ xgetbv
++ andl $0x6, %eax
++ cmpl $0x6, %eax
++ // Nonzero if SSE and AVX state saving is enabled.
++ sete %al
++2: leal -1(%eax,%eax), %eax
++ movl %eax, L(have_avx)(%rip)
+ cmpl $0, %eax
+
+ 1: js L(no_avx5)
diff -Nru eglibc-2.11.2/debian/patches/amd64/cvs-avx-tcb-alignment.diff eglibc-2.11.3/debian/patches/amd64/cvs-avx-tcb-alignment.diff
--- eglibc-2.11.2/debian/patches/amd64/cvs-avx-tcb-alignment.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/amd64/cvs-avx-tcb-alignment.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-2010-10-13 H.J. Lu <hongjiu.lu@intel.com>
-
- [BZ #12113]
- * sysdeps/x86_64/pthreaddef.h (TCB_ALIGNMENT): Changed to 32.
- * sysdeps/x86_64/tls.h (TLS_TCB_ALIGN): Defined with alignment
- of "struct pthread".
-
-diff --git a/nptl/sysdeps/x86_64/pthreaddef.h b/nptl/sysdeps/x86_64/pthreaddef.h
-index be63a8c..8ec135c 100644
---- a/nptl/sysdeps/x86_64/pthreaddef.h
-+++ b/nptl/sysdeps/x86_64/pthreaddef.h
-@@ -27,8 +27,9 @@
- /* Minimal stack size after allocating thread descriptor and guard size. */
- #define MINIMAL_REST_STACK 2048
-
--/* Alignment requirement for TCB. */
--#define TCB_ALIGNMENT 16
-+/* Alignment requirement for TCB. Need to store post-AVX vector registers
-+ in the TCB and we want the storage to be aligned at 32-byte. */
-+#define TCB_ALIGNMENT 32
-
-
- /* Location of current stack frame. The frame pointer is not usable. */
-diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h
-index e39eb5f..41b5e6d 100644
---- a/nptl/sysdeps/x86_64/tls.h
-+++ b/nptl/sysdeps/x86_64/tls.h
-@@ -117,12 +117,7 @@ typedef struct
- # define TLS_TCB_SIZE sizeof (struct pthread)
-
- /* Alignment requirements for the TCB. */
--//# define TLS_TCB_ALIGN __alignof__ (struct pthread)
--// Normally the above would be correct But we have to store post-AVX
--// vector registers in the TCB and we want the storage to be aligned.
--// unfortunately there isn't yet a type for these values and hence no
--// 32-byte alignment requirement. Make this explicit, for now.
--# define TLS_TCB_ALIGN 32
-+# define TLS_TCB_ALIGN __alignof__ (struct pthread)
-
- /* The TCB can have any size and the memory following the address the
- thread pointer points to is unspecified. Allocate the TCB there. */
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-audit-suid.diff eglibc-2.11.3/debian/patches/any/cvs-audit-suid.diff
--- eglibc-2.11.2/debian/patches/any/cvs-audit-suid.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-audit-suid.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,215 +0,0 @@
-2010-10-22 Andreas Schwab <schwab@redhat.com>
-
- * include/dlfcn.h (__RTLD_SECURE): Define.
- * elf/dl-load.c (_dl_map_object): Remove preloaded parameter. Use
- mode & __RTLD_SECURE instead.
- (open_path): Rename preloaded parameter to secure.
- * sysdeps/generic/ldsodefs.h (_dl_map_object): Adjust declaration.
- * elf/dl-open.c (dl_open_worker): Adjust call to _dl_map_object.
- * elf/dl-deps.c (openaux): Likewise.
- * elf/rtld.c (struct map_args): Remove is_preloaded.
- (map_doit): Don't use it.
- (dl_main): Likewise.
- (do_preload): Use __RTLD_SECURE instead of is_preloaded.
- (dlmopen_doit): Add __RTLD_SECURE to mode bits.
-
-diff --git a/elf/dl-deps.c b/elf/dl-deps.c
-index a58de5c..a51fb6e 100644
---- a/elf/dl-deps.c
-+++ b/elf/dl-deps.c
-@@ -62,7 +62,7 @@ openaux (void *a)
- {
- struct openaux_args *args = (struct openaux_args *) a;
-
-- args->aux = _dl_map_object (args->map, args->name, 0,
-+ args->aux = _dl_map_object (args->map, args->name,
- (args->map->l_type == lt_executable
- ? lt_library : args->map->l_type),
- args->trace_mode, args->open_mode,
-diff --git a/elf/dl-load.c b/elf/dl-load.c
-index a7162eb..aa8738f 100644
---- a/elf/dl-load.c
-+++ b/elf/dl-load.c
-@@ -1812,7 +1812,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
- if MAY_FREE_DIRS is true. */
-
- static int
--open_path (const char *name, size_t namelen, int preloaded,
-+open_path (const char *name, size_t namelen, int secure,
- struct r_search_path_struct *sps, char **realname,
- struct filebuf *fbp, struct link_map *loader, int whatcode,
- bool *found_other_class)
-@@ -1894,7 +1894,7 @@ open_path (const char *name, size_t namelen, int preloaded,
- /* Remember whether we found any existing directory. */
- here_any |= this_dir->status[cnt] != nonexisting;
-
-- if (fd != -1 && __builtin_expect (preloaded, 0)
-+ if (fd != -1 && __builtin_expect (secure, 0)
- && INTUSE(__libc_enable_secure))
- {
- /* This is an extra security effort to make sure nobody can
-@@ -1963,7 +1963,7 @@ open_path (const char *name, size_t namelen, int preloaded,
-
- struct link_map *
- internal_function
--_dl_map_object (struct link_map *loader, const char *name, int preloaded,
-+_dl_map_object (struct link_map *loader, const char *name,
- int type, int trace_mode, int mode, Lmid_t nsid)
- {
- int fd;
-@@ -2067,7 +2067,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
- for (l = loader; l; l = l->l_loader)
- if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH"))
- {
-- fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs,
-+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
-+ &l->l_rpath_dirs,
- &realname, &fb, loader, LA_SER_RUNPATH,
- &found_other_class);
- if (fd != -1)
-@@ -2082,14 +2083,15 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
- && main_map != NULL && main_map->l_type != lt_loaded
- && cache_rpath (main_map, &main_map->l_rpath_dirs, DT_RPATH,
- "RPATH"))
-- fd = open_path (name, namelen, preloaded, &main_map->l_rpath_dirs,
-+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
-+ &main_map->l_rpath_dirs,
- &realname, &fb, loader ?: main_map, LA_SER_RUNPATH,
- &found_other_class);
- }
-
- /* Try the LD_LIBRARY_PATH environment variable. */
- if (fd == -1 && env_path_list.dirs != (void *) -1)
-- fd = open_path (name, namelen, preloaded, &env_path_list,
-+ fd = open_path (name, namelen, mode & __RTLD_SECURE, &env_path_list,
- &realname, &fb,
- loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded,
- LA_SER_LIBPATH, &found_other_class);
-@@ -2098,12 +2100,12 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
- if (fd == -1 && loader != NULL
- && cache_rpath (loader, &loader->l_runpath_dirs,
- DT_RUNPATH, "RUNPATH"))
-- fd = open_path (name, namelen, preloaded,
-+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
- &loader->l_runpath_dirs, &realname, &fb, loader,
- LA_SER_RUNPATH, &found_other_class);
-
- if (fd == -1
-- && (__builtin_expect (! preloaded, 1)
-+ && (__builtin_expect (! (mode & __RTLD_SECURE), 1)
- || ! INTUSE(__libc_enable_secure)))
- {
- /* Check the list of libraries in the file /etc/ld.so.cache,
-@@ -2169,7 +2171,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
- && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL
- || __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
- && rtld_search_dirs.dirs != (void *) -1)
-- fd = open_path (name, namelen, preloaded, &rtld_search_dirs,
-+ fd = open_path (name, namelen, mode & __RTLD_SECURE, &rtld_search_dirs,
- &realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
-
- /* Add another newline when we are tracing the library loading. */
-diff --git a/elf/dl-open.c b/elf/dl-open.c
-index c394b3f..cf8e8cc 100644
---- a/elf/dl-open.c
-+++ b/elf/dl-open.c
-@@ -223,7 +223,7 @@ dl_open_worker (void *a)
-
- /* Load the named object. */
- struct link_map *new;
-- args->map = new = _dl_map_object (call_map, file, 0, lt_loaded, 0,
-+ args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
- mode | __RTLD_CALLMAP, args->nsid);
-
- /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
-diff --git a/elf/rtld.c b/elf/rtld.c
-index 5ecc4fe..06b534a 100644
---- a/elf/rtld.c
-+++ b/elf/rtld.c
-@@ -589,7 +589,6 @@ struct map_args
- /* Argument to map_doit. */
- char *str;
- struct link_map *loader;
-- int is_preloaded;
- int mode;
- /* Return value of map_doit. */
- struct link_map *map;
-@@ -627,16 +626,17 @@ static void
- map_doit (void *a)
- {
- struct map_args *args = (struct map_args *) a;
-- args->map = _dl_map_object (args->loader, args->str,
-- args->is_preloaded, lt_library, 0, args->mode,
-- LM_ID_BASE);
-+ args->map = _dl_map_object (args->loader, args->str, lt_library, 0,
-+ args->mode, LM_ID_BASE);
- }
-
- static void
- dlmopen_doit (void *a)
- {
- struct dlmopen_args *args = (struct dlmopen_args *) a;
-- args->map = _dl_open (args->fname, RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT,
-+ args->map = _dl_open (args->fname,
-+ (RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT
-+ | __RTLD_SECURE),
- dl_main, LM_ID_NEWLM, _dl_argc, INTUSE(_dl_argv),
- __environ);
- }
-@@ -806,8 +806,7 @@ do_preload (char *fname, struct link_map *main_map, const char *where)
-
- args.str = fname;
- args.loader = main_map;
-- args.is_preloaded = 1;
-- args.mode = 0;
-+ args.mode = __RTLD_SECURE;
-
- unsigned int old_nloaded = GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
-
-@@ -1054,7 +1053,6 @@ of this helper program; chances are you did not intend to run this program.\n\
-
- args.str = rtld_progname;
- args.loader = NULL;
-- args.is_preloaded = 0;
- args.mode = __RTLD_OPENEXEC;
- (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit,
- &args);
-@@ -1066,7 +1064,7 @@ of this helper program; chances are you did not intend to run this program.\n\
- else
- {
- HP_TIMING_NOW (start);
-- _dl_map_object (NULL, rtld_progname, 0, lt_library, 0,
-+ _dl_map_object (NULL, rtld_progname, lt_library, 0,
- __RTLD_OPENEXEC, LM_ID_BASE);
- HP_TIMING_NOW (stop);
-
-diff --git a/include/dlfcn.h b/include/dlfcn.h
-index a67426d..af92483 100644
---- a/include/dlfcn.h
-+++ b/include/dlfcn.h
-@@ -9,6 +9,7 @@
- #define __RTLD_OPENEXEC 0x20000000
- #define __RTLD_CALLMAP 0x10000000
- #define __RTLD_AUDIT 0x08000000
-+#define __RTLD_SECURE 0x04000000 /* Apply additional security checks. */
-
- #define __LM_ID_CALLER -2
-
-diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
-index fcc943b..fa4b6b2 100644
---- a/sysdeps/generic/ldsodefs.h
-+++ b/sysdeps/generic/ldsodefs.h
-@@ -824,11 +824,9 @@ extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *),
-
- /* Open the shared object NAME and map in its segments.
- LOADER's DT_RPATH is used in searching for NAME.
-- If the object is already opened, returns its existing map.
-- For preloaded shared objects PRELOADED is set to a non-zero
-- value to allow additional security checks. */
-+ If the object is already opened, returns its existing map. */
- extern struct link_map *_dl_map_object (struct link_map *loader,
-- const char *name, int preloaded,
-+ const char *name,
- int type, int trace_mode, int mode,
- Lmid_t nsid)
- internal_function attribute_hidden;
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-dl_close-scope-handling.diff eglibc-2.11.3/debian/patches/any/cvs-dl_close-scope-handling.diff
--- eglibc-2.11.2/debian/patches/any/cvs-dl_close-scope-handling.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-dl_close-scope-handling.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,23 @@
+2011-08-24 Andreas Schwab <schwab@redhat.com>
+
+ * elf/dl-close.c (_dl_close_worker): Reset private search list if
+ it wasn't used.
+
+diff --git a/elf/dl-close.c b/elf/dl-close.c
+index 4cf98c3..8fb55d0 100644
+--- a/elf/dl-close.c
++++ b/elf/dl-close.c
+@@ -430,6 +430,13 @@ _dl_close_worker (struct link_map *map)
+
+ imap->l_scope_max = new_size;
+ }
++ else if (new_list != NULL)
++ {
++ /* We didn't change the scope array, so reset the search
++ list. */
++ imap->l_searchlist.r_list = NULL;
++ imap->l_searchlist.r_nlist = 0;
++ }
+
+ /* The loader is gone, so mark the object as not having one.
+ Note: l_idx != IDX_STILL_USED -> object will be removed. */
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-dlopen-tls.diff eglibc-2.11.3/debian/patches/any/cvs-dlopen-tls.diff
--- eglibc-2.11.2/debian/patches/any/cvs-dlopen-tls.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-dlopen-tls.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,93 @@
+2011-05-14 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12453]
+ * elf/dl-open.c (dl_open_worker): Delay calls to _dl_update_slotinfo
+ until all modules are registered in the DTV.
+ Patch mostly by Martin von Gagern <Martin.vGagern@gmx.net>.
+
+--- a/elf/dl-open.c
++++ b/elf/dl-open.c
+@@ -347,6 +347,7 @@ dl_open_worker (void *a)
+ /* If the file is not loaded now as a dependency, add the search
+ list of the newly loaded object to the scope. */
+ bool any_tls = false;
++ unsigned int first_static_tls = new->l_searchlist.r_nlist;
+ for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
+ {
+ struct link_map *imap = new->l_searchlist.r_list[i];
+@@ -425,30 +426,9 @@ dl_open_worker (void *a)
+ might have to increase its size. */
+ _dl_add_to_slotinfo (imap);
+
+- if (imap->l_need_tls_init)
+- {
+- /* For static TLS we have to allocate the memory here
+- and now. This includes allocating memory in the DTV.
+- But we cannot change any DTV other than our own. So,
+- if we cannot guarantee that there is room in the DTV
+- we don't even try it and fail the load.
+-
+- XXX We could track the minimum DTV slots allocated in
+- all threads. */
+- if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS)
+- _dl_signal_error (0, "dlopen", NULL, N_("\
+-cannot load any more object with static TLS"));
+-
+- imap->l_need_tls_init = 0;
+-#ifdef SHARED
+- /* Update the slot information data for at least the
+- generation of the DSO we are allocating data for. */
+- _dl_update_slotinfo (imap->l_tls_modid);
+-#endif
+-
+- GL(dl_init_static_tls) (imap);
+- assert (imap->l_need_tls_init == 0);
+- }
++ if (imap->l_need_tls_init
++ && first_static_tls == new->l_searchlist.r_nlist)
++ first_static_tls = i;
+
+ /* We have to bump the generation counter. */
+ any_tls = true;
+@@ -460,6 +440,40 @@ cannot load any more object with static TLS"));
+ _dl_fatal_printf (N_("\
+ TLS generation counter wrapped! Please report this."));
+
++ /* We need a second pass for static tls data, because _dl_update_slotinfo
++ must not be run while calls to _dl_add_to_slotinfo are still pending. */
++ for (unsigned int i = first_static_tls; i < new->l_searchlist.r_nlist; ++i)
++ {
++ struct link_map *imap = new->l_searchlist.r_list[i];
++
++ if (imap->l_need_tls_init
++ && ! imap->l_init_called
++ && imap->l_tls_blocksize > 0)
++ {
++ /* For static TLS we have to allocate the memory here and
++ now. This includes allocating memory in the DTV. But we
++ cannot change any DTV other than our own. So, if we
++ cannot guarantee that there is room in the DTV we don't
++ even try it and fail the load.
++
++ XXX We could track the minimum DTV slots allocated in
++ all threads. */
++ if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS)
++ _dl_signal_error (0, "dlopen", NULL, N_("\
++cannot load any more object with static TLS"));
++
++ imap->l_need_tls_init = 0;
++#ifdef SHARED
++ /* Update the slot information data for at least the
++ generation of the DSO we are allocating data for. */
++ _dl_update_slotinfo (imap->l_tls_modid);
++#endif
++
++ GL(dl_init_static_tls) (imap);
++ assert (imap->l_need_tls_init == 0);
++ }
++ }
++
+ /* Run the initializer functions of new objects. */
+ _dl_init (new, args->argc, args->argv, args->env);
+
+
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-dont-expand-dst-twice.diff eglibc-2.11.3/debian/patches/any/cvs-dont-expand-dst-twice.diff
--- eglibc-2.11.2/debian/patches/any/cvs-dont-expand-dst-twice.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-dont-expand-dst-twice.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,45 +0,0 @@
-2010-10-18 Andreas Schwab <schwab@redhat.com>
-
- * elf/dl-open.c (dl_open_worker): Don't expand DST here, let
- _dl_map_object do it.
-
-diff --git a/elf/dl-open.c b/elf/dl-open.c
-index 754a263..c394b3f 100644
---- a/elf/dl-open.c
-+++ b/elf/dl-open.c
-@@ -221,35 +221,6 @@ dl_open_worker (void *a)
-
- assert (_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT);
-
-- /* Maybe we have to expand a DST. */
-- if (__builtin_expect (dst != NULL, 0))
-- {
-- size_t len = strlen (file);
--
-- /* Determine how much space we need. We have to allocate the
-- memory locally. */
-- size_t required = DL_DST_REQUIRED (call_map, file, len,
-- _dl_dst_count (dst, 0));
--
-- /* Get space for the new file name. */
-- char *new_file = (char *) alloca (required + 1);
--
-- /* Generate the new file name. */
-- _dl_dst_substitute (call_map, file, new_file, 0);
--
-- /* If the substitution failed don't try to load. */
-- if (*new_file == '\0')
-- _dl_signal_error (0, "dlopen", NULL,
-- N_("empty dynamic string token substitution"));
--
-- /* Now we have a new file name. */
-- file = new_file;
--
-- /* It does not matter whether call_map is set even if we
-- computed it only because of the DST. Since the path contains
-- a slash the value is not used. See dl-load.c. */
-- }
--
- /* Load the named object. */
- struct link_map *new;
- args->map = new = _dl_map_object (call_map, file, 0, lt_loaded, 0,
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-flush-cache-textrels.diff eglibc-2.11.3/debian/patches/any/cvs-flush-cache-textrels.diff
--- eglibc-2.11.2/debian/patches/any/cvs-flush-cache-textrels.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-flush-cache-textrels.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-2010-06-02 Kirill A. Shutemov <kirill@shutemov.name>
-
- * elf/dl-reloc.c: Flush cache after solving TEXTRELs if arch
- requires it.
-
-diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
-index 6c00691..23cb59c 100644
---- a/elf/dl-reloc.c
-+++ b/elf/dl-reloc.c
-@@ -1,5 +1,5 @@
- /* Relocate a shared object and resolve its references to other loaded objects.
-- Copyright (C) 1995-2006, 2008, 2009 Free Software Foundation, Inc.
-+ Copyright (C) 1995-2006, 2008, 2009, 2010 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
-@@ -307,6 +307,10 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
- goto call_error;
- }
-
-+#ifdef CLEAR_CACHE
-+ CLEAR_CACHE (textrels->start, textrels->start + textrels->len);
-+#endif
-+
- textrels = textrels->next;
- }
-
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-getaddrinfo-single-lookup.diff eglibc-2.11.3/debian/patches/any/cvs-getaddrinfo-single-lookup.diff
--- eglibc-2.11.2/debian/patches/any/cvs-getaddrinfo-single-lookup.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-getaddrinfo-single-lookup.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,19 @@
+2011-06-27 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12350]
+ * nscd/aicache.c (addhstaiX): Restore only RES_USE_INET6
+ bit from old_res_options.
+
+diff --git a/nscd/aicache.c b/nscd/aicache.c
+index 3190a13..6c8d83a 100644
+--- a/nscd/aicache.c
++++ b/nscd/aicache.c
+@@ -534,7 +534,7 @@ next_nip:
+ }
+
+ out:
+- _res.options = old_res_options;
++ _res.options |= old_res_options & RES_USE_INET6;
+
+ if (dataset != NULL && !alloca_used)
+ {
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-nptl-pthread-race.diff eglibc-2.11.3/debian/patches/any/cvs-nptl-pthread-race.diff
--- eglibc-2.11.2/debian/patches/any/cvs-nptl-pthread-race.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-nptl-pthread-race.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,167 @@
+2011-09-15 Andreas Schwab <schwab@redhat.com>
+
+ * sysdeps/pthread/list.h: Define only list_t if __need_list_t is
+ defined.
+ (list_add): Add atomic_write_barrier.
+ * descr.h: Define __need_list_t before including <list.h>.
+ * nptl-init.c: Include <list.h>
+ * allocatestack.c: Likewise.
+
+---
+ nptl/allocatestack.c | 1 +
+ nptl/descr.h | 1 +
+ nptl/nptl-init.c | 1 +
+ nptl/sysdeps/pthread/list.h | 31 +++++++++++++++++++++++--------
+ nptl_db/ChangeLog | 4 ++++
+ nptl_db/thread_dbP.h | 3 ++-
+ 6 files changed, 32 insertions(+), 9 deletions(-)
+
+--- a/nptl/allocatestack.c
++++ b/nptl/allocatestack.c
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <dl-sysdep.h>
+ #include <tls.h>
++#include <list.h>
+ #include <lowlevellock.h>
+ #include <kernel-features.h>
+
+--- a/nptl/descr.h
++++ b/nptl/descr.h
+@@ -26,6 +26,7 @@
+ #include <stdbool.h>
+ #include <sys/types.h>
+ #include <hp-timing.h>
++#define __need_list_t
+ #include <list.h>
+ #include <lowlevellock.h>
+ #include <pthreaddef.h>
+--- a/nptl/nptl-init.c
++++ b/nptl/nptl-init.c
+@@ -29,6 +29,7 @@
+ #include <atomic.h>
+ #include <ldsodefs.h>
+ #include <tls.h>
++#include <list.h>
+ #include <fork.h>
+ #include <version.h>
+ #include <shlib-compat.h>
+--- a/nptl/sysdeps/pthread/list.h
++++ b/nptl/sysdeps/pthread/list.h
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2002, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 2002, 2009, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+@@ -18,27 +18,39 @@
+ 02111-1307 USA. */
+
+ #ifndef _LIST_H
+-#define _LIST_H 1
++
++#ifndef __need_list_t
++# define _LIST_H 1
++#endif
+
+ /* The definitions of this file are adopted from those which can be
+ found in the Linux kernel headers to enable people familiar with
+ the latter find their way in these sources as well. */
+
+
++#if defined __need_list_t || defined _LIST_H
++# ifndef __list_t_defined
++# define __list_t_defined
+ /* Basic type for the double-link list. */
+ typedef struct list_head
+ {
+ struct list_head *next;
+ struct list_head *prev;
+ } list_t;
++# endif
++# undef __need_list_t
++#endif
++
++#ifdef _LIST_H
+
++# include <atomic.h>
+
+ /* Define a variable with the head and tail of the list. */
+-#define LIST_HEAD(name) \
++# define LIST_HEAD(name) \
+ list_t name = { &(name), &(name) }
+
+ /* Initialize a new list head. */
+-#define INIT_LIST_HEAD(ptr) \
++# define INIT_LIST_HEAD(ptr) \
+ (ptr)->next = (ptr)->prev = (ptr)
+
+
+@@ -49,6 +61,7 @@
+ newp->next = head->next;
+ newp->prev = head;
+ head->next->prev = newp;
++ atomic_write_barrier ();
+ head->next = newp;
+ }
+
+@@ -78,26 +91,28 @@
+
+
+ /* Get typed element from list at a given position. */
+-#define list_entry(ptr, type, member) \
++# define list_entry(ptr, type, member) \
+ ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
+
+
+
+ /* Iterate forward over the elements of the list. */
+-#define list_for_each(pos, head) \
++# define list_for_each(pos, head) \
+ for (pos = (head)->next; pos != (head); pos = pos->next)
+
+
+ /* Iterate forward over the elements of the list. */
+-#define list_for_each_prev(pos, head) \
++# define list_for_each_prev(pos, head) \
+ for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
+
+ /* Iterate backwards over the elements list. The list elements can be
+ removed from the list while doing this. */
+-#define list_for_each_prev_safe(pos, p, head) \
++# define list_for_each_prev_safe(pos, p, head) \
+ for (pos = (head)->prev, p = pos->prev; \
+ pos != (head); \
+ pos = p, p = pos->prev)
+
++#endif /* _LIST_H */
++
+ #endif /* list.h */
+--- a/nptl_db/ChangeLog
++++ b/nptl_db/ChangeLog
+@@ -1,3 +1,7 @@
++2011-09-15 Andreas Schwab <schwab@redhat.com>
++
++ * thread_dbP.h: Include <list.h>
++
+ 2009-08-23 Roland McGrath <roland@redhat.com>
+
+ * td_ta_map_lwp2thr.c (__td_ta_lookup_th_unique): Move ta_ok check
+--- a/nptl_db/thread_dbP.h
++++ b/nptl_db/thread_dbP.h
+@@ -1,5 +1,5 @@
+ /* Private header for thread debug library
+- Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
++ Copyright (C) 2003, 2004, 2007, 2011 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
+@@ -29,6 +29,7 @@
+ #include "proc_service.h"
+ #include "thread_db.h"
+ #include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */
++#include <list.h>
+
+ /* Indeces for the symbol names. */
+ enum
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-pthread-setgroups.diff eglibc-2.11.3/debian/patches/any/cvs-pthread-setgroups.diff
--- eglibc-2.11.2/debian/patches/any/cvs-pthread-setgroups.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-pthread-setgroups.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,113 @@
+2011-01-14 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #10563]
+ * sysdeps/unix/sysv/linux/i386/setgroups.c: Use INLINE_SETXID_SYSCALL
+ to make the syscall.
+ * sysdeps/unix/sysv/linux/setgroups.c: New file.
+ * nptl/sysdeps/pthread/setxid.h (__SETXID_1): Add cast to assignment.
+ (__SETXID_2): Likewise.
+ (__SETXID_3): Likewise.
+
+diff --git a/nptl/sysdeps/pthread/setxid.h b/nptl/sysdeps/pthread/setxid.h
+index aebdbd2..043ffd2 100644
+--- a/nptl/sysdeps/pthread/setxid.h
++++ b/nptl/sysdeps/pthread/setxid.h
+@@ -20,11 +20,11 @@
+ #include <sysdep.h>
+
+ #define __SETXID_1(cmd, arg1) \
+- cmd.id[0] = arg1
++ cmd.id[0] = (long int) arg1
+ #define __SETXID_2(cmd, arg1, arg2) \
+- __SETXID_1 (cmd, arg1); cmd.id[1] = arg2
++ __SETXID_1 (cmd, arg1); cmd.id[1] = (long int) arg2
+ #define __SETXID_3(cmd, arg1, arg2, arg3) \
+- __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = arg3
++ __SETXID_2 (cmd, arg1, arg2); cmd.id[2] = (long int) arg3
+
+ #ifdef SINGLE_THREAD
+ # define INLINE_SETXID_SYSCALL(name, nr, args...) \
+diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c
+index 10f5b7c..42f7702 100644
+--- a/sysdeps/unix/sysv/linux/i386/setgroups.c
++++ b/sysdeps/unix/sysv/linux/i386/setgroups.c
+@@ -25,6 +26,7 @@
+ #include <sys/syscall.h>
+ #include <bp-checks.h>
+
++#include <setxid.h>
+ #include <linux/posix_types.h>
+ #include <kernel-features.h>
+
+@@ -44,7 +46,7 @@ int
+ setgroups (size_t n, const gid_t *groups)
+ {
+ #if __ASSUME_32BITUIDS > 0
+- return INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
++ return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
+ #else
+ if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
+ {
+@@ -62,7 +64,8 @@ setgroups (size_t n, const gid_t *groups)
+ int result;
+ int saved_errno = errno;
+
+- result = INLINE_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
++ result = INLINE_SETXID_SYSCALL (setgroups32, 2, n,
++ CHECK_N (groups, n));
+ if (result == 0 || errno != ENOSYS)
+ return result;
+
+@@ -80,7 +83,8 @@ setgroups (size_t n, const gid_t *groups)
+ }
+ }
+
+- return INLINE_SYSCALL (setgroups, 2, n, CHECK_N (kernel_groups, n));
++ return INLINE_SETXID_SYSCALL (setgroups, 2, n,
++ CHECK_N (kernel_groups, n));
+ }
+ #endif
+ }
+diff --git a/sysdeps/unix/sysv/linux/setgroups.c b/sysdeps/unix/sysv/linux/setgroups.c
+new file mode 100644
+index 0000000..9649974
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/setgroups.c
+@@ -0,0 +1,37 @@
++/* Copyright (C) 1997,1998,2000,2002,2004,2006,2011
++ 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 <grp.h>
++#include <setxid.h>
++#include <sysdep.h>
++
++
++/* Set the group set for the current user to GROUPS (N of them). For
++ Linux we must convert the array of groups into the format that the
++ kernel expects. */
++int
++setgroups (size_t n, const gid_t *groups)
++{
++#ifdef __NR_setgroups32
++# error "wrong setgroups.c file used"
++#endif
++ return INLINE_SETXID_SYSCALL (setgroups, 2, n, groups);
++}
++libc_hidden_def (setgroups)
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-redirect-throw.diff eglibc-2.11.3/debian/patches/any/cvs-redirect-throw.diff
--- eglibc-2.11.2/debian/patches/any/cvs-redirect-throw.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-redirect-throw.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,99 +0,0 @@
-2010-06-07 Jakub Jelinek <jakub@redhat.com>
-
- * libio/stdio.h (sscanf, vsscanf): Use __REDIRECT_NTH instead of
- __REDIRECT followed by __THROW.
- * wcsmbs/wchar.h (swscanf, vswscanf): Likewise.
- * posix/getopt.h (getopt): Likewise.
-
-diff --git a/libio/stdio.h b/libio/stdio.h
-index 85542b1..bf16b3f 100644
---- a/libio/stdio.h
-+++ b/libio/stdio.h
-@@ -447,9 +447,9 @@ extern int __REDIRECT (fscanf, (FILE *__restrict __stream,
- __isoc99_fscanf) __wur;
- extern int __REDIRECT (scanf, (__const char *__restrict __format, ...),
- __isoc99_scanf) __wur;
--extern int __REDIRECT (sscanf, (__const char *__restrict __s,
-- __const char *__restrict __format, ...),
-- __isoc99_sscanf) __THROW;
-+extern int __REDIRECT_NTH (sscanf, (__const char *__restrict __s,
-+ __const char *__restrict __format, ...),
-+ __isoc99_sscanf);
- # else
- extern int __isoc99_fscanf (FILE *__restrict __stream,
- __const char *__restrict __format, ...) __wur;
-@@ -501,11 +501,11 @@ extern int __REDIRECT (vfscanf,
- extern int __REDIRECT (vscanf, (__const char *__restrict __format,
- _G_va_list __arg), __isoc99_vscanf)
- __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
--extern int __REDIRECT (vsscanf,
-- (__const char *__restrict __s,
-- __const char *__restrict __format, _G_va_list __arg),
-- __isoc99_vsscanf)
-- __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));
-+extern int __REDIRECT_NTH (vsscanf,
-+ (__const char *__restrict __s,
-+ __const char *__restrict __format,
-+ _G_va_list __arg), __isoc99_vsscanf)
-+ __attribute__ ((__format__ (__scanf__, 2, 0)));
- # else
- extern int __isoc99_vfscanf (FILE *__restrict __s,
- __const char *__restrict __format,
-diff --git a/posix/getopt.h b/posix/getopt.h
-index ff0251d..6e2fa27 100644
---- a/posix/getopt.h
-+++ b/posix/getopt.h
-@@ -1,5 +1,5 @@
- /* Declarations for getopt.
-- Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009
-+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010
- Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
-@@ -158,9 +158,9 @@ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
- additional functionality can be disable at runtime. This redirection
- helps to also do this at runtime. */
- # ifdef __REDIRECT
-- extern int __REDIRECT (getopt, (int ___argc, char *const *___argv,
-- const char *__shortopts),
-- __posix_getopt) __THROW;
-+ extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
-+ const char *__shortopts),
-+ __posix_getopt);
- # else
- extern int __posix_getopt (int ___argc, char *const *___argv,
- const char *__shortopts) __THROW;
-diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
-index 5a4e10e..061b105 100644
---- a/wcsmbs/wchar.h
-+++ b/wcsmbs/wchar.h
-@@ -658,10 +658,10 @@ extern int __REDIRECT (fwscanf, (__FILE *__restrict __stream,
- extern int __REDIRECT (wscanf, (__const wchar_t *__restrict __format, ...),
- __isoc99_wscanf)
- /* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
--extern int __REDIRECT (swscanf, (__const wchar_t *__restrict __s,
-- __const wchar_t *__restrict __format, ...),
-- __isoc99_swscanf)
-- __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
-+extern int __REDIRECT_NTH (swscanf, (__const wchar_t *__restrict __s,
-+ __const wchar_t *__restrict __format,
-+ ...), __isoc99_swscanf)
-+ /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
- # else
- extern int __isoc99_fwscanf (__FILE *__restrict __stream,
- __const wchar_t *__restrict __format, ...);
-@@ -712,10 +712,10 @@ extern int __REDIRECT (vfwscanf, (__FILE *__restrict __s,
- extern int __REDIRECT (vwscanf, (__const wchar_t *__restrict __format,
- __gnuc_va_list __arg), __isoc99_vwscanf)
- /* __attribute__ ((__format__ (__wscanf__, 1, 0))) */;
--extern int __REDIRECT (vswscanf, (__const wchar_t *__restrict __s,
-- __const wchar_t *__restrict __format,
-- __gnuc_va_list __arg), __isoc99_vswscanf)
-- __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
-+extern int __REDIRECT_NTH (vswscanf, (__const wchar_t *__restrict __s,
-+ __const wchar_t *__restrict __format,
-+ __gnuc_va_list __arg), __isoc99_vswscanf)
-+ /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
- # else
- extern int __isoc99_vfwscanf (__FILE *__restrict __s,
- __const wchar_t *__restrict __format,
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-resolv-different-nameserver.diff eglibc-2.11.3/debian/patches/any/cvs-resolv-different-nameserver.diff
--- eglibc-2.11.2/debian/patches/any/cvs-resolv-different-nameserver.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-resolv-different-nameserver.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,52 @@
+2011-06-15 Ulrich Drepper <drepper@gmail.com>
+
+ * resolv/res_send.c (__libc_res_nsend): Fix typos in last patch. We
+ need to dereference resplen2.
+
+2011-05-30 Ulrich Drepper <drepper@gmail.com>
+
+ [BZ #12684]
+ * resolv/res_send.c (__libc_res_nsend): Only go to the next name server
+ if both request failed.
+ (send_dg): In case of server errors clear resplen or *resplen2.
+
+---
+ resolv/res_send.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/resolv/res_send.c
++++ b/resolv/res_send.c
+@@ -546,7 +546,7 @@
+ ns, ansp, ansp2, nansp2, resplen2);
+ if (n < 0)
+ return (-1);
+- if (n == 0)
++ if (n == 0 && (buf2 == NULL || *resplen2 == 0))
+ goto next_ns;
+ } else {
+ /* Use datagrams. */
+@@ -556,7 +556,7 @@
+ ansp2, nansp2, resplen2);
+ if (n < 0)
+ return (-1);
+- if (n == 0)
++ if (n == 0 && (buf2 == NULL || *resplen2 == 0))
+ goto next_ns;
+ if (v_circuit)
+ // XXX Check whether both requests failed or
+@@ -1279,10 +1279,14 @@
+ (*thisresplen > *thisanssiz)
+ ? *thisanssiz : *thisresplen);
+
+- if (recvresp1 || (buf2 != NULL && recvresp2))
++ if (recvresp1 || (buf2 != NULL && recvresp2)) {
++ *resplen2 = 0;
+ return resplen;
++ }
+ if (buf2 != NULL)
+ {
++ /* No data from the first reply. */
++ resplen = 0;
+ /* We are waiting for a possible second reply. */
+ if (hp->id == anhp->id)
+ recvresp1 = 1;
diff -Nru eglibc-2.11.2/debian/patches/any/cvs-statvfs-mount-flags.diff eglibc-2.11.3/debian/patches/any/cvs-statvfs-mount-flags.diff
--- eglibc-2.11.2/debian/patches/any/cvs-statvfs-mount-flags.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/cvs-statvfs-mount-flags.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,191 @@
+2011-02-28 Aurelien Jarno <aurelien@aurel32.net>
+
+ * ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h (struct statfs,
+ struct statfs64): Add f_flags field.
+
+2010-08-12 Joseph Myers <joseph@codesourcery.com>
+
+ * ports/sysdeps/unix/sysv/linux/mips/bits/statfs.h (struct statfs,
+ struct statfs64): Add f_flags field.
+
+2010-08-11 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/bits/statfs.h (struct statfs): Add f_flags
+ field.
+ (struct statfs64): Likewise.
+ (_STATFS_F_FLAGS): Define.
+ * sysdeps/unix/sysv/linux/s390/bits/statfs.h: Likewise.
+ * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
+ Don't define if __ASSUME_STATFS_F_FLAGS is defined.
+ (ST_VALID): Define locally.
+ (INTERNAL_STATVFS): If f_flags has ST_VALID set don't call
+ __statvfs_getflags, use the provided value.
+ * sysdeps/unix/sysv/linux/kernel-features.h: Define
+ __ASSUME_STATFS_F_FLAGS.
+
+---
+ ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h | 6 ++++--
+ ports/sysdeps/unix/sysv/linux/mips/bits/statfs.h | 6 ++++--
+ sysdeps/unix/sysv/linux/bits/statfs.h | 7 +++++--
+ sysdeps/unix/sysv/linux/internal_statvfs.c | 22 +++++++++++++++++-----
+ sysdeps/unix/sysv/linux/kernel-features.h | 5 +++++
+ sysdeps/unix/sysv/linux/s390/bits/statfs.h | 7 +++++--
+ 6 files changed, 40 insertions(+), 13 deletions(-)
+
+--- a/sysdeps/unix/sysv/linux/bits/statfs.h
++++ b/sysdeps/unix/sysv/linux/bits/statfs.h
+@@ -42,7 +42,8 @@
+ __fsid_t f_fsid;
+ __SWORD_TYPE f_namelen;
+ __SWORD_TYPE f_frsize;
+- __SWORD_TYPE f_spare[5];
++ __SWORD_TYPE f_flags;
++ __SWORD_TYPE f_spare[4];
+ };
+
+ #ifdef __USE_LARGEFILE64
+@@ -58,10 +59,12 @@
+ __fsid_t f_fsid;
+ __SWORD_TYPE f_namelen;
+ __SWORD_TYPE f_frsize;
+- __SWORD_TYPE f_spare[5];
++ __SWORD_TYPE f_flags;
++ __SWORD_TYPE f_spare[4];
+ };
+ #endif
+
+ /* Tell code we have these members. */
+ #define _STATFS_F_NAMELEN
+ #define _STATFS_F_FRSIZE
++#define _STATFS_F_FLAGS
+--- a/sysdeps/unix/sysv/linux/internal_statvfs.c
++++ b/sysdeps/unix/sysv/linux/internal_statvfs.c
+@@ -29,6 +29,11 @@
+ #include <sys/statfs.h>
+ #include <sys/statvfs.h>
+ #include "linux_fsinfo.h"
++#include "kernel-features.h"
++
++
++/* Special internal-only bit value. */
++#define ST_VALID 0x0020
+
+
+ #ifndef STATFS
+@@ -37,6 +42,7 @@
+ # define INTERNAL_STATVFS __internal_statvfs
+
+
++# ifndef __ASSUME_STATFS_F_FLAGS
+ int
+ __statvfs_getflags (const char *name, int fstype, struct stat64 *st)
+ {
+@@ -193,6 +199,7 @@
+
+ return result;
+ }
++# endif
+ #else
+ extern int __statvfs_getflags (const char *name, int fstype,
+ struct stat64 *st);
+@@ -234,9 +241,14 @@
+ /* XXX I have no idea how to compute f_favail. Any idea??? */
+ buf->f_favail = buf->f_ffree;
+
+- /* Determining the flags is tricky. We have to read /proc/mounts or
+- the /etc/mtab file and search for the entry which matches the given
+- file. The way we can test for matching filesystem is using the
+- device number. */
+- buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st);
++#ifndef __ASSUME_STATFS_F_FLAGS
++ if ((fsbuf->f_flags & ST_VALID) == 0)
++ /* Determining the flags is tricky. We have to read /proc/mounts or
++ the /etc/mtab file and search for the entry which matches the given
++ file. The way we can test for matching filesystem is using the
++ device number. */
++ buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st);
++ else
++#endif
++ buf->f_flag = fsbuf->f_flags ^ ST_VALID;
+ }
+--- a/sysdeps/unix/sysv/linux/kernel-features.h
++++ b/sysdeps/unix/sysv/linux/kernel-features.h
+@@ -565,3 +565,8 @@
+ #if __LINUX_KERNEL_VERSION >= 0x020620
+ # define __ASSUME_F_GETOWN_EX 1
+ #endif
++
++/* statfs fills in f_flags since 2.6.36. */
++#if __LINUX_KERNEL_VERSION >= 0x020624
++# define __ASSUME_STATFS_F_FLAGS 1
++#endif
+--- a/sysdeps/unix/sysv/linux/s390/bits/statfs.h
++++ b/sysdeps/unix/sysv/linux/s390/bits/statfs.h
+@@ -42,7 +42,8 @@
+ __fsid_t f_fsid;
+ int f_namelen;
+ int f_frsize;
+- int f_spare[5];
++ int f_flags;
++ int f_spare[4];
+ };
+
+ #ifdef __USE_LARGEFILE64
+@@ -58,10 +59,12 @@
+ __fsid_t f_fsid;
+ int f_namelen;
+ int f_frsize;
+- int f_spare[5];
++ int f_flags;
++ int f_spare[4];
+ };
+ #endif
+
+ /* Tell code we have this member. */
+ #define _STATFS_F_NAMELEN
+ #define _STATFS_F_FRSIZE
++#define _STATFS_F_FLAGS
+--- a/ports/sysdeps/unix/sysv/linux/mips/bits/statfs.h
++++ b/ports/sysdeps/unix/sysv/linux/mips/bits/statfs.h
+@@ -45,7 +45,8 @@
+ /* Linux specials */
+ __fsid_t f_fsid;
+ long int f_namelen;
+- long int f_spare[6];
++ long int f_flags;
++ long int f_spare[5];
+ };
+
+ #ifdef __USE_LARGEFILE64
+@@ -64,7 +65,8 @@
+ /* Linux specials */
+ __fsid_t f_fsid;
+ long int f_namelen;
+- long int f_spare[6];
++ long int f_flags;
++ long int f_spare[5];
+ };
+ #endif
+
+--- a/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h
++++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h
+@@ -42,7 +42,8 @@
+ __fsid_t f_fsid;
+ int f_namelen;
+ int f_frsize;
+- int f_spare[5];
++ int f_flags;
++ int f_spare[4];
+ };
+
+ #ifdef __USE_LARGEFILE64
+@@ -58,7 +59,8 @@
+ __fsid_t f_fsid;
+ int f_namelen;
+ int f_frsize;
+- int f_spare[5];
++ int f_flags;
++ int f_spare[4];
+ };
+ #endif
+
diff -Nru eglibc-2.11.2/debian/patches/any/local-disable-test-tgmath2.diff eglibc-2.11.3/debian/patches/any/local-disable-test-tgmath2.diff
--- eglibc-2.11.2/debian/patches/any/local-disable-test-tgmath2.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/local-disable-test-tgmath2.diff 2011-12-13 13:41:29.000000000 +0000
@@ -4,12 +4,12 @@
--- a/math/Makefile
+++ b/math/Makefile
-@@ -92,7 +92,7 @@
- # Rules for the test suite.
+@@ -93,7 +93,7 @@
tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
-- bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2
-+ bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int
+ bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \
+- test-tgmath2 test-powl
++ test-powl
# We do the `long double' tests only if this data type is available and
# distinct from `double'.
test-longdouble-yes = test-ldouble test-ildoubl
diff -Nru eglibc-2.11.2/debian/patches/any/submitted-bits-fcntl_h-at.diff eglibc-2.11.3/debian/patches/any/submitted-bits-fcntl_h-at.diff
--- eglibc-2.11.2/debian/patches/any/submitted-bits-fcntl_h-at.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/submitted-bits-fcntl_h-at.diff 2011-12-13 13:41:29.000000000 +0000
@@ -28,27 +28,27 @@
constants.
---
- io/fcntl.h | 12 ------------
- ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h | 13 +++++++++++++
- ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h | 15 +++++++++++++++
- ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h | 13 +++++++++++++
- ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h | 13 +++++++++++++
- ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h | 13 +++++++++++++
- ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h | 13 +++++++++++++
- ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h | 13 +++++++++++++
- sysdeps/mach/hurd/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/i386/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/ia64/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/s390/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/sh/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/sparc/bits/fcntl.h | 13 +++++++++++++
- sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h | 13 +++++++++++++
- 16 files changed, 197 insertions(+), 12 deletions(-)
+ io/fcntl.h | 14 --------------
+ ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h | 15 +++++++++++++++
+ ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h | 17 +++++++++++++++++
+ ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h | 15 +++++++++++++++
+ ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h | 15 +++++++++++++++
+ ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h | 15 +++++++++++++++
+ ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h | 15 +++++++++++++++
+ ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/mach/hurd/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/i386/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/ia64/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/s390/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/sh/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/sparc/bits/fcntl.h | 15 +++++++++++++++
+ sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h | 15 +++++++++++++++
+ 16 files changed, 227 insertions(+), 14 deletions(-)
--- a/io/fcntl.h
+++ b/io/fcntl.h
-@@ -56,18 +56,6 @@
+@@ -102,20 +102,6 @@
# define SEEK_END 2 /* Seek from end of file. */
#endif /* XPG */
@@ -60,6 +60,8 @@
-# define AT_REMOVEDIR 0x200 /* Remove directory instead of
- unlinking file. */
-# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
+-# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
+- traversal. */
-# define AT_EACCESS 0x200 /* Test access permitted for
- effective IDs, not real IDs. */
-#endif
@@ -69,7 +71,7 @@
--- a/sysdeps/mach/hurd/bits/fcntl.h
+++ b/sysdeps/mach/hurd/bits/fcntl.h
-@@ -219,3 +219,16 @@
+@@ -219,3 +219,18 @@
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
#endif
@@ -83,12 +85,14 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
--- a/sysdeps/unix/sysv/linux/i386/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/i386/bits/fcntl.h
-@@ -227,6 +227,19 @@
+@@ -234,6 +234,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -101,6 +105,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -110,7 +116,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h
-@@ -221,6 +221,19 @@
+@@ -229,6 +229,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -123,6 +129,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -132,7 +140,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h
-@@ -227,6 +227,19 @@
+@@ -234,6 +234,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -145,6 +153,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -154,7 +164,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/fcntl.h
-@@ -247,6 +247,19 @@
+@@ -255,6 +255,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -167,6 +177,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -176,7 +188,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/sh/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/sh/bits/fcntl.h
-@@ -227,6 +227,19 @@
+@@ -235,6 +235,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -189,6 +201,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -198,7 +212,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h
-@@ -246,6 +246,19 @@
+@@ -245,6 +245,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -211,6 +225,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -220,7 +236,7 @@
#ifdef __USE_GNU
--- a/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h
+++ b/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h
-@@ -241,6 +241,19 @@
+@@ -249,6 +249,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -233,6 +249,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -242,7 +260,7 @@
#ifdef __USE_GNU
--- a/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h
-@@ -215,6 +215,19 @@
+@@ -223,6 +223,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -255,6 +273,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -264,7 +284,7 @@
#ifdef __USE_GNU
--- a/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h
-@@ -179,3 +179,18 @@
+@@ -179,3 +179,20 @@
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
#endif
@@ -278,6 +298,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -285,7 +307,7 @@
+
--- a/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h
-@@ -227,6 +227,19 @@
+@@ -234,6 +234,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -298,6 +320,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -307,7 +331,7 @@
#ifdef __USE_GNU
--- a/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h
-@@ -182,6 +182,19 @@
+@@ -182,6 +182,21 @@
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
#endif
@@ -320,6 +344,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -329,7 +355,7 @@
/* Provide kernel hint to read ahead. */
--- a/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h
-@@ -198,6 +198,19 @@
+@@ -229,6 +229,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -342,6 +368,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -351,7 +379,7 @@
#ifdef __USE_GNU
--- a/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h
-@@ -226,6 +226,19 @@
+@@ -233,6 +233,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -364,6 +392,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
@@ -373,7 +403,7 @@
#ifdef __USE_GNU
--- a/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h
+++ b/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h
-@@ -240,6 +240,19 @@
+@@ -247,6 +247,21 @@
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
#endif
@@ -386,6 +416,8 @@
+# define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+# define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+#endif
diff -Nru eglibc-2.11.2/debian/patches/any/submitted-etc-resolv.conf.diff eglibc-2.11.3/debian/patches/any/submitted-etc-resolv.conf.diff
--- eglibc-2.11.2/debian/patches/any/submitted-etc-resolv.conf.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/submitted-etc-resolv.conf.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,42 +0,0 @@
-2009-11-08 Aurelien Jarno <aurelien@aurel32.net>
-
- * resolv/res_init.c (__res_vinit): Initialize nameserver to the
- loopback address if none specified.
-
----
- resolv/res_init.c | 17 ++++++++++-------
- 1 file changed, 10 insertions(+), 7 deletions(-)
-
---- a/resolv/res_init.c
-+++ b/resolv/res_init.c
-@@ -176,13 +176,6 @@
- statp->id = res_randomid();
- }
-
--#ifdef USELOOPBACK
-- statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
--#else
-- statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
--#endif
-- statp->nsaddr.sin_family = AF_INET;
-- statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
- statp->nscount = 0;
- statp->ndots = 1;
- statp->pfcode = 0;
-@@ -433,6 +426,16 @@
- #endif
- (void) fclose(fp);
- }
-+ if (statp->nscount == 0) {
-+ statp->nscount = 1;
-+#ifdef USELOOPBACK
-+ statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
-+#else
-+ statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
-+#endif
-+ statp->nsaddr.sin_family = AF_INET;
-+ statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
-+ }
- if (statp->defdname[0] == 0 &&
- __gethostname(buf, sizeof(statp->defdname) - 1) == 0 &&
- (cp = strchr(buf, '.')) != NULL)
diff -Nru eglibc-2.11.2/debian/patches/any/submitted-longdouble.diff eglibc-2.11.3/debian/patches/any/submitted-longdouble.diff
--- eglibc-2.11.2/debian/patches/any/submitted-longdouble.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/submitted-longdouble.diff 2011-12-13 13:41:29.000000000 +0000
@@ -4,10 +4,10 @@
--- a/math/Makefile
+++ b/math/Makefile
-@@ -93,13 +93,17 @@
- tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
+@@ -94,13 +94,17 @@
test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
- bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int
+ bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \
+ test-powl
-# We do the `long double' tests only if this data type is available and
-# distinct from `double'.
+# We do the `long double' tests only if this data type is available.
@@ -25,7 +25,7 @@
test-ifloat test-idouble
libm-tests.o = $(addsuffix .o,$(libm-tests))
-@@ -173,11 +177,15 @@
+@@ -175,11 +179,15 @@
ifneq ($(long-double-fcts),yes)
# The `double' and `long double' types are the same on this machine.
# We won't compile the `long double' code at all. Tell the `double' code
diff -Nru eglibc-2.11.2/debian/patches/any/submitted-resolv-assert.diff eglibc-2.11.3/debian/patches/any/submitted-resolv-assert.diff
--- eglibc-2.11.2/debian/patches/any/submitted-resolv-assert.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/submitted-resolv-assert.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,59 @@
+2011-07-21 Aurelien Jarno <aurel32@debian.org>
+
+ * resolv/res_query.c(__libc_res_nquery): Assign hp and hp2
+ depending n and resplen2 to catch cases where answer
+ equals answerp2.
+
+diff --git a/resolv/res_query.c b/resolv/res_query.c
+index 2f7cfaa..405fa68 100644
+--- a/resolv/res_query.c
++++ b/resolv/res_query.c
+@@ -122,6 +122,7 @@ __libc_res_nquery(res_state statp,
+ int *resplen2)
+ {
+ HEADER *hp = (HEADER *) answer;
++ HEADER *hp2;
+ int n, use_malloc = 0;
+ u_int oflags = statp->_flags;
+
+@@ -239,26 +240,25 @@ __libc_res_nquery(res_state statp,
+ /* __libc_res_nsend might have reallocated the buffer. */
+ hp = (HEADER *) *answerp;
+
+- /* We simplify the following tests by assigning HP to HP2. It
+- is easy to verify that this is the same as ignoring all
+- tests of HP2. */
+- HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
+-
+- if (n < (int) sizeof (HEADER) && answerp2 != NULL
+- && *resplen2 > (int) sizeof (HEADER))
++ /* We simplify the following tests by assigning HP to HP2 or
++ vice versa. It is easy to verify that this is the same as
++ ignoring all tests of HP or HP2. */
++ if (answerp2 == NULL || *resplen2 < (int) sizeof (HEADER))
+ {
+- /* Special case of partial answer. */
+- assert (hp != hp2);
+- hp = hp2;
++ hp2 = hp;
+ }
+- else if (answerp2 != NULL && *resplen2 < (int) sizeof (HEADER)
+- && n > (int) sizeof (HEADER))
++ else
+ {
+- /* Special case of partial answer. */
+- assert (hp != hp2);
+- hp2 = hp;
++ hp2 = (HEADER *) *answerp2;
++ if (n < (int) sizeof (HEADER))
++ {
++ hp = hp2;
++ }
+ }
+
++ /* Make sure both hp and hp2 are defined */
++ assert((hp != NULL) && (hp2 != NULL));
++
+ if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
+ && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
+ #ifdef DEBUG
diff -Nru eglibc-2.11.2/debian/patches/any/submitted-resolv.conf-thread.diff eglibc-2.11.3/debian/patches/any/submitted-resolv.conf-thread.diff
--- eglibc-2.11.2/debian/patches/any/submitted-resolv.conf-thread.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/any/submitted-resolv.conf-thread.diff 2011-12-13 13:41:29.000000000 +0000
@@ -1,3 +1,8 @@
+2011-06-23 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * resolv/res_libc.c (__res_initstamp): Declare unconditionally.
+ (__res_maybe_init): Avoid double-checked locking.
+
2010-09-15 Aurelien Jarno <aurelien@aurel32.net>
* resolv/res_libc (__res_maybe_init): Ask other threads to
@@ -6,6 +11,22 @@
--- a/resolv/res_libc.c
+++ b/resolv/res_libc.c
+@@ -28,6 +28,7 @@
+ out) since res_init() should go into libc.so but the rest of that
+ file should not. */
+
++__libc_lock_define_initialized (static, lock);
+ extern unsigned long long int __res_initstamp attribute_hidden;
+ /* We have atomic increment operations on 64-bit platforms. */
+ #if __WORDSIZE == 64
+@@ -35,7 +36,6 @@
+ # define atomicincunlock(lock) (void) 0
+ # define atomicinc(var) catomic_increment (&(var))
+ #else
+-__libc_lock_define_initialized (static, lock);
+ # define atomicinclock(lock) __libc_lock_lock (lock)
+ # define atomicincunlock(lock) __libc_lock_unlock (lock)
+ # define atomicinc(var) ++var
@@ -100,10 +100,13 @@
if (resp->options & RES_INIT) {
@@ -14,12 +35,12 @@
- || ((ret == 0) && (last_mtime != statbuf.st_mtime))) {
- if (ret == 0)
- last_mtime = statbuf.st_mtime;
++ __libc_lock_lock (lock);
+ if ((ret == 0) && (last_mtime != statbuf.st_mtime)) {
+ last_mtime = statbuf.st_mtime;
-+ atomicinclock (lock);
+ atomicinc (__res_initstamp);
-+ atomicincunlock (lock);
+ }
++ __libc_lock_unlock (lock);
+ if (__res_initstamp != resp->_u._ext.initstamp) {
if (resp->nscount > 0)
__res_iclose (resp, true);
diff -Nru eglibc-2.11.2/debian/patches/hppa/local-stack-grows-up.diff eglibc-2.11.3/debian/patches/hppa/local-stack-grows-up.diff
--- eglibc-2.11.2/debian/patches/hppa/local-stack-grows-up.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/hppa/local-stack-grows-up.diff 2011-12-13 13:41:29.000000000 +0000
@@ -8,12 +8,6 @@
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
-+/* Copyright (C) 2002-2007, 2009, 2010 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
@@ -353,6 +353,15 @@
if (__builtin_expect (attr->flags & ATTR_FLAG_STACKADDR, 0))
{
diff -Nru eglibc-2.11.2/debian/patches/hurd-i386/cvs-linkat.diff eglibc-2.11.3/debian/patches/hurd-i386/cvs-linkat.diff
--- eglibc-2.11.2/debian/patches/hurd-i386/cvs-linkat.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/hurd-i386/cvs-linkat.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,68 +0,0 @@
-This fixes linkat() with AT_SYMLINK_FOLLOW in flags, which is currently
-returning EINVAL.
-
-2010-06-02 Emilio Pozuelo Monfort <pochu27@gmail.com>
-
- * hurd/lookup-at.c (__file_name_lookup_at): Accept
- AT_SYMLINK_FOLLOW in at_flags. Fail with EINVAL if both
- AT_SYMLINK_FOLLOW and AT_SYMLINK_NOFOLLOW are present
- in at_flags.
- * hurd/hurd/fd.h (__file_name_lookup_at): Update comment.
- * sysdeps/mach/hurd/linkat.c (linkat): Pass O_NOLINK in flags.
-
----
- hurd/hurd/fd.h | 5 +++--
- hurd/lookup-at.c | 6 ++++++
- sysdeps/mach/hurd/linkat.c | 4 +++-
- 3 files changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h
-index d1aa867..2473476 100644
---- a/hurd/hurd/fd.h
-+++ b/hurd/hurd/fd.h
-@@ -254,8 +254,9 @@ extern int _hurd_select (int nfds, struct pollfd *pollfds,
- const sigset_t *sigmask);
-
- /* Variant of file_name_lookup used in *at function implementations.
-- AT_FLAGS should contain only AT_SYMLINK_NOFOLLOW; other bits
-- cause EINVAL. */
-+ AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW,
-+ which will remove and add O_NOLINK from FLAGS respectively.
-+ Other bits cause EINVAL. */
- extern file_t __file_name_lookup_at (int fd, int at_flags,
- const char *file_name,
- int flags, mode_t mode);
-diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c
-index 7f55527..728a970 100644
---- a/hurd/lookup-at.c
-+++ b/hurd/lookup-at.c
-@@ -30,8 +30,14 @@ __file_name_lookup_at (int fd, int at_flags,
- error_t err;
- file_t result;
-
-+ if ((at_flags & AT_SYMLINK_FOLLOW) && (at_flags & AT_SYMLINK_NOFOLLOW))
-+ return (__hurd_fail (EINVAL), MACH_PORT_NULL);
-+
- flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0;
- at_flags &= ~AT_SYMLINK_NOFOLLOW;
-+ if (at_flags & AT_SYMLINK_FOLLOW)
-+ flags &= ~O_NOLINK;
-+ at_flags &= ~AT_SYMLINK_FOLLOW;
- if (at_flags != 0)
- return (__hurd_fail (EINVAL), MACH_PORT_NULL);
-
-diff --git a/sysdeps/mach/hurd/linkat.c b/sysdeps/mach/hurd/linkat.c
-index 1942144..f8406a5 100644
---- a/sysdeps/mach/hurd/linkat.c
-+++ b/sysdeps/mach/hurd/linkat.c
-@@ -38,7 +38,9 @@ linkat (fromfd, from, tofd, to, flags)
- file_t oldfile, linknode, todir;
- char *toname;
-
-- oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0);
-+ /* POSIX says linkat() doesn't follow symlinks by default, so pass
-+ O_NOLINK. That can be overriden by AT_SYMLINK_FOLLOW in FLAGS. */
-+ oldfile = __file_name_lookup_at (fromfd, flags, from, O_NOLINK, 0);
- if (oldfile == MACH_PORT_NULL)
- return -1;
-
diff -Nru eglibc-2.11.2/debian/patches/hurd-i386/cvs-select.diff eglibc-2.11.3/debian/patches/hurd-i386/cvs-select.diff
--- eglibc-2.11.2/debian/patches/hurd-i386/cvs-select.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/hurd-i386/cvs-select.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,20 +0,0 @@
-http://sourceware.org/ml/libc-alpha/2010-08/msg00002.html
-
-2010-07-31 Samuel Thibault <samuel.thibault@ens-lyon.org>
-
- * hurd/hurdselect.c (_hurd_select): Round timeout up instead of down
- when converting to ms.
-
-diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c
-index 544eee9..a7228f0 100644
---- a/hurd/hurdselect.c
-+++ b/hurd/hurdselect.c
-@@ -52,7 +52,7 @@ _hurd_select (int nfds,
- int firstfd, lastfd;
- mach_msg_timeout_t to = (timeout != NULL ?
- (timeout->tv_sec * 1000 +
-- timeout->tv_nsec / 1000000) :
-+ (timeout->tv_nsec + 999999) / 1000000) :
- 0);
- struct
- {
diff -Nru eglibc-2.11.2/debian/patches/i386/local-cpuid-level2.diff eglibc-2.11.3/debian/patches/i386/local-cpuid-level2.diff
--- eglibc-2.11.2/debian/patches/i386/local-cpuid-level2.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/i386/local-cpuid-level2.diff 2011-12-13 13:41:29.000000000 +0000
@@ -7,7 +7,7 @@
handle_intel (int name, unsigned int maxidx)
{
- assert (maxidx >= 2);
-+ if (maxidx <= 2)
++ if (maxidx < 2)
+ {
+ /* This should never happen as all Intel i686 CPU support a CPUID
+ level of 2 minimum. However valgrind sometimes load the i686
diff -Nru eglibc-2.11.2/debian/patches/kfreebsd/local-readdir_r.diff eglibc-2.11.3/debian/patches/kfreebsd/local-readdir_r.diff
--- eglibc-2.11.2/debian/patches/kfreebsd/local-readdir_r.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/kfreebsd/local-readdir_r.diff 2011-12-13 13:41:29.000000000 +0000
@@ -1,17 +1,18 @@
---
- sysdeps/unix/readdir_r.c | 30 +++++++++++++++++++++++++++++-
- 1 file changed, 29 insertions(+), 1 deletion(-)
+ sysdeps/unix/readdir_r.c | 33 +++++++++++++++++++++++++--------
+ 1 file changed, 25 insertions(+), 8 deletions(-)
--- a/sysdeps/unix/readdir_r.c
+++ b/sysdeps/unix/readdir_r.c
-@@ -114,14 +114,32 @@
+@@ -114,15 +114,32 @@
if (dp != NULL)
{
-#ifdef GETDENTS_64BIT_ALIGNED
- /* The d_reclen value might include padding which is not part of
- the DIRENT_TYPE data structure. */
-- reclen = MIN (reclen, sizeof (DIRENT_TYPE));
+- reclen = MIN (reclen,
+- offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name));
-#endif
+ /* The required size of *entry, according to POSIX, is
+ offsetof (DIRENT_TYPE, d_name[0]) + NAME_MAX + 1.
diff -Nru eglibc-2.11.2/debian/patches/kfreebsd/local-sysdeps.diff eglibc-2.11.3/debian/patches/kfreebsd/local-sysdeps.diff
--- eglibc-2.11.2/debian/patches/kfreebsd/local-sysdeps.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/kfreebsd/local-sysdeps.diff 2011-12-13 13:41:29.000000000 +0000
@@ -3175,6 +3175,46 @@
+#define _DIRENT_HAVE_D_NAMLEN 1
+#define _DIRENT_HAVE_D_TYPE 1
--- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/elf.h
+@@ -0,0 +1,37 @@
++/* This file defines standard ELF types, structures, and macros.
++ Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010
++ 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. */
++
++#ifndef _BITS_ELF_H
++#define _BITS_ELF_H
++
++__BEGIN_DECLS
++
++#define AT_EXECPATH 15 /* Path to the executable. */
++#define AT_CANARY 16 /* Canary for SSP. */
++#define AT_CANARYLEN 17 /* Length of the canary. */
++#define AT_OSRELDATE 18 /* OSRELDATE. */
++#define AT_NCPUS 19 /* Number of CPUs. */
++#define AT_PAGESIZES 20 /* Pagesizes. */
++#define AT_PAGESIZESLEN 21 /* Number of pagesizes. */
++#define AT_STACKPROT 23 /* Initial stack protection. */
++
++__END_DECLS
++
++#endif /* elf.h */
+--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/bits/errno.h
@@ -0,0 +1,183 @@
+/*-
@@ -7291,7 +7331,7 @@
+#include <sysdeps/unix/clock_settime.c>
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/clone.c
-@@ -0,0 +1,108 @@
+@@ -0,0 +1,143 @@
+/* Create a thread.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -7320,6 +7360,28 @@
+#include <stddef.h>
+#undef __clone
+
++
++#include <sys/sysctl.h>
++
++static inline int
++__kernel_osreldate(void)
++{
++ static int osreldate;
++
++ int mib[2];
++ size_t size;
++
++ if (osreldate == 0)
++ {
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_OSRELDATE;
++ size = sizeof osreldate;
++ if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
++ return (-1);
++ }
++ return (osreldate);
++}
++
+/* __start_thread (flags, child_stack, fn, arg)
+ is roughly equivalent to
+
@@ -7357,6 +7419,19 @@
+ }
+
+ if ((flags & CSIGNAL) != SIGCHLD)
++ {
++ if (__kernel_osreldate() >= 802510)
++ /* we slightly cheat here, */
++ /* the 9.x snapshot prior to r223966 does not support it too */
++ {
++ if ((flags & CSIGNAL) & ~RFTSIGMASK)
++ {
++ __set_errno (EINVAL);
++ return -1;
++ }
++ rfork_flags |= (RFTSIGZMB | RFTSIGFLAGS(flags & CSIGNAL));
++ }
++ else
+ {
+ if ((flags & CSIGNAL) & ~RFTHPNMASK)
+ {
@@ -7368,7 +7443,7 @@
+ else
+ rfork_flags |= (RFLINUXTHPN | ((flags & CSIGNAL) << RFTHPNSHIFT));
+ }
-+
++ }
+ if (flags & CLONE_VM)
+ rfork_flags |= RFMEM;
+
@@ -8495,10 +8570,58 @@
+}
+
--- /dev/null
++++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-support.c
+@@ -0,0 +1,44 @@
++/* Dynamic linker system dependencies for GNU/kFreeBSD.
++ Copyright (C) 2011 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. */
++
++#define _dl_aux_init _dl_aux_init_ignored_code
++#include <elf/dl-support.c>
++#include <bits/elf.h>
++#undef _dl_aux_init
++
++#ifdef HAVE_AUX_VECTOR
++void
++internal_function
++_dl_aux_init (ElfW(auxv_t) *av)
++{
++ for (; av->a_type != AT_NULL; ++av)
++ switch (av->a_type)
++ {
++ case AT_PAGESZ:
++ GLRO(dl_pagesize) = av->a_un.a_val;
++ break;
++ case AT_PHDR:
++ GL(dl_phdr) = (void *) av->a_un.a_val;
++ break;
++ case AT_PHNUM:
++ GL(dl_phnum) = av->a_un.a_val;
++ break;
++ }
++}
++#endif
+--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/dl-sysdep.c
-@@ -0,0 +1,56 @@
+@@ -0,0 +1,253 @@
+/* Dynamic linker system dependencies for GNU/kFreeBSD.
-+ Copyright (C) 2008 Free Software Foundation, Inc.
++ Copyright (C) 1995-1998,2000-2008,2009,2010,2011
++ 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
@@ -8527,7 +8650,203 @@
+#include <kernel-features.h>
+
+#ifdef SHARED
++# define _dl_sysdep_start _dl_sysdep_start_ignored_code
++# define _dl_show_auxv _dl_show_auxv_ignored_code
+# include <elf/dl-sysdep.c>
++# include <bits/elf.h>
++# undef _dl_sysdep_start
++# undef _dl_show_auxv
++
++extern const char *_self_program_name_from_auxv attribute_hidden;
++
++ElfW(Addr)
++_dl_sysdep_start (void **start_argptr,
++ void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
++ ElfW(Addr) *user_entry))
++{
++ const ElfW(Phdr) *phdr = NULL;
++ ElfW(Word) phnum = 0;
++ ElfW(Addr) user_entry;
++ ElfW(auxv_t) *av;
++ uid_t uid = 0;
++ gid_t gid = 0;
++#ifdef NEED_DL_SYSINFO
++ uintptr_t new_sysinfo = 0;
++#endif
++
++ __libc_stack_end = DL_STACK_END (start_argptr);
++ DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
++ _dl_auxv);
++
++ user_entry = (ElfW(Addr)) ENTRY_POINT;
++ GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */
++
++ for (av = _dl_auxv; av->a_type != AT_NULL; av++)
++ switch (av->a_type)
++ {
++ case AT_PHDR:
++ phdr = (void *) av->a_un.a_val;
++ break;
++ case AT_PHNUM:
++ phnum = av->a_un.a_val;
++ break;
++ case AT_PAGESZ:
++ GLRO(dl_pagesize) = av->a_un.a_val;
++ break;
++ case AT_ENTRY:
++ user_entry = av->a_un.a_val;
++ break;
++ case AT_EXECPATH:
++ _self_program_name_from_auxv = (char *) av->a_un.a_val;
++ break;
++#ifdef NEED_DL_BASE_ADDR
++ case AT_BASE:
++ _dl_base_addr = av->a_un.a_val;
++ break;
++#endif
++ }
++
++ {
++ /* Fill in the values we have not gotten from the kernel through the
++ auxiliary vector. */
++# undef SEE
++# define SEE(UID, var, uid) \
++ var ^= __get##uid ()
++ SEE (UID, uid, uid);
++ SEE (EUID, uid, euid);
++ SEE (GID, gid, gid);
++ SEE (EGID, gid, egid);
++
++ /* If one of the two pairs of IDs does not match this is a setuid
++ or setgid run. */
++ INTUSE(__libc_enable_secure) = uid | gid;
++ }
++
++#ifndef HAVE_AUX_PAGESIZE
++ if (GLRO(dl_pagesize) == 0)
++ GLRO(dl_pagesize) = __getpagesize ();
++#endif
++
++#if defined NEED_DL_SYSINFO
++ /* Only set the sysinfo value if we also have the vsyscall DSO. */
++ if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
++ GLRO(dl_sysinfo) = new_sysinfo;
++#endif
++
++#ifdef DL_SYSDEP_INIT
++ DL_SYSDEP_INIT;
++#endif
++
++#ifdef DL_PLATFORM_INIT
++ DL_PLATFORM_INIT;
++#endif
++
++ /* Determine the length of the platform name. */
++ if (GLRO(dl_platform) != NULL)
++ GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
++
++ if (__sbrk (0) == &_end)
++ /* The dynamic linker was run as a program, and so the initial break
++ starts just after our bss, at &_end. The malloc in dl-minimal.c
++ will consume the rest of this page, so tell the kernel to move the
++ break up that far. When the user program examines its break, it
++ will see this new value and not clobber our data. */
++ __sbrk (GLRO(dl_pagesize)
++ - ((&_end - (void *) 0) & (GLRO(dl_pagesize) - 1)));
++
++ /* If this is a SUID program we make sure that FDs 0, 1, and 2 are
++ allocated. If necessary we are doing it ourself. If it is not
++ possible we stop the program. */
++ if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
++ __libc_check_standard_fds ();
++
++ (*dl_main) (phdr, phnum, &user_entry);
++ return user_entry;
++}
++
++void
++internal_function
++_dl_show_auxv (void)
++{
++ char buf[64];
++ ElfW(auxv_t) *av;
++
++ /* Terminate string. */
++ buf[63] = '\0';
++
++ /* The following code assumes that the AT_* values are encoded
++ starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
++ close by (otherwise the array will be too large). In case we have
++ to support a platform where these requirements are not fulfilled
++ some alternative implementation has to be used. */
++ for (av = _dl_auxv; av->a_type != AT_NULL; ++av)
++ {
++ static const struct
++ {
++ const char label[17];
++ enum { unknown = 0, dec, hex, str, ignore } form : 8;
++ } auxvars[] =
++ {
++ [AT_EXECFD - 2] = { "EXECFD: ", dec },
++ [AT_PHDR - 2] = { "PHDR: 0x", hex },
++ [AT_PHENT - 2] = { "PHENT: ", dec },
++ [AT_PHNUM - 2] = { "PHNUM: ", dec },
++ [AT_PAGESZ - 2] = { "PAGESZ: ", dec },
++ [AT_BASE - 2] = { "BASE: 0x", hex },
++ [AT_FLAGS - 2] = { "FLAGS: 0x", hex },
++ [AT_ENTRY - 2] = { "ENTRY: 0x", hex },
++#ifndef __powerpc__
++ /* For some odd reason these are not in sys/powerpc/include/elf.h. */
++ [AT_NOTELF - 2] = { "NOTELF: ", hex },
++ [AT_UID - 2] = { "UID: ", dec },
++ [AT_EUID - 2] = { "EUID: ", dec },
++ [AT_GID - 2] = { "GID: ", dec },
++ [AT_EGID - 2] = { "EGID: ", dec },
++#endif
++ [AT_EXECPATH - 2] = { "EXECPATH: ", str },
++ [AT_CANARY - 2] = { "CANARY: 0x", hex },
++ [AT_CANARYLEN - 2] = { "CANARYLEN: ", dec },
++ [AT_OSRELDATE - 2] = { "OSRELDATE: ", dec },
++ [AT_NCPUS - 2] = { "NCPUS: ", dec },
++ [AT_PAGESIZES - 2] = { "PAGESIZES: 0x", hex },
++ [AT_PAGESIZESLEN - 2] = { "PAGESIZESLEN: ", dec },
++ [AT_STACKPROT - 2] = { "STACKPROT: 0x", hex },
++ };
++ unsigned int idx = (unsigned int) (av->a_type - 2);
++
++ if ((unsigned int) av->a_type < 2u || auxvars[idx].form == ignore)
++ continue;
++
++ assert (AT_NULL == 0);
++ assert (AT_IGNORE == 1);
++
++ if (idx < sizeof (auxvars) / sizeof (auxvars[0])
++ && auxvars[idx].form != unknown)
++ {
++ const char *val = (char *) av->a_un.a_val;
++
++ if (__builtin_expect (auxvars[idx].form, dec) == dec)
++ val = _itoa ((unsigned long int) av->a_un.a_val,
++ buf + sizeof buf - 1, 10, 0);
++ else if (__builtin_expect (auxvars[idx].form, hex) == hex)
++ val = _itoa ((unsigned long int) av->a_un.a_val,
++ buf + sizeof buf - 1, 16, 0);
++
++ _dl_printf ("AT_%s%s\n", auxvars[idx].label, val);
++
++ continue;
++ }
++
++ /* Unknown value: print a generic line. */
++ char buf2[17];
++ buf2[sizeof (buf2) - 1] = '\0';
++ const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
++ buf2 + sizeof buf2 - 1, 16, 0);
++ const char *val = _itoa ((unsigned long int) av->a_type,
++ buf + sizeof buf - 1, 16, 0);
++ _dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
++ }
++}
+#endif
+
+int
@@ -8584,7 +8903,7 @@
+#endif
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/faccessat.c
-@@ -0,0 +1,172 @@
+@@ -0,0 +1,199 @@
+/* Test for access to file, relative to open directory. Linux version.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -8619,6 +8938,16 @@
+extern int __syscall_faccessat (int fd, const char *path, int mode, int flag);
+libc_hidden_proto (__syscall_faccessat)
+
++/*
++ The FreeBSD kernel do not test file access correctly when the
++ process' real user ID is superuser. In particular, they always return
++ zero when testing execute permissions without regard to whether the
++ file is executable.
++
++ While this behaviour conforms to POSIX.1-2008, it is explicitely
++ discouraged. This wrapper implements the recommended behaviour.
++ */
++
+int
+faccessat (fd, file, mode, flag)
+ int fd;
@@ -8636,7 +8965,24 @@
+ __have_atfcts = -1;
+ else
+# endif
++ {
++ if ((result == 0) && (mode & X_OK))
++ {
++ uid_t uid = (flag & AT_EACCESS) ? __geteuid () : __getuid ();
++ if (uid == 0)
++ {
++ struct stat64 stats;
++ if (fstatat64 (fd, file, &stats, flag & AT_SYMLINK_NOFOLLOW))
++ return -1;
++ if ((stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)
++ {
++ __set_errno (EACCES);
++ return -1;
++ }
++ }
++ }
+ return result;
++ }
+ }
+
+#ifndef __ASSUME_ATFCTS
@@ -11599,7 +11945,7 @@
+#endif /* _BITS_SIGCONTEXT_H */
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/i386/dl-machine.h
-@@ -0,0 +1,149 @@
+@@ -0,0 +1,145 @@
+/* Machine-dependent ELF dynamic relocation inline functions.
+ FreeBSD i386 specific version of dl_platform_init()
+ Copyright (C) 2006 Free Software Foundation, Inc.
@@ -11694,16 +12040,12 @@
+ );
+}
+
-+extern const char *_self_program_name_from_auxv attribute_hidden;
-+
+static inline void __attribute__ ((unused))
+dl_platform_kfreebsd_i386_init (void)
+{
+ /* we don't have reasonable AT_PLATFORM from kernel
+ try to use cpuid to get one, also guess AT_HWCAP */
+
-+ _self_program_name_from_auxv = GLRO(dl_platform);
-+
+ int val, hwcap;
+
+ val = try_flip_flags(X86_EFLAGS_AC | X86_EFLAGS_ID);
@@ -14132,8 +14474,8 @@
+ {
+ size_t new_allocated =
+ (l->c_len + n < 2 * l->c_allocated + 1
-+ ? l->c_len + n
-+ : 2 * l->c_allocated + 1);
++ ? 2 * l->c_allocated + 1
++ : l->c_len + n);
+ char *new_array = (char *) realloc (l->c_array, new_allocated);
+ if (new_array == NULL)
+ {
@@ -20000,7 +20342,7 @@
+ case AF_IPX:
+ return sizeof (struct sockaddr_ipx);
+ case AF_LOCAL:
-+ return sizeof (struct sockaddr_un);
++ return sizeof (struct sockaddr_un) - 4;
+ }
+ return 0;
+}
@@ -22341,7 +22683,7 @@
+#endif
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/sys/rfork.h
-@@ -0,0 +1,91 @@
+@@ -0,0 +1,98 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
@@ -22415,6 +22757,13 @@
+#define RFTHREAD (1<<13) /* enable kernel thread support */
+#define RFSIGSHARE (1<<14) /* share signal handlers */
+#define RFLINUXTHPN (1<<16) /* do linux clone exit parent notification */
++#define RFSTOPPED (1<<17) /* leave child in a stopped state */
++#define RFHIGHPID (1<<18) /* use a pid higher than 10 (idleproc) */
++#define RFTSIGZMB (1<<19) /* select signal for exit parent notification */
++#define RFTSIGSHIFT 20 /* selected signal number is in bits 20-27 */
++#define RFTSIGMASK 0xFF
++#define RFTSIGNUM(flags) (((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
++#define RFTSIGFLAGS(signum) ((signum) << RFTSIGSHIFT)
+#define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */
+
+#define RFTHPNSHIFT 24 /* reserve bits 24-30 */
@@ -25609,7 +25958,7 @@
+#include <sysdeps/unix/sysv/linux/x86_64/dl-cache.h>
--- /dev/null
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/x86_64/dl-machine.h
-@@ -0,0 +1,137 @@
+@@ -0,0 +1,133 @@
+/* Machine-dependent ELF dynamic relocation inline functions. FreeBSD/amd64 version.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
@@ -25729,9 +26078,6 @@
+ );
+}
+
-+extern const char *_self_program_name_from_auxv attribute_hidden;
-+
-+
+static inline void __attribute__ ((unused))
+dl_platform_kfreebsd_x86_64_init (void)
+{
@@ -25742,7 +26088,6 @@
+
+ cpuid(1, &val, &hwcap);
+ GLRO(dl_hwcap) = hwcap;
-+ _self_program_name_from_auxv = GLRO(dl_platform);
+ GLRO(dl_platform) = ELF_MACHINE_NAME;
+}
+
diff -Nru eglibc-2.11.2/debian/patches/locale/locale-print-LANGUAGE.diff eglibc-2.11.3/debian/patches/locale/locale-print-LANGUAGE.diff
--- eglibc-2.11.2/debian/patches/locale/locale-print-LANGUAGE.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/locale/locale-print-LANGUAGE.diff 2011-12-13 13:41:29.000000000 +0000
@@ -12,19 +12,19 @@
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
-@@ -773,6 +773,7 @@
+@@ -796,6 +796,7 @@
{
size_t cat_no;
- const char *lcall = getenv ("LC_ALL");
-+ const char *language = getenv ("LANGUAGE");
+ const char *lcall = getenv ("LC_ALL") ? : "";
++ const char *language = getenv ("LANGUAGE") ? : "";
const char *lang = getenv ("LANG") ? : "";
auto void get_source (const char *name);
-@@ -791,6 +792,9 @@
+@@ -814,6 +815,9 @@
/* LANG has to be the first value. */
- printf ("LANG=%s\n", lang);
+ print_assignment ("LANG", lang, false);
-+ if (language != NULL && getenv ("POSIXLY_CORRECT") == NULL)
++ if (getenv ("POSIXLY_CORRECT") == NULL)
+ printf ("LANGUAGE=%s\n", language);
+
/* Now all categories in an unspecified order. */
diff -Nru eglibc-2.11.2/debian/patches/m68k/cvs-tls-support.patch eglibc-2.11.3/debian/patches/m68k/cvs-tls-support.patch
--- eglibc-2.11.2/debian/patches/m68k/cvs-tls-support.patch 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/m68k/cvs-tls-support.patch 2011-12-13 13:41:29.000000000 +0000
@@ -20,9 +20,9 @@
+ * sysdeps/unix/sysv/linux/m68k/bits/fcntl.h: Change misleading
+ names of parameters of sync_file_range.
+
- 2009-11-17 Joseph Myers <joseph@codesourcery.com>
+ 2011-01-18 Andreas Schwab <schwab@linux-m68k.org>
- [BZ #10972]
+ * sysdeps/unix/sysv/linux/m68k/bits/mman.h (MADV_HUGEPAGE)
diff --git a/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h
index 6fc7a0a..c6dd1a8 100644
--- a/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h
@@ -3816,7 +3816,7 @@
+
2010-05-22 Andreas Schwab <schwab@linux-m68k.org>
- * data/ports/c++-types-m68k-linux-gnu.data: New file.
+ * data/c++-types-m68k-linux-gnu.data: New file.
diff --git a/ports/sysdeps/unix/sysv/linux/m68k/nptl/bits/pthreadtypes.h b/ports/sysdeps/unix/sysv/linux/m68k/nptl/bits/pthreadtypes.h
index 0140810..832609d 100644
--- a/ports/sysdeps/unix/sysv/linux/m68k/nptl/bits/pthreadtypes.h
diff -Nru eglibc-2.11.2/debian/patches/series eglibc-2.11.3/debian/patches/series
--- eglibc-2.11.2/debian/patches/series 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/series 2011-12-13 13:41:29.000000000 +0000
@@ -1,4 +1,4 @@
-#svn-updates.diff
+svn-updates.diff
locale/check-unknown-symbols.diff
locale/fix-LC_COLLATE-rules.diff
@@ -64,7 +64,7 @@
amd64/local-clone.diff
amd64/local-linuxthreads-gscope.diff
amd64/submitted-tst-audit6-avx.diff
-amd64/cvs-avx-tcb-alignment.diff
+amd64/cvs-avx-detection.diff
arm/local-atomic.diff
arm/local-eabi-wchar.diff
@@ -126,11 +126,9 @@
hurd-i386/cvs-setsid.diff
hurd-i386/local-locarchive.diff
hurd-i386/submitted-regex_internal.diff
-hurd-i386/cvs-linkat.diff
hurd-i386/cvs-ttyname.diff
hurd-i386/cvs-getnprocs.diff
hurd-i386/local-mkdir_root.diff
-hurd-i386/cvs-select.diff
hurd-i386/local-i686.diff
hurd-i386/local-no-hp-timing.diff
hurd-i386/cvs-sched_param.diff
@@ -177,7 +175,6 @@
sparc/local-sparcv9-target.diff
sparc/submitted-timing.diff
sparc/cvs-sparcv9-memchr.diff
-sparc/submitted-epoll.diff
sparc/submitted-msgrcv.diff
all/local-alias-UTF-8.diff
@@ -239,7 +236,6 @@
any/local-getaddrinfo-interface.diff
any/submitted-autotools.diff
any/submitted-accept4-hidden.diff
-any/submitted-etc-resolv.conf.diff
any/submitted-localedef-mmap.diff
any/submitted-missing-etc-hosts.diff
any/submitted-bits-fcntl_h-at.diff
@@ -261,11 +257,14 @@
any/local-dlfptr.diff
any/submitted-string2-strcmp.diff
any/submitted-group_member.diff
-any/cvs-redirect-throw.diff
-#any/cvs-flush-cache-textrels.diff
any/cvs-__block.diff
any/cvs-sunrpc-license.diff
any/submitted-resolv.conf-thread.diff
-any/cvs-audit-suid.diff
-any/cvs-dont-expand-dst-twice.diff
any/cvs-ignore-origin-privileged.diff
+any/cvs-resolv-different-nameserver.diff
+any/submitted-resolv-assert.diff
+any/cvs-getaddrinfo-single-lookup.diff
+any/cvs-pthread-setgroups.diff
+any/cvs-dl_close-scope-handling.diff
+any/cvs-nptl-pthread-race.diff
+any/cvs-statvfs-mount-flags.diff
diff -Nru eglibc-2.11.2/debian/patches/sparc/submitted-epoll.diff eglibc-2.11.3/debian/patches/sparc/submitted-epoll.diff
--- eglibc-2.11.2/debian/patches/sparc/submitted-epoll.diff 2011-12-13 13:41:27.000000000 +0000
+++ eglibc-2.11.3/debian/patches/sparc/submitted-epoll.diff 1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-2010-08-31 Mike Frysinger <vapier@gentoo.org>
-
- * sysdeps/unix/sysv/linux/sparc/sys/epoll.h (epoll_create2): Delete.
- (epoll_create1): Add.
----
- sysdeps/unix/sysv/linux/sparc/sys/epoll.h | 9 +++++----
- 1 files changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/sysdeps/unix/sysv/linux/sparc/sys/epoll.h b/sysdeps/unix/sysv/linux/sparc/sys/epoll.h
-index cc0ddef..82a3490 100644
---- a/sysdeps/unix/sysv/linux/sparc/sys/epoll.h
-+++ b/sysdeps/unix/sysv/linux/sparc/sys/epoll.h
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002-2006, 2007, 2008 Free Software Foundation, Inc.
-+/* Copyright (C) 2002-2008, 2010 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
-@@ -31,7 +31,7 @@ typedef __sigset_t sigset_t;
- #endif
-
-
--/* Flags to be passed to epoll_create2. */
-+/* Flags to be passed to epoll_create1. */
- enum
- {
- EPOLL_CLOEXEC = 0x400000,
-@@ -101,8 +101,9 @@ __BEGIN_DECLS
- returned by epoll_create() should be closed with close(). */
- extern int epoll_create (int __size) __THROW;
-
--/* Same as epoll_create but with an additional FLAGS parameter. */
--extern int epoll_create2 (int __size, int __flags) __THROW;
-+/* Same as epoll_create but with an FLAGS parameter. The unused SIZE
-+ parameter has been dropped. */
-+extern int epoll_create1 (int __flags) __THROW;
-
-
- /* Manipulate an epoll instance "epfd". Returns 0 in case of success,
diff -Nru eglibc-2.11.2/debian/patches/svn-updates.diff eglibc-2.11.3/debian/patches/svn-updates.diff
--- eglibc-2.11.2/debian/patches/svn-updates.diff 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/debian/patches/svn-updates.diff 2011-12-13 13:41:29.000000000 +0000
@@ -0,0 +1,3384 @@
+SVN update of svn://svn.eglibc.org/branches/eglibc-2_11 from revision 12231
+
+--- a/stdlib/bug-getcontext.c (revision 0)
++++ b/stdlib/bug-getcontext.c (revision 16211)
+@@ -0,0 +1,48 @@
++/* BZ 12420 */
++
++#include <errno.h>
++#include <fenv.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <ucontext.h>
++
++static int
++do_test (void)
++{
++ int except_mask = FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW;
++ int status = feenableexcept (except_mask);
++
++ except_mask = fegetexcept ();
++ if (except_mask == -1)
++ {
++ printf("\nBefore getcontext(): fegetexcept returned: %d\n",
++ except_mask);
++ return 1;
++ }
++
++ ucontext_t ctx;
++ status = getcontext(&ctx);
++ if (status)
++ {
++ printf("\ngetcontext failed, errno: %d.\n", errno);
++ return 1;
++ }
++
++ printf ("\nDone with getcontext()!\n");
++ fflush (NULL);
++
++ int mask = fegetexcept ();
++ if (mask != except_mask)
++ {
++ printf("\nAfter getcontext(): fegetexcept returned: %d, expected: %d.\n",
++ mask, except_mask);
++ return 1;
++ }
++
++ printf("\nAt end fegetexcept() returned %d, expected: %d.\n",
++ mask, except_mask);
++ return 0;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- a/stdlib/msort.c (revision 12231)
++++ b/stdlib/msort.c (revision 16211)
+@@ -25,6 +25,7 @@
+ #include <unistd.h>
+ #include <memcopy.h>
+ #include <errno.h>
++#include <atomic.h>
+
+ struct msort_param
+ {
+@@ -182,7 +183,7 @@
+ static long int phys_pages;
+ static int pagesize;
+
+- if (phys_pages == 0)
++ if (pagesize == 0)
+ {
+ phys_pages = __sysconf (_SC_PHYS_PAGES);
+
+@@ -197,6 +198,9 @@
+ a quarter of the physical memory. */
+ phys_pages /= 4;
+
++ /* Make sure phys_pages is written to memory. */
++ atomic_write_barrier ();
++
+ pagesize = __sysconf (_SC_PAGESIZE);
+ }
+
+--- a/stdlib/Makefile (revision 12231)
++++ b/stdlib/Makefile (revision 16211)
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1991-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
++# Copyright (C) 1991-2009, 2011 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
+@@ -80,7 +80,7 @@
+ test-a64l tst-qsort tst-system bug-strtod2 \
+ tst-atof1 tst-atof2 tst-strtod2 tst-rand48-2 \
+ tst-makecontext tst-qsort2 tst-makecontext2 tst-strtod6 \
+- tst-unsetenv1
++ tst-unsetenv1 bug-getcontext
+ tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+ += tst-strtod3 tst-strtod4 tst-strtod5 testmb2
+ tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \
+@@ -159,3 +159,10 @@
+ $(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os
+ $(build-module)
+ CFLAGS-tst-putenvmod.c = -DNOT_IN_libc=1
++
++ifeq ($(build-shared),yes)
++link-libm = $(common-objpfx)math/libm.so
++else
++link-libm = $(common-objpfx)math/libm.a
++endif
++$(objpfx)bug-getcontext: $(link-libm)
+--- a/nscd/hstcache.c (revision 12231)
++++ b/nscd/hstcache.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Cache handling for host lookup.
+- Copyright (C) 1998-2008, 2009 Free Software Foundation, Inc.
++ Copyright (C) 1998-2008, 2009, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+@@ -77,6 +77,20 @@
+ };
+
+
++/* This is the standard reply in case there are temporary problems. */
++static const hst_response_header tryagain =
++{
++ .version = NSCD_VERSION,
++ .found = 0,
++ .h_name_len = 0,
++ .h_aliases_cnt = 0,
++ .h_addrtype = -1,
++ .h_length = -1,
++ .h_addr_list_cnt = 0,
++ .error = TRY_AGAIN
++};
++
++
+ static void
+ cache_addhst (struct database_dyn *db, int fd, request_header *req,
+ const void *key, struct hostent *hst, uid_t owner,
+@@ -111,11 +125,15 @@
+ else
+ {
+ /* We have no data. This means we send the standard reply for this
+- case. */
++ case. Possibly this is only temporary. */
+ ssize_t total = sizeof (notfound);
++ assert (sizeof (notfound) == sizeof (tryagain));
+
++ const hst_response_header *resp = (errval == EAGAIN
++ ? &tryagain : ¬found);
++
+ if (fd != -1 &&
+- TEMP_FAILURE_RETRY (send (fd, ¬found, total,
++ TEMP_FAILURE_RETRY (send (fd, resp, total,
+ MSG_NOSIGNAL)) != total)
+ all_written = false;
+
+@@ -135,7 +153,7 @@
+ ? db->negtimeout : ttl);
+
+ /* This is the reply. */
+- memcpy (&dataset->resp, ¬found, total);
++ memcpy (&dataset->resp, resp, total);
+
+ /* Copy the key data. */
+ memcpy (dataset->strdata, key, req->key_len);
+@@ -490,6 +508,7 @@
+ /* We set the error to indicate this is (possibly) a
+ temporary error and that it does not mean the entry
+ is not available at all. */
++ h_errno = TRY_AGAIN;
+ errval = EAGAIN;
+ break;
+ }
+--- a/libio/fmemopen.c (revision 12231)
++++ b/libio/fmemopen.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Fmemopen implementation.
+- Copyright (C) 2000, 2002, 2005, 2006, 2008, 2009
++ Copyright (C) 2000, 2002, 2005, 2006, 2008, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Hanno Mueller, kontakt@hanno.de, 2000.
+@@ -243,7 +243,7 @@
+ if (mode[0] == 'w')
+ c->buffer[0] = '\0';
+
+- c->maxpos = strlen (c->buffer);
++ c->maxpos = strnlen (c->buffer, len);
+
+ if (mode[0] == 'a')
+ c->pos = c->maxpos;
+--- a/libio/fileops.c (revision 12231)
++++ b/libio/fileops.c (revision 16211)
+@@ -291,7 +291,7 @@
+ #ifdef _LIBC
+ last_recognized = mode;
+ #endif
+- for (i = 1; i < 6; ++i)
++ for (i = 1; i < 7; ++i)
+ {
+ switch (*++mode)
+ {
+@@ -1005,18 +1005,18 @@
+ /* Adjust for read-ahead (bytes is buffer). */
+ offset -= fp->_IO_read_end - fp->_IO_read_ptr;
+ if (fp->_offset == _IO_pos_BAD)
+- {
+- if (mode != 0)
+- goto dumb;
+- else
+- {
+- result = _IO_SYSSEEK (fp, 0, dir);
+- if (result == EOF)
+- return result;
++ {
++ if (mode != 0)
++ goto dumb;
++ else
++ {
++ result = _IO_SYSSEEK (fp, 0, dir);
++ if (result == EOF)
++ return result;
+
+- fp->_offset = result;
+- }
+- }
++ fp->_offset = result;
++ }
++ }
+ /* Make offset absolute, assuming current pointer is file_ptr(). */
+ offset += fp->_offset;
+ if (offset < 0)
+@@ -1278,7 +1278,7 @@
+ {
+ f->_flags |= _IO_ERR_SEEN;
+ break;
+- }
++ }
+ to_do -= count;
+ data = (void *) ((char *) data + count);
+ }
+@@ -1366,12 +1366,12 @@
+ do_write = to_do - (block_size >= 128 ? to_do % block_size : 0);
+
+ if (do_write)
+- {
++ {
+ count = new_do_write (f, s, do_write);
+ to_do -= count;
+ if (count < do_write)
+ return n - to_do;
+- }
++ }
+
+ /* Now write out the remainder. Normally, this will fit in the
+ buffer, but it's somewhat messier for line-buffered files,
+--- a/wcsmbs/bits/wchar2.h (revision 12231)
++++ b/wcsmbs/bits/wchar2.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Checking macros for wchar functions.
+- Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
++ Copyright (C) 2005, 2006, 2007, 2010 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
+@@ -60,15 +60,13 @@
+ __const wchar_t *__s2,
+ size_t __n), wmemmove);
+ extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
+- (wchar_t *__restrict __s1,
+- __const wchar_t *__restrict __s2, size_t __n,
+- size_t __ns1), __wmemmove_chk)
++ (wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n, size_t __ns1), __wmemmove_chk)
+ __warnattr ("wmemmove called with length bigger than size of destination "
+ "buffer");
+
+ __extern_always_inline wchar_t *
+-__NTH (wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
+- size_t __n))
++__NTH (wmemmove (wchar_t *__s1, __const wchar_t *__s2, size_t __n))
+ {
+ if (__bos0 (__s1) != (size_t) -1)
+ {
+@@ -129,7 +127,7 @@
+ "buffer");
+
+ __extern_always_inline wchar_t *
+-__NTH (wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n))
++__NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
+ {
+ if (__bos0 (__s) != (size_t) -1)
+ {
+@@ -152,7 +150,7 @@
+ __const wchar_t *__restrict __src), wcscpy);
+
+ __extern_always_inline wchar_t *
+-__NTH (wcscpy (wchar_t *__dest, __const wchar_t *__src))
++__NTH (wcscpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ return __wcscpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
+@@ -160,14 +158,15 @@
+ }
+
+
+-extern wchar_t *__wcpcpy_chk (wchar_t *__dest, __const wchar_t *__src,
++extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest,
++ __const wchar_t *__restrict __src,
+ size_t __destlen) __THROW;
+-extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias, (wchar_t *__dest,
+- __const wchar_t *__src),
+- wcpcpy);
++extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
++ (wchar_t *__restrict __dest,
++ __const wchar_t *__restrict __src), wcpcpy);
+
+ __extern_always_inline wchar_t *
+-__NTH (wcpcpy (wchar_t *__dest, __const wchar_t *__src))
++__NTH (wcpcpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ return __wcpcpy_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
+@@ -190,7 +189,8 @@
+ "buffer");
+
+ __extern_always_inline wchar_t *
+-__NTH (wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
++__NTH (wcsncpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src,
++ size_t __n))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ {
+@@ -220,7 +220,8 @@
+ "buffer");
+
+ __extern_always_inline wchar_t *
+-__NTH (wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
++__NTH (wcpncpy (wchar_t *__restrict __dest, __const wchar_t *__restrict __src,
++ size_t __n))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ {
+@@ -243,7 +244,7 @@
+ __const wchar_t *__restrict __src), wcscat);
+
+ __extern_always_inline wchar_t *
+-__NTH (wcscat (wchar_t *__dest, __const wchar_t *__src))
++__NTH (wcscat (wchar_t *__restrict __dest, __const wchar_t *__restrict __src))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ return __wcscat_chk (__dest, __src, __bos (__dest) / sizeof (wchar_t));
+@@ -260,7 +261,8 @@
+ size_t __n), wcsncat);
+
+ __extern_always_inline wchar_t *
+-__NTH (wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n))
++__NTH (wcsncat (wchar_t *__restrict __dest, __const wchar_t *__restrict __src,
++ size_t __n))
+ {
+ if (__bos (__dest) != (size_t) -1)
+ return __wcsncat_chk (__dest, __src, __n,
+@@ -428,14 +430,16 @@
+ #endif
+
+
+-extern size_t __wcrtomb_chk (char *__s, wchar_t __wchar, mbstate_t *__p,
+- size_t __buflen) __THROW __wur;
++extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
++ mbstate_t *__restrict __p,
++ size_t __buflen) __THROW __wur;
+ extern size_t __REDIRECT_NTH (__wcrtomb_alias,
+ (char *__restrict __s, wchar_t __wchar,
+ mbstate_t *__restrict __ps), wcrtomb) __wur;
+
+ __extern_always_inline __wur size_t
+-__NTH (wcrtomb (char *__s, wchar_t __wchar, mbstate_t *__ps))
++__NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
++ mbstate_t *__restrict __ps))
+ {
+ /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
+ But this would only disturb the namespace. So we define our own
+--- a/wcsmbs/wchar.h (revision 12231)
++++ b/wcsmbs/wchar.h (revision 16211)
+@@ -319,8 +319,7 @@
+ #endif
+
+ /* Compare N wide characters of S1 and S2. */
+-extern int wmemcmp (__const wchar_t *__restrict __s1,
+- __const wchar_t *__restrict __s2, size_t __n)
++extern int wmemcmp (__const wchar_t *__s1, __const wchar_t *__s2, size_t __n)
+ __THROW __attribute_pure__;
+
+ /* Copy N wide characters of SRC to DEST. */
+@@ -561,11 +560,13 @@
+ #ifdef __USE_XOPEN2K8
+ /* Copy SRC to DEST, returning the address of the terminating L'\0' in
+ DEST. */
+-extern wchar_t *wcpcpy (wchar_t *__dest, __const wchar_t *__src) __THROW;
++extern wchar_t *wcpcpy (wchar_t *__restrict __dest,
++ __const wchar_t *__restrict __src) __THROW;
+
+ /* Copy no more than N characters of SRC to DEST, returning the address of
+ the last character written into DEST. */
+-extern wchar_t *wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n)
++extern wchar_t *wcpncpy (wchar_t *__restrict __dest,
++ __const wchar_t *__restrict __src, size_t __n)
+ __THROW;
+ #endif /* use GNU */
+
+--- a/include/alloca.h (revision 12231)
++++ b/include/alloca.h (revision 16211)
+@@ -14,6 +14,7 @@
+
+ extern int __libc_use_alloca (size_t size) __attribute__ ((const));
+ extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
++libc_hidden_proto (__libc_alloca_cutoff)
+
+ #define __MAX_ALLOCA_CUTOFF 65536
+
+--- a/include/atomic.h (revision 12231)
++++ b/include/atomic.h (revision 16211)
+@@ -33,7 +33,7 @@
+ the multi-thread case. The interfaces have the prefix
+ "catomic_".
+
+- - support functions like barriers. They also have the preifx
++ - support functions like barriers. They also have the prefix
+ "atomic_".
+
+ Architectures must provide a few lowlevel macros (the compare
+--- a/ChangeLog (revision 12231)
++++ b/ChangeLog (revision 16211)
+@@ -1,3 +1,369 @@
++2011-05-29 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12350]
++ * sysdeps/posix/getaddrinfo.c (gethosts): Restore only RES_USE_IENT6
++ bit from old_res_options.
++ (gaih_inet): Likewise.
++
++2011-05-28 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12811]
++ * posix/regex_internal.c (build_wcs_buffer): Don't signal we have to
++ grow the buffers more if it already has to be sufficient.
++ (build_wcs_upper_buffer): Likewise.
++ * posix/regexec.c (check_matching): Likewise.
++ (clean_state_log_if_needed): Likewise.
++ (extend_buffers): Don't enlarge buffers beyond size of the input
++ buffer.
++ Patches mostly by Emil Wojak <emil@wojak.eu>.
++ * posix/bug-regex32.c: New file.
++ * posix/Makefile (tests): Add bug-regex32.
++
++2011-05-14 Ulrich Drepper <drepper@gmail.com>
++
++ * iconv/loop.c (SINGLE) [STORE_REST]: Add input bytes to bytebuf before
++ storing incomplete byte sequence in state object.
++
++2011-05-17 H.J. Lu <hongjiu.lu@intel.com>
++
++ [BZ #12775]
++ * sysdeps/x86_64/fpu/e_powl.S: Fix a typo.
++ * math/Makefile (tests): Add test-powl.
++ (CFLAGS-test-powl.c): Define.
++ * math/test-powl.c: New file.
++
++2011-05-16 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12766]
++ * misc/error.c (error_at_line): Ensure file_name and old_file_name
++ point to strings before performing equality test for error_one_per_line
++ mode.
++
++ [BZ #11697]
++ * login/programs/pt_chown.c (do_pt_chown): Always call chown.
++
++2011-05-14 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12083]
++ * sysdeps/pthread/aio_misc.c (__aio_init): Compute optim.aio_num
++ correctly.
++
++ * libio/fileops.c (_IO_new_file_close_it): Initialize write_status.
++
++ * iconv/loop.c (SINGLE) [STORE_REST]: Add input bytes to bytebuf before
++ storing incomplete byte sequence in state object. Avoid testing for
++ guaranteed too small input if we know there is enough data available.
++
++2011-05-12 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12511]
++ * elf/dl-lookup.c (enter): Don't test for copy relocation here and
++ don't set DF_1_NODELETE here.
++ (do_lookup_x): When entering new entry test for copy relocation
++ and if necessary set DF_1_NODELETE flag.
++ Patch by Piotr Bury <pbury@goahead.com>.
++
++2011-05-11 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12052]
++ * sysdeps/posix/spawni.c (__spawni): Fix sched_setscheduler call.
++
++ [BZ #12625]
++ * misc/mntent_r.c (addmntent): Flush the stream after the output
++
++ [BZ #12393]
++ * elf/dl-load.c (is_trusted_path): Remove unnecessary test.
++ (is_trusted_path_normalize): Skip initial colon. Append slash
++ to empty buffer. Duplicate is_trusted_path code but allow
++ constructed patch to be prefix.
++ (is_dst): Allow $ORIGIN followed by /.
++ (_dl_dst_substitute): Correct clearing of check_for_trusted.
++ Correct testing of result of is_trusted_path_normalize
++ (decompose_rpath): Fix warning.
++
++2011-05-07 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12734]
++ * resolv/resolv.h: Define RES_NOTLDQUERY.
++ * resolv/res_init.c (res_setoptions): Recognize no_tld_query and
++ no-tld-query and set RES_NOTLDQUERY.
++ * resolv/res_debug.c (p_option): Handle RES_NOTLDQUERY.
++ * resolv/res_query.c (__libc_res_nsearch): Backport changes from
++ modern BIND to search name as TLD unless forbidden.
++
++2011-05-07 Petr Baudis <pasky@suse.cz>
++ Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12393]
++ * elf/dl-load.c (fillin_rpath): Move trusted path check...
++ (is_trusted_path): ...to here.
++ (is_norm_trusted_path): Add wrapper for /../ and /./ normalization.
++ (_dl_dst_substitute): Verify expanded $ORIGIN path elements
++ using is_norm_trusted_path() in setuid scripts.
++
++2011-05-03 Andreas Schwab <schwab@redhat.com>
++
++ * elf/ldconfig.c (add_dir): Don't crash on empty path.
++
++2011-04-30 Bruno Haible <bruno@clisp.org>
++
++ [BZ #12717]
++ * conform/data/netdb.h-data (getnameinfo): Make POSIX compliant.
++ * resolv/netdb.h (getnameinfo): Change type of flags parameter
++ to 'int'.
++ * inet/getnameinfo.c (getnameinfo): Likewise.
++
++2011-04-22 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12685]
++ * libio/fileops.c (_IO_new_file_fopen): Scan up to 7 bytes of the
++ mode string.
++ Patch by Eric Blake <eblake@redhat.com>.
++
++2011-04-17 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12420]
++ * sysdeps/unix/sysv/linux/x86_64/getcontext.S: Reload context after
++ storing it.
++ * stdlib/bug-getcontext.c: New file.
++ * stdlib/Makefile: Add rules to build and run bug-getcontext.
++
++2011-04-10 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12650]
++ * sysdeps/i386/dl-tls.h: Define TLS_DTV_UNALLOCATED.
++ * sysdeps/ia64/dl-tls.h: Likewise.
++ * sysdeps/powerpc/dl-tls.h: Likewise.
++ * sysdeps/s390/dl-tls.h: Likewise.
++ * sysdeps/sh/dl-tls.h: Likewise.
++ * sysdeps/sparc/dl-tls.h: Likewise.
++ * sysdeps/x86_64/dl-tls.h: Likewise.
++ * elf/dl-tls.c: Don't define TLS_DTV_UNALLOCATED here.
++
++2011-03-14 Andreas Schwab <schwab@redhat.com>
++
++ * elf/dl-load.c (_dl_dst_substitute): When skipping the first
++ rpath element also skip the following colon.
++ (expand_dynamic_string_token): Add is_path parameter and pass
++ down to DL_DST_REQUIRED and _dl_dst_substitute.
++ (decompose_rpath): Call expand_dynamic_string_token with
++ non-zero is_path. Ignore empty rpaths.
++ (_dl_map_object_from_fd): Call expand_dynamic_string_token
++ with zero is_path.
++
++2011-04-07 Andreas Schwab <schwab@redhat.com>
++
++ * sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (CALL_FAIL):
++ Maintain aligned stack.
++ (CHECK_RSP): Remove unused macro.
++
++2011-03-18 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12583]
++ * posix/fnmatch.c (fnmatch): Check size of pattern in wide
++ character representation.
++ Partly based on a patch by Tomas Hoger <thoger@redhat.com>.
++
++2011-03-16 Ryan S. Arnold <rsa@us.ibm.com>
++
++ * sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S (isnanf): Fix
++ END(__isnan) to END(__isnanf) to match function entry point/label
++ EALIGN(__isnanf,...).
++
++2011-03-10 Jakub Jelinek <jakub@redhat.com>
++
++ * wcsmbs/wchar.h (wmemcmp): Remove __restrict qualifiers.
++
++2011-03-10 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12510]
++ * elf/dl-lookup.c (do_lookup_x): For copy relocations of unique objects
++ copy from the symbol referenced in the relocation to initialize the
++ used variable.
++ Patch by Piotr Bury <pbury@goahead.com>.
++
++2011-03-06 Ulrich Drepper <drepper@gmail.com>
++
++ * elf/dl-load.c (_dl_map_object): If we are looking for the first
++ to-be-loaded object along a path to loader is ld.so.
++
++2011-03-03 Andreas Schwab <schwab@redhat.com>
++
++ * libio/fmemopen.c (fmemopen): Don't read past end of buffer.
++
++2011-02-17 Andreas Schwab <schwab@redhat.com>
++
++ [BZ #12454]
++ * elf/dl-deps.c (_dl_map_object_deps): Signal error early when
++ dependencies are missing.
++
++2011-02-22 Samuel Thibault <samuel.thibault@ens-lyon.org>
++
++ Fix __if_freereq crash: Unlike the generic version which uses free,
++ Hurd needs munmap.
++ * sysdeps/mach/hurd/ifreq.h: New file.
++
++2011-01-27 Petr Baudis <pasky@suse.cz>
++ Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12445]
++ * stdio-common/vfprintf.c (vfprintf): Pass correct newlen
++ to extend_alloca().
++ * stdio-common/bug23.c: New file.
++ * stdio-common/Makefile (tests): Add bug23.
++
++2011-02-16 Ryan S. Arnold <rsa@us.ibm.com>
++
++ * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h:
++ (INTERNAL_VSYSCALL_NCS INTERNAL_SYSCALL_NCS): Remove erroneous (int)
++ cast from r3.
++ * sysdeps/wordsize-64/Makefile: New file. Add tst-writev to
++ 'tests' variable.
++ * sysdeps/wordsize-64/tst-writev.c: New file.
++
++2011-02-15 Ryan S. Arnold <rsa@us.ibm.com>
++
++ * sysdeps/powerpc/powerpc64/power7/Makefile: New file which adds
++ -mno-vsx to the CFLAGS-rtld.c variable to avoid using VSX registers and
++ insns in _dl_start to prevent a TOC reference before relocs are
++ resolved.
++
++2011-02-11 Jakub Jelinek <jakub@redhat.com>
++
++ * stdio-common/printf-parsemb.c (__parse_one_specmb): Handle
++ arginfo fn returning -1.
++
++ * stdio-common/_i18n_number.h (_i18n_number_rewrite): Ensure decimal
++ and thousands string is zero terminated.
++
++2011-02-02 Ulrich Drepper <drepper@gmail.com>
++
++ * elf/dl-runtime.c (_dl_call_pltexit): Pass correct address of the
++ function to the callback.
++ Patch partly by Jiri Olsa <jolsa@redhat.com>.
++
++2011-02-02 Andreas Schwab <schwab@redhat.com>
++
++ * shadow/sgetspent.c: Check return value of __sgetspent_r instead
++ of errno.
++
++2010-10-01 Andreas Schwab <schwab@redhat.com>
++
++ * sysdeps/posix/getaddrinfo.c (gaih_inet): Don't discard result of
++ decoding ACE if AI_CANONIDN.
++
++2011-01-17 Ulrich Drepper <drepper@gmail.com>
++
++ * io/fcntl.h: Define AT_NO_AUTOMOUNT.
++
++ * sysdeps/unix/sysv/linux/i386/bits/mman.h: Define MADV_HUGEPAGE and
++ MADV_NOHUGEPAGE.
++ * sysdeps/unix/sysv/linux/ia64/bits/mman.h: Likewise.
++ * sysdeps/unix/sysv/linux/powerpc/bits/mman.h: Likewise.
++ * sysdeps/unix/sysv/linux/s390/bits/mman.h: Likewise.
++ * sysdeps/unix/sysv/linux/sh/bits/mman.h: Likewise.
++ * sysdeps/unix/sysv/linux/sparc/bits/mman.h: Likewise.
++ * sysdeps/unix/sysv/linux/x86_64/bits/mman.h: Likewise.
++
++ * sysdeps/unix/sysv/linux/bits/socket.h: Define AF_CAIF, AF_ALG,
++ PF_CAIF, and PF_ALG.
++ * sysdeps/unix/sysv/linux/sparc/bits/socket.h: Likewise.
++
++2011-01-15 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #6812]
++ * nscd/hstcache.c (tryagain): Define.
++ (cache_addhst): Return tryagain not notfound for temporary errors.
++ (addhstbyX): Also set h_errno to TRY_AGAIN when memory allocation
++ failed.
++
++2011-01-13 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12397]
++ * sysdeps/unix/sysv/linux/mkdirat.c (mkdirat): Fix handling of missing
++ syscall.
++
++ [BZ #10484]
++ * nss/nss_files/files-hosts.c (HOST_DB_LOOKUP): Handle overflows of
++ temporary buffer used to handle multi lookups locally.
++ * include/alloca.h: Add libc_hidden_proto for __libc_alloca_cutoff.
++
++2011-01-12 Ulrich Drepper <drepper@gmail.com>
++
++ * elf/dl-dst.h (DL_DST_REQUIRED): Allow l_origin to be NULL when
++ loader is ld.so.
++
++2010-03-12 Andreas Schwab <schwab@redhat.com>
++
++ * elf/dl-dst.h: Include "trusted-dirs.h".
++ (DL_DST_REQUIRED): Take $LIB into account.
++
++2011-01-10 Paul Pluzhnikov <ppluzhnikov@google.com>
++
++ * sysdeps/i386/Makefile: stdlib/cxa_finalize.c needs 16-byte stack
++ alignment for SSE2.
++
++2011-01-12 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12394]
++ * stdio-common/printf_fp.c (__printf_fp): Add more room for grouping
++ characters. When rounding increased number of integer digits recompute
++ number of groups.
++ * stdio-common/tst-grouping.c: New file.
++ * stdio-common/Makefile: Add rules to build and run tst-grouping.
++
++2011-01-04 David S. Miller <davem@sunset.davemloft.net>
++
++ [BZ #11155]
++ * sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c: Use i386's
++ implementation just like for lxstat, fxstatat, et al.
++
++2010-12-27 Jim Meyering <meyering@redhat.com>
++
++ [BZ #12348]
++ * posix/regexec.c (build_trtable): Return failure indication upon
++ calloc failure. Otherwise, re_search_internal could infloop on OOM.
++
++2010-12-25 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12207]
++ * malloc/malloc.c (do_check_malloc_state): Use fastbin macro.
++
++2010-12-19 Ulrich Drepper <drepper@gmail.com>
++
++ * sysdeps/unix/readdir_r.c (__READDIR_R): Compute reclen more
++ accurately.
++ * sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c: Define
++ GETDENTS_64BIT_ALIGNED.
++
++2010-12-10 Andreas Schwab <schwab@redhat.com>
++
++ * wcsmbs/wchar.h (wcpcpy, wcpncpy): Add __restrict.
++ * wcsmbs/bits/wchar2.h (__wmemmove_chk_warn, wmemmove, wmemset):
++ Remove __restrict.
++ (wcscpy, __wcpcpy_chk, __wcpcpy_alias, wcpcpy, wcsncpy, wcpncpy)
++ (wcscat, wcsncat, __wcrtomb_chk, wcrtomb): Add __restrict.
++
++2010-12-09 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #11655]
++ * stdlib/msort.c (qsort_r): Make sure both phys_pages and pagesize
++ are initialized.
++
++2010-12-09 Jakub Jelinek <jakub@redhat.com>
++
++ * string/bits/string3.h (memmove, bcopy): Remove __restrict.
++
++2010-11-30 Ulrich Drepper <drepper@gmail.com>
++
++ * sysdeps/i386/fpu/libm-test-ulps: Relax ynf(10,0.75) test expectations.
++
++2010-11-24 Andreas Schwab <schwab@redhat.com>
++
++ * resolv/nss_dns/dns-host.c (getanswer_r): Don't handle ttl == 0
++ specially.
++ (gaih_getanswer_slice): Likewise.
++
+ 2010-05-31 Petr Baudis <pasky@suse.cz>
+
+ [BZ #11149]
+--- a/sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S (revision 12231)
++++ b/sysdeps/powerpc/powerpc32/power6/fpu/s_isnanf.S (revision 16211)
+@@ -1,5 +1,5 @@
+ /* isnanf(). PowerPC32 version.
+- Copyright (C) 2008 Free Software Foundation, Inc.
++ Copyright (C) 2008, 2011 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
+@@ -39,8 +39,7 @@
+ L(NaN):
+ li r3,1 /* else return 1 */
+ blr
+- END (__isnan)
++ END (__isnanf)
+
+ hidden_def (__isnanf)
+ weak_alias (__isnanf, isnanf)
+-
+--- a/sysdeps/powerpc/dl-tls.h (revision 12231)
++++ b/sysdeps/powerpc/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. PowerPC version.
+- Copyright (C) 2003 Free Software Foundation, Inc.
++ Copyright (C) 2003, 2011 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
+@@ -47,3 +47,6 @@
+ # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET)
+ # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET)
+ #endif
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/unix/sysv/linux/s390/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/s390/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/s390 version.
+- Copyright (C) 2000-2003,2005,2006,2009 Free Software Foundation, Inc.
++ Copyright (C) 2000-2003,2005,2006,2009,2011 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
+@@ -94,6 +94,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c (revision 12231)
++++ b/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c (revision 16211)
+@@ -1 +1 @@
+-#include "../../fxstat.c"
++#include "../../i386/fxstat.c"
+--- a/sysdeps/unix/sysv/linux/sparc/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/sparc/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/SPARC version.
+- Copyright (C) 1997,1999,2000,2003,2005,2006,2009
++ Copyright (C) 1997,1999,2000,2003,2005,2006,2009,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -97,6 +97,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/sparc/bits/socket.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/sparc/bits/socket.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* System-specific socket constants and types. Linux/SPARC version.
+- Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009
++ Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -108,7 +108,9 @@
+ #define PF_ISDN 34 /* mISDN sockets. */
+ #define PF_PHONET 35 /* Phonet sockets. */
+ #define PF_IEEE802154 36 /* IEEE 802.15.4 sockets. */
+-#define PF_MAX 37 /* For now.. */
++#define PF_CAIF 37 /* CAIF sockets. */
++#define PF_ALG 38 /* Algorithm sockets. */
++#define PF_MAX 39 /* For now.. */
+
+ /* Address families. */
+ #define AF_UNSPEC PF_UNSPEC
+@@ -149,6 +151,8 @@
+ #define AF_ISDN PF_ISDN
+ #define AF_PHONET PF_PHONET
+ #define AF_IEEE802154 PF_IEEE802154
++#define AF_CAIF PF_CAIF
++#define AF_ALG PF_ALG
+ #define AF_MAX PF_MAX
+
+ /* Socket level values. Others are defined in the appropriate headers.
+@@ -233,8 +237,8 @@
+ #define MSG_MORE MSG_MORE
+
+ MSG_CMSG_CLOEXEC = 0x40000000 /* Set close_on_exit for file
+- descriptor received through
+- SCM_RIGHTS. */
++ descriptor received through
++ SCM_RIGHTS. */
+ #define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
+ };
+
+--- a/sysdeps/unix/sysv/linux/i386/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/i386/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/i386 version.
+- Copyright (C) 1997,2000,2003,2005,2006,2009,2010
++ Copyright (C) 1997,2000,2003,2005,2006,2009,2010,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -96,6 +96,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (revision 16211)
+@@ -172,7 +172,7 @@
+ : "r9", "r10", "r11", "r12", \
+ "cr0", "ctr", "lr", "memory"); \
+ err = (long int) r0; \
+- (int) r3; \
++ r3; \
+ })
+
+ #undef INLINE_SYSCALL
+@@ -219,7 +219,7 @@
+ : "r9", "r10", "r11", "r12", \
+ "cr0", "ctr", "memory"); \
+ err = r0; \
+- (int) r3; \
++ r3; \
+ })
+ #define INTERNAL_SYSCALL(name, err, nr, args...) \
+ INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, args)
+--- a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/PowerPC version.
+- Copyright (C) 1997,2000,2003,2005,2006,2008,2009
++ Copyright (C) 1997,2000,2003,2005,2006,2008,2009,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -96,6 +96,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/mkdirat.c (revision 12231)
++++ b/sysdeps/unix/sysv/linux/mkdirat.c (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 2005, 2006, 2009, 2011 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
+@@ -43,7 +43,7 @@
+ {
+ res = INLINE_SYSCALL (mkdirat, 3, fd, file, mode);
+ # ifndef __ASSUME_ATFCTS
+- if (res == -1 && res == ENOSYS)
++ if (res == -1 && errno == ENOSYS)
+ __have_atfcts = -1;
+ else
+ # endif
+--- a/sysdeps/unix/sysv/linux/bits/socket.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/bits/socket.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* System-specific socket constants and types. Linux version.
+- Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009
++ Copyright (C) 1991, 1992, 1994-2001, 2004, 2006-2010, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -109,7 +109,9 @@
+ #define PF_ISDN 34 /* mISDN sockets. */
+ #define PF_PHONET 35 /* Phonet sockets. */
+ #define PF_IEEE802154 36 /* IEEE 802.15.4 sockets. */
+-#define PF_MAX 37 /* For now.. */
++#define PF_CAIF 37 /* CAIF sockets. */
++#define PF_ALG 38 /* Algorithm sockets. */
++#define PF_MAX 39 /* For now.. */
+
+ /* Address families. */
+ #define AF_UNSPEC PF_UNSPEC
+@@ -150,6 +152,8 @@
+ #define AF_ISDN PF_ISDN
+ #define AF_PHONET PF_PHONET
+ #define AF_IEEE802154 PF_IEEE802154
++#define AF_CAIF PF_CAIF
++#define AF_ALG PF_ALG
+ #define AF_MAX PF_MAX
+
+ /* Socket level values. Others are defined in the appropriate headers.
+--- a/sysdeps/unix/sysv/linux/sh/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/sh/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/SH version.
+- Copyright (C) 1997,1999,2000,2003,2005,2006,2009
++ Copyright (C) 1997,1999,2000,2003,2005,2006,2009,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -94,6 +94,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/x86_64/getcontext.S (revision 12231)
++++ b/sysdeps/unix/sysv/linux/x86_64/getcontext.S (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Save current context.
+- Copyright (C) 2002, 2005 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2005, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@suse.de>, 2002.
+
+@@ -62,6 +62,7 @@
+ movq %rcx, oFPREGS(%rdi)
+ /* Save the floating-point environment. */
+ fnstenv (%rcx)
++ fldenv (%rcx)
+ stmxcsr oMXCSR(%rdi)
+
+ /* Save the current signal mask with
+--- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (revision 12231)
++++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2001,2004,2005,2006,2009,2010 Free Software Foundation, Inc.
++/* Copyright (C) 2001,2004,2005,2006,2009,2010,2011 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
+@@ -30,19 +30,23 @@
+ //#define __longjmp ____longjmp_chk
+
+ #ifdef PIC
+-# define CALL_FAIL leaq longjmp_msg(%rip), %rdi; \
+- call __GI___fortify_fail
++# define CALL_FAIL subq $8, %rsp; \
++ cfi_remember_state; \
++ cfi_def_cfa_offset(16); \
++ leaq longjmp_msg(%rip), %rdi; \
++ call __GI___fortify_fail; \
++ nop; \
++ cfi_restore_state
+ #else
+-# define CALL_FAIL movq $longjmp_msg, %rdi; \
+- call __fortify_fail
++# define CALL_FAIL subq $8, %rsp; \
++ cfi_remember_state; \
++ cfi_def_cfa_offset(16); \
++ movq $longjmp_msg, %rdi; \
++ call __fortify_fail; \
++ nop; \
++ cfi_restore_state
+ #endif
+
+-#define CHECK_RSP(reg) \
+- cmpq reg, %rsp; \
+- jbe .Lok; \
+- CALL_FAIL; \
+-.Lok:
+-
+ /* Jump to the position specified by ENV, causing the
+ setjmp call there to return VAL, or 1 if VAL is 0.
+ void __longjmp (__jmp_buf env, int val). */
+--- a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h (revision 16211)
+@@ -1,5 +1,6 @@
+ /* Definitions for POSIX memory map interface. Linux/x86_64 version.
+- Copyright (C) 2001,2003,2005,2006,2009,2010 Free Software Foundation, Inc.
++ Copyright (C) 2001,2003,2005,2006,2009,2010,2011
++ 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
+@@ -96,6 +97,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/ia64/bits/mman.h (revision 12231)
++++ b/sysdeps/unix/sysv/linux/ia64/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/ia64 version.
+- Copyright (C) 1997,1998,2000,2003,2005,2006,2009
++ Copyright (C) 1997,1998,2000,2003,2005,2006,2009,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -95,6 +95,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c (revision 12231)
++++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c (revision 16211)
+@@ -1,4 +1,5 @@
+ #define readdir64_r __no_readdir64_r_decl
++#define GETDENTS_64BIT_ALIGNED 1
+ #include <sysdeps/unix/readdir_r.c>
+ #undef readdir64_r
+ weak_alias (__readdir_r, readdir64_r)
+--- a/sysdeps/unix/readdir_r.c (revision 12231)
++++ b/sysdeps/unix/readdir_r.c (revision 16211)
+@@ -117,7 +117,8 @@
+ #ifdef GETDENTS_64BIT_ALIGNED
+ /* The d_reclen value might include padding which is not part of
+ the DIRENT_TYPE data structure. */
+- reclen = MIN (reclen, sizeof (DIRENT_TYPE));
++ reclen = MIN (reclen,
++ offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name));
+ #endif
+ *result = memcpy (entry, dp, reclen);
+ #ifdef GETDENTS_64BIT_ALIGNED
+--- a/sysdeps/pthread/aio_misc.c (revision 12231)
++++ b/sysdeps/pthread/aio_misc.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Handle general operations.
+- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2006, 2007, 2009
++ Copyright (C) 1997-2001, 2003, 2004, 2006, 2007, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+@@ -26,6 +26,7 @@
+ #include <pthread.h>
+ #include <stdlib.h>
+ #include <unistd.h>
++#include <sys/param.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
+ #include <aio_misc.h>
+@@ -87,7 +88,7 @@
+ static struct aioinit optim =
+ {
+ 20, /* int aio_threads; Maximal number of threads. */
+- 64, /* int aio_num; Number of expected simultanious requests. */
++ 64, /* int aio_num; Number of expected simultaneous requests. */
+ 0,
+ 0,
+ 0,
+@@ -282,9 +283,10 @@
+ if (pool == NULL)
+ {
+ optim.aio_threads = init->aio_threads < 1 ? 1 : init->aio_threads;
++ assert (powerof2 (ENTRIES_PER_ROW));
+ optim.aio_num = (init->aio_num < ENTRIES_PER_ROW
+ ? ENTRIES_PER_ROW
+- : init->aio_num & ~ENTRIES_PER_ROW);
++ : init->aio_num & ~(ENTRIES_PER_ROW - 1));
+ }
+
+ if (init->aio_idle_time != 0)
+--- a/sysdeps/i386/dl-tls.h (revision 12231)
++++ b/sysdeps/i386/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. i386 version.
+- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2004, 2011 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
+@@ -58,3 +58,6 @@
+
+ # endif
+ #endif
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/i386/Makefile (revision 12231)
++++ b/sysdeps/i386/Makefile (revision 16211)
+@@ -51,6 +51,7 @@
+ # And a couple of other routines
+ ifeq ($(subdir),stdlib)
+ CFLAGS-exit.c += -mpreferred-stack-boundary=4
++CFLAGS-cxa_finalize.c += -mpreferred-stack-boundary=4
+ endif
+ ifeq ($(subdir),elf)
+ CFLAGS-dl-init.c += -mpreferred-stack-boundary=4
+--- a/sysdeps/i386/fpu/libm-test-ulps (revision 12231)
++++ b/sysdeps/i386/fpu/libm-test-ulps (revision 16211)
+@@ -857,8 +857,8 @@
+ ildouble: 2
+ ldouble: 2
+ Test "yn (10, 0.75) == -2133501638.90573424452445412893839236":
+-float: 1
+-ifloat: 1
++float: 2
++ifloat: 2
+ ildouble: 4
+ ldouble: 4
+ Test "yn (10, 1.0) == -121618014.278689189288130426667971145":
+--- a/sysdeps/wordsize-64/tst-writev.c (revision 0)
++++ b/sysdeps/wordsize-64/tst-writev.c (revision 16211)
+@@ -0,0 +1,107 @@
++/* Copyright (C) 2011 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Ryan S. Arnold <rsa@us.ibm.com>, 2011.
++
++ 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 <fcntl.h>
++#include <paths.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <sys/uio.h>
++
++
++/* The purpose of this test is to verify that the INTERNAL_[V]SYSCALL_NCS
++ macros on 64-bit platforms don't cast the return type to (int) which would
++ erroneously sign extend the return value should the high bit of the bottom
++ half of the word be '1'. */
++
++#if 0
++/* Used to test the non power-of-2 code path. */
++#undef IOV_MAX
++#define IOV_MAX 1000
++#endif
++
++/* writev() should report that it has written EXPECTED number of bytes. */
++#define EXPECTED ((size_t) INT32_MAX + 1)
++
++static int
++do_test (void)
++{
++ struct iovec iv[IOV_MAX];
++ /* POSIX doesn't guarantee that IOV_MAX is pow of 2 but we're optimistic. */
++ size_t bufsz = EXPECTED / IOV_MAX;
++ size_t bufrem = EXPECTED % IOV_MAX;
++
++ /* If there's a remainder then IOV_MAX probably isn't a power of 2 and we
++ need to make bufsz bigger so that the last iovec, iv[IOV_MAX-1], is free
++ for the remainder. */
++ if (bufrem)
++ {
++ bufsz = bufsz + 1;
++ bufrem = EXPECTED - (bufsz * (IOV_MAX - 1));
++ }
++
++ /* We writev to /dev/null since we're just testing writev's return value. */
++ int fd = open (_PATH_DEVNULL, O_WRONLY);
++ if (fd == -1)
++ {
++ printf ("Unable to open /dev/null for writing.\n");
++ return -1;
++ }
++
++ iv[0].iov_base = malloc (bufsz);
++ if (iv[0].iov_base == NULL)
++ {
++ printf ("malloc (%zu) failed.\n", bufsz);
++ close (fd);
++ return -1;
++ }
++ iv[0].iov_len = bufsz;
++
++ /* We optimistically presume that there isn't a remainder and set all iovec
++ instances to the same base and len as the first instance. */
++ for (int i = 1; i < IOV_MAX; i++)
++ {
++ /* We don't care what the data is so reuse the allocation from iv[0]; */
++ iv[i].iov_base = iv[0].iov_base;
++ iv[i].iov_len = iv[0].iov_len;
++ }
++
++ /* If there is a remainder then we correct the last iov_len. */
++ if (bufrem)
++ iv[IOV_MAX - 1].iov_len = bufrem;
++
++ /* Write junk to /dev/null with the writev syscall in order to get a return
++ of INT32_MAX+1 bytes to verify that the INTERNAL_SYSCALL wrappers aren't
++ mangling the result if the signbit of a 32-bit number is set. */
++ ssize_t ret = writev (fd, iv, IOV_MAX);
++
++ free (iv[0].iov_base);
++ close (fd);
++
++ if (ret != (ssize_t) EXPECTED)
++ {
++ printf ("writev() return value: %zd != EXPECTED: %zd\n", ret, EXPECTED);
++ return 1;
++ }
++
++ return 0;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- a/sysdeps/s390/dl-tls.h (revision 12231)
++++ b/sysdeps/s390/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. s390 version.
+- Copyright (C) 2003, 2004 Free Software Foundation, Inc.
++ Copyright (C) 2003, 2004, 2011 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
+@@ -72,6 +72,9 @@
+ # define __TLS_GET_ADDR(__ti) \
+ ({ extern char _GLOBAL_OFFSET_TABLE_[] attribute_hidden; \
+ (void *) __tls_get_offset ((char *) (__ti) - _GLOBAL_OFFSET_TABLE_) \
+- + (unsigned long) __builtin_thread_pointer (); })
++ + (unsigned long) __builtin_thread_pointer (); })
+
+ #endif
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/x86_64/dl-tls.h (revision 12231)
++++ b/sysdeps/x86_64/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. x86-64 version.
+- Copyright (C) 2002, 2005 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2005, 2011 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
+@@ -27,3 +27,6 @@
+
+
+ extern void *__tls_get_addr (tls_index *ti);
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/x86_64/fpu/e_powl.S (revision 12231)
++++ b/sysdeps/x86_64/fpu/e_powl.S (revision 16211)
+@@ -1,5 +1,5 @@
+ /* ix87 specific implementation of pow function.
+- Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2007
++ Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2007, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+@@ -154,7 +154,7 @@
+ fucompp // 1.0 : x : y
+ fnstsw
+ fxch // x : 1.0 : y
+- test $4500,%eax
++ test $0x4500,%eax
+ jz 7f
+ fsub %st(1) // x-1 : 1.0 : y
+ fyl2xp1 // log2(x) : y
+--- a/sysdeps/posix/spawni.c (revision 12231)
++++ b/sysdeps/posix/spawni.c (revision 16211)
+@@ -142,9 +142,7 @@
+ }
+ else if ((flags & POSIX_SPAWN_SETSCHEDULER) != 0)
+ {
+- if (__sched_setscheduler (0, attrp->__policy,
+- (flags & POSIX_SPAWN_SETSCHEDPARAM) != 0
+- ? &attrp->__sp : NULL) == -1)
++ if (__sched_setscheduler (0, attrp->__policy, &attrp->__sp) == -1)
+ _exit (SPAWN_ERROR);
+ }
+ #endif
+--- a/sysdeps/posix/getaddrinfo.c (revision 12231)
++++ b/sysdeps/posix/getaddrinfo.c (revision 16211)
+@@ -207,7 +207,7 @@
+ if (herrno == NETDB_INTERNAL) \
+ { \
+ __set_h_errno (herrno); \
+- _res.options = old_res_options; \
++ _res.options |= old_res_options & RES_USE_INET6; \
+ return -EAI_SYSTEM; \
+ } \
+ if (herrno == TRY_AGAIN) \
+@@ -842,7 +842,7 @@
+ nip = nip->next;
+ }
+
+- _res.options = old_res_options;
++ _res.options |= old_res_options & RES_USE_INET6;
+
+ if (no_data != 0 && no_inet6_data != 0)
+ {
+@@ -963,6 +963,7 @@
+ make a copy. */
+ if (out == canon)
+ goto make_copy;
++ canon = out;
+ }
+ else
+ #endif
+--- a/sysdeps/ia64/dl-tls.h (revision 12231)
++++ b/sysdeps/ia64/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. IA-64 version.
+- Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2003, 2011 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
+@@ -28,3 +28,6 @@
+ #define DONT_USE_TLS_INDEX 1
+
+ extern void *__tls_get_addr (size_t m, size_t offset);
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/mach/hurd/ifreq.h (revision 0)
++++ b/sysdeps/mach/hurd/ifreq.h (revision 16211)
+@@ -0,0 +1,45 @@
++/* Copyright (C) 1999, 2002, 2003, 2011 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Andreas Jaeger <aj@suse.de>.
++
++ 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 <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <net/if.h>
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <sys/mman.h>
++
++static inline struct ifreq *
++__if_nextreq (struct ifreq *ifr)
++{
++#ifdef _HAVE_SA_LEN
++ if (ifr->ifr_addr.sa_len > sizeof ifr->ifr_addr)
++ return (struct ifreq *) ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len);
++#endif
++ return ifr + 1;
++}
++
++extern void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd);
++
++
++static inline void
++__if_freereq (struct ifreq *ifreqs, int num_ifs)
++{
++ munmap (ifreqs, num_ifs * sizeof (struct ifreq));
++}
+--- a/sysdeps/sparc/dl-tls.h (revision 12231)
++++ b/sysdeps/sparc/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. SPARC version.
+- Copyright (C) 2003 Free Software Foundation, Inc.
++ Copyright (C) 2003, 2011 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
+@@ -27,3 +27,6 @@
+
+
+ extern void *__tls_get_addr (tls_index *ti);
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/sysdeps/sh/dl-tls.h (revision 12231)
++++ b/sysdeps/sh/dl-tls.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. SH version.
+- Copyright (C) 2002 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2011 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
+@@ -27,3 +27,6 @@
+
+
+ extern void *__tls_get_addr (tls_index *ti);
++
++/* Value used for dtv entries for which the allocation is delayed. */
++#define TLS_DTV_UNALLOCATED ((void *) -1l)
+--- a/misc/mntent_r.c (revision 12231)
++++ b/misc/mntent_r.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Utilities for reading/writing fstab, mtab, etc.
+- Copyright (C) 1995-2000, 2001, 2002, 2003, 2006, 2010
++ Copyright (C) 1995-2000, 2001, 2002, 2003, 2006, 2010, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -263,8 +263,8 @@
+ mntcopy.mnt_type,
+ mntcopy.mnt_opts,
+ mntcopy.mnt_freq,
+- mntcopy.mnt_passno)
+- < 0 ? 1 : 0);
++ mntcopy.mnt_passno) < 0
++ || fflush (stream) != 0);
+ }
+ weak_alias (__addmntent, addmntent)
+
+--- a/misc/error.c (revision 12231)
++++ b/misc/error.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Error handler for noninteractive utilities
+- Copyright (C) 1990-1998, 2000-2005, 2006 Free Software Foundation, Inc.
++ Copyright (C) 1990-1998, 2000-2006, 2011 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
+@@ -277,7 +277,9 @@
+
+ if (old_line_number == line_number
+ && (file_name == old_file_name
+- || strcmp (old_file_name, file_name) == 0))
++ || (old_file_name != NULL
++ && file_name != NULL
++ && strcmp (old_file_name, file_name) == 0)))
+ /* Simply return and print nothing. */
+ return;
+
+--- a/inet/getnameinfo.c (revision 12231)
++++ b/inet/getnameinfo.c (revision 16211)
+@@ -159,7 +159,7 @@
+ int
+ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
+ socklen_t hostlen, char *serv, socklen_t servlen,
+- unsigned int flags)
++ int flags)
+ {
+ int serrno = errno;
+ int tmpbuflen = 1024;
+@@ -385,7 +385,7 @@
+ break;
+
+ default:
+- return EAI_FAMILY;
++ return EAI_FAMILY;
+ }
+
+ if (serv && (servlen > 0))
+--- a/nss/nss_files/files-hosts.c (revision 12231)
++++ b/nss/nss_files/files-hosts.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Hosts file parser in nss_files module.
+- Copyright (C) 1996-2001, 2003-2008, 2009 Free Software Foundation, Inc.
++ Copyright (C) 1996-2001, 2003-2009, 2011 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
+@@ -129,19 +129,22 @@
+ && _res_hconf.flags & HCONF_FLAG_MULTI) \
+ { \
+ /* We have to get all host entries from the file. */ \
+- const size_t tmp_buflen = MIN (buflen, 4096); \
+- char tmp_buffer[tmp_buflen] \
++ size_t tmp_buflen = MIN (buflen, 4096); \
++ char tmp_buffer_stack[tmp_buflen] \
+ __attribute__ ((__aligned__ (__alignof__ (struct hostent_data))));\
++ char *tmp_buffer = tmp_buffer_stack; \
+ struct hostent tmp_result_buf; \
+ int naddrs = 1; \
+ int naliases = 0; \
+ char *bufferend; \
++ bool tmp_buffer_malloced = false; \
+ \
+ while (result->h_aliases[naliases] != NULL) \
+ ++naliases; \
+ \
+ bufferend = (char *) &result->h_aliases[naliases + 1]; \
+ \
++ again: \
+ while ((status = internal_getent (&tmp_result_buf, tmp_buffer, \
+ tmp_buflen, errnop H_ERRNO_ARG \
+ EXTRA_ARGS_VALUE)) \
+@@ -182,7 +185,7 @@
+ } \
+ /* If the real name is different add it also to the \
+ aliases. This means that there is a duplication \
+- in the alias list but this is really the users \
++ in the alias list but this is really the user's \
+ problem. */ \
+ if (strcmp (old_result->h_name, \
+ tmp_result_buf.h_name) != 0) \
+@@ -204,7 +207,7 @@
+ *errnop = ERANGE; \
+ *herrnop = NETDB_INTERNAL; \
+ status = NSS_STATUS_TRYAGAIN; \
+- break; \
++ goto out; \
+ } \
+ \
+ new_h_addr_list = \
+@@ -268,8 +271,54 @@
+ } \
+ } \
+ \
+- if (status != NSS_STATUS_TRYAGAIN) \
++ if (status == NSS_STATUS_TRYAGAIN) \
++ { \
++ size_t newsize = 2 * tmp_buflen; \
++ if (tmp_buffer_malloced) \
++ { \
++ char *newp = realloc (tmp_buffer, newsize); \
++ if (newp != NULL) \
++ { \
++ assert ((((uintptr_t) newp) \
++ & (__alignof__ (struct hostent_data) - 1)) \
++ == 0); \
++ tmp_buffer = newp; \
++ tmp_buflen = newsize; \
++ goto again; \
++ } \
++ } \
++ else if (!__libc_use_alloca (buflen + newsize)) \
++ { \
++ tmp_buffer = malloc (newsize); \
++ if (tmp_buffer != NULL) \
++ { \
++ assert ((((uintptr_t) tmp_buffer) \
++ & (__alignof__ (struct hostent_data) - 1)) \
++ == 0); \
++ tmp_buffer_malloced = true; \
++ tmp_buflen = newsize; \
++ goto again; \
++ } \
++ } \
++ else \
++ { \
++ tmp_buffer \
++ = extend_alloca (tmp_buffer, tmp_buflen, \
++ newsize \
++ + __alignof__ (struct hostent_data)); \
++ tmp_buffer = (char *) (((uintptr_t) tmp_buffer \
++ + __alignof__ (struct hostent_data) \
++ - 1) \
++ & ~(__alignof__ (struct hostent_data)\
++ - 1)); \
++ goto again; \
++ } \
++ } \
++ else \
+ status = NSS_STATUS_SUCCESS; \
++ out: \
++ if (tmp_buffer_malloced) \
++ free (tmp_buffer); \
+ } \
+ \
+ \
+--- a/string/bits/string3.h (revision 12231)
++++ b/string/bits/string3.h (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 2004, 2005, 2007, 2009, 2010 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
+@@ -53,8 +53,7 @@
+ }
+
+ __extern_always_inline void *
+-__NTH (memmove (void *__restrict __dest, __const void *__restrict __src,
+- size_t __len))
++__NTH (memmove (void *__dest, __const void *__src, size_t __len))
+ {
+ return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest));
+ }
+@@ -88,8 +87,7 @@
+
+ #ifdef __USE_BSD
+ __extern_always_inline void
+-__NTH (bcopy (__const void *__restrict __src, void *__restrict __dest,
+- size_t __len))
++__NTH (bcopy (__const void *__src, void *__dest, size_t __len))
+ {
+ (void) __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest));
+ }
+--- a/iconv/loop.c (revision 12231)
++++ b/iconv/loop.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Conversion loop frame work.
+- Copyright (C) 1998-2002, 2003, 2005, 2008 Free Software Foundation, Inc.
++ Copyright (C) 1998-2003, 2005, 2008, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+@@ -399,6 +399,9 @@
+ {
+ *inptrp = inend;
+ #ifdef STORE_REST
++ while (inptr < inend)
++ bytebuf[inlen++] = *inptr++;
++
+ inptr = bytebuf;
+ inptrp = &inptr;
+ inend = &bytebuf[inlen];
+--- a/math/test-powl.c (revision 0)
++++ b/math/test-powl.c (revision 16211)
+@@ -0,0 +1,51 @@
++/* Test for powl
++ Copyright (C) 2011 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 <stdio.h>
++#include <math.h>
++#include <float.h>
++#include <ieee754.h>
++
++int
++main (void)
++{
++ int result = 0;
++
++#ifndef NO_LONG_DOUBLE
++# if LDBL_MANT_DIG == 64
++ {
++ long double x = 1e-20;
++ union ieee854_long_double u;
++ u.ieee.mantissa0 = 1;
++ u.ieee.mantissa1 = 1;
++ u.ieee.exponent = 0;
++ u.ieee.negative = 0;
++ (void) powl (0.2, u.d);
++ x = powl (x, 1.5);
++ if (fabsl (x - 1e-30) > 1e-10)
++ {
++ printf ("powl (1e-20, 1.5): wrong result: %Lg\n", x);
++ result = 1;
++ }
++ }
++# endif
++#endif
++
++ return result;
++}
+--- a/math/Makefile (revision 12231)
++++ b/math/Makefile (revision 16211)
+@@ -92,7 +92,8 @@
+ # Rules for the test suite.
+ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
+ test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
+- bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2
++ bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \
++ test-tgmath2 test-powl
+ # We do the `long double' tests only if this data type is available and
+ # distinct from `double'.
+ test-longdouble-yes = test-ldouble test-ildoubl
+@@ -133,6 +134,7 @@
+ CFLAGS-test-tgmath.c = -fno-builtin
+ CFLAGS-test-tgmath2.c = -fno-builtin
+ CFLAGS-test-tgmath-ret.c = -fno-builtin
++CFLAGS-test-powl.c = -fno-builtin
+ CPPFLAGS-test-ifloat.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \
+ -DTEST_FAST_MATH -fno-builtin
+ CPPFLAGS-test-idouble.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \
+--- a/malloc/malloc.c (revision 12231)
++++ b/malloc/malloc.c (revision 16211)
+@@ -2832,7 +2832,7 @@
+ max_fast_bin = fastbin_index(get_max_fast ());
+
+ for (i = 0; i < NFASTBINS; ++i) {
+- p = av->fastbins[i];
++ p = fastbin (av, i);
+
+ /* The following test can only be performed for the main arena.
+ While mallopt calls malloc_consolidate to get rid of all fast
+--- a/nptl/ChangeLog (revision 12231)
++++ b/nptl/ChangeLog (revision 16211)
+@@ -1,3 +1,21 @@
++2011-05-11 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #386]
++ * allocatestack.c (allocate_stack): Convert ENOMEM error to EAGAIN.
++
++2011-04-10 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #12650]
++ * allocatestack.c (get_cached_stack): Deallocate DTV entries before
++ clearing memory.
++ Patch partly by Robert Rex <robert.rex@exasol.com>.
++
++2011-01-13 Ulrich Drepper <drepper@gmail.com>
++
++ [BZ #10484]
++ * Versions [libc] (GLIBC_PRIVATE): Export __libc_alloca_cutoff.
++ * alloca_cutoff.c: Add libc_hidden_def.
++
+ 2010-08-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * nptl/sysdeps/unix/sysv/linux/i386/Makefile: New file.
+--- a/nptl/alloca_cutoff.c (revision 12231)
++++ b/nptl/alloca_cutoff.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Determine whether block of given size can be allocated on the stack or not.
+- Copyright (C) 2002 Free Software Foundation, Inc.
++ Copyright (C) 2002, 2011 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
+@@ -34,3 +34,4 @@
+ assume the maximum available stack space. */
+ ?: __MAX_ALLOCA_CUTOFF * 4));
+ }
++libc_hidden_def (__libc_alloca_cutoff)
+--- a/nptl/allocatestack.c (revision 12231)
++++ b/nptl/allocatestack.c (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 2002-2007, 2009, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+@@ -26,6 +26,7 @@
+ #include <sys/mman.h>
+ #include <sys/param.h>
+ #include <dl-sysdep.h>
++#include <dl-tls.h>
+ #include <tls.h>
+ #include <lowlevellock.h>
+ #include <kernel-features.h>
+@@ -238,6 +239,10 @@
+
+ /* Clear the DTV. */
+ dtv_t *dtv = GET_DTV (TLS_TPADJ (result));
++ for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
++ if (! dtv[1 + cnt].pointer.is_static
++ && dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
++ free (dtv[1 + cnt].pointer.val);
+ memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
+
+ /* Re-initialize the TLS. */
+@@ -623,7 +628,7 @@
+ {
+ int err;
+ mprot_error:
+- err = errno;
++ err = errno == ENOMEM ? EAGAIN : errno;
+
+ lll_lock (stack_cache_lock, LLL_PRIVATE);
+
+--- a/nptl/Versions (revision 12231)
++++ b/nptl/Versions (revision 16211)
+@@ -27,6 +27,7 @@
+ pthread_cond_broadcast; pthread_cond_timedwait;
+ }
+ GLIBC_PRIVATE {
++ __libc_alloca_cutoff;
+ # Internal libc interface to libpthread
+ __libc_dl_error_tsd;
+ }
+--- a/login/programs/pt_chown.c (revision 12231)
++++ b/login/programs/pt_chown.c (revision 16211)
+@@ -64,7 +64,7 @@
+ Copyright (C) %s Free Software Foundation, Inc.\n\
+ This is free software; see the source for copying conditions. There is NO\n\
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
+-"), "1999");
++"), "2011");
+ }
+
+ static char *
+@@ -123,7 +123,7 @@
+
+ /* Set the owner to the real user ID, and the group to that special
+ group ID. */
+- if (st.st_gid != gid && chown (pty, getuid (), gid) < 0)
++ if (chown (pty, getuid (), gid) < 0)
+ return FAIL_EACCES;
+
+ /* Set the permission mode to readable and writable by the owner,
+--- a/shadow/sgetspent.c (revision 12231)
++++ b/shadow/sgetspent.c (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 1997, 2011 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
+@@ -49,8 +49,8 @@
+ }
+
+ while (buffer != NULL
+- && __sgetspent_r (string, &resbuf, buffer, buffer_size, &result) != 0
+- && errno == ERANGE)
++ && (__sgetspent_r (string, &resbuf, buffer, buffer_size, &result)
++ == ERANGE))
+ {
+ char *new_buf;
+ buffer_size += BUFLEN_SPWD;
+--- a/posix/regex_internal.c (revision 12231)
++++ b/posix/regex_internal.c (revision 16211)
+@@ -237,14 +237,9 @@
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+- if (BE (mbclen == (size_t) -2, 0))
++ if (BE (mbclen == (size_t) -1 || mbclen == 0
++ || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len), 0))
+ {
+- /* The buffer doesn't have enough space, finish to build. */
+- pstr->cur_state = prev_st;
+- break;
+- }
+- else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
+- {
+ /* We treat these cases as a singlebyte character. */
+ mbclen = 1;
+ wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+@@ -252,6 +247,12 @@
+ wc = pstr->trans[wc];
+ pstr->cur_state = prev_st;
+ }
++ else if (BE (mbclen == (size_t) -2, 0))
++ {
++ /* The buffer doesn't have enough space, finish to build. */
++ pstr->cur_state = prev_st;
++ break;
++ }
+
+ /* Write wide character and padding. */
+ pstr->wcs[byte_idx++] = wc;
+@@ -334,9 +335,11 @@
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+- else if (mbclen == (size_t) -1 || mbclen == 0)
++ else if (mbclen == (size_t) -1 || mbclen == 0
++ || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+ {
+- /* It is an invalid character or '\0'. Just use the byte. */
++ /* It is an invalid character, an incomplete character
++ at the end of the string, or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ pstr->mbs[byte_idx] = ch;
+ /* And also cast it to wide char. */
+@@ -449,7 +452,8 @@
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+- else if (mbclen == (size_t) -1 || mbclen == 0)
++ else if (mbclen == (size_t) -1 || mbclen == 0
++ || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+--- a/posix/regexec.c (revision 12231)
++++ b/posix/regexec.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Extended regular expression matching and search library.
+- Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
++ Copyright (C) 2002-2005,2007,2009,2010,2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+@@ -1120,12 +1120,13 @@
+ re_dfastate_t *old_state = cur_state;
+ int next_char_idx = re_string_cur_idx (&mctx->input) + 1;
+
+- if (BE (next_char_idx >= mctx->input.bufs_len, 0)
+- || (BE (next_char_idx >= mctx->input.valid_len, 0)
+- && mctx->input.valid_len < mctx->input.len))
+- {
+- err = extend_buffers (mctx);
+- if (BE (err != REG_NOERROR, 0))
++ if ((BE (next_char_idx >= mctx->input.bufs_len, 0)
++ && mctx->input.bufs_len < mctx->input.len)
++ || (BE (next_char_idx >= mctx->input.valid_len, 0)
++ && mctx->input.valid_len < mctx->input.len))
++ {
++ err = extend_buffers (mctx);
++ if (BE (err != REG_NOERROR, 0))
+ {
+ assert (err == REG_ESPACE);
+ return -2;
+@@ -1696,7 +1697,8 @@
+ {
+ int top = mctx->state_log_top;
+
+- if (next_state_log_idx >= mctx->input.bufs_len
++ if ((next_state_log_idx >= mctx->input.bufs_len
++ && mctx->input.bufs_len < mctx->input.len)
+ || (next_state_log_idx >= mctx->input.valid_len
+ && mctx->input.valid_len < mctx->input.len))
+ {
+@@ -3333,6 +3335,8 @@
+ {
+ state->trtable = (re_dfastate_t **)
+ calloc (sizeof (re_dfastate_t *), SBC_MAX);
++ if (BE (state->trtable == NULL, 0))
++ return 0;
+ return 1;
+ }
+ return 0;
+@@ -4066,7 +4070,7 @@
+ re_string_t *pstr = &mctx->input;
+
+ /* Double the lengthes of the buffers. */
+- ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
++ ret = re_string_realloc_buffers (pstr, MIN (pstr->len, pstr->bufs_len * 2));
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+--- a/posix/Makefile (revision 12231)
++++ b/posix/Makefile (revision 16211)
+@@ -106,7 +106,7 @@
+ tst-fnmatch2 tst-cpucount tst-cpuset
+ tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+ += tst-fnmatch tst-regexloc bug-regex1 bug-regex5 \
+- bug-regex23 bug-regex25
++ bug-regex23 bug-regex25 bug-regex32
+ tests-$(OPTION_EGLIBC_INET) \
+ += tst-getaddrinfo bug-ga1 tst-getaddrinfo2 \
+ tst-rfc3484 tst-rfc3484-2 tst-rfc3484-3 tst-getaddrinfo3
+--- a/posix/bug-regex32.c (revision 0)
++++ b/posix/bug-regex32.c (revision 16211)
+@@ -0,0 +1,36 @@
++// BZ 12811
++#include <regex.h>
++#include <stdio.h>
++#include <locale.h>
++
++static int
++do_test (void)
++{
++ char buf[1000];
++ regex_t preg;
++ if (setlocale (LC_CTYPE, "de_DE.UTF-8") == NULL)
++ {
++ puts ("setlocale failed");
++ return 1;
++ }
++
++ int e = regcomp (&preg, ".*ab", REG_ICASE);
++ if (e != 0)
++ {
++ regerror (e, &preg, buf, sizeof (buf));
++ printf ("regcomp = %d \"%s\"\n", e, buf);
++ return 1;
++ }
++
++ // Incomplete character at the end of the buffer
++ e = regexec (&preg, "aaaaaaaaaaaa\xc4", 0, NULL, 0);
++
++ regfree (&preg);
++ regerror (e, &preg, buf, sizeof (buf));
++ printf ("regexec = %d \"%s\"\n", e, buf);
++
++ return e != REG_NOMATCH;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- a/posix/fnmatch.c (revision 12231)
++++ b/posix/fnmatch.c (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007,2010
++/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007,2010,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -379,6 +379,11 @@
+ XXX Do we have to set `errno' to something which mbsrtows hasn't
+ already done? */
+ return -1;
++ if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
++ {
++ __set_errno (ENOMEM);
++ return -2;
++ }
+ wpattern_malloc = wpattern
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
+ assert (mbsinit (&ps));
+@@ -423,6 +428,12 @@
+ XXX Do we have to set `errno' to something which mbsrtows hasn't
+ already done? */
+ goto free_return;
++ if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
++ {
++ free (wpattern_malloc);
++ __set_errno (ENOMEM);
++ return -2;
++ }
+
+ wstring_malloc = wstring
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
+--- a/stdio-common/printf_fp.c (revision 12231)
++++ b/stdio-common/printf_fp.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Floating point output for `printf'.
+- Copyright (C) 1995-2003, 2006, 2007, 2008 Free Software Foundation, Inc.
++ Copyright (C) 1995-2003, 2006-2008, 2011 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+ Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+@@ -906,7 +906,9 @@
+ /* Guess the number of groups we will make, and thus how
+ many spaces we need for separator characters. */
+ ngroups = __guess_grouping (intdig_max, grouping);
+- chars_needed += ngroups;
++ /* Allocate one more character in case rounding increases the
++ number of groups. */
++ chars_needed += ngroups + 1;
+ }
+
+ /* Allocate buffer for output. We need two more because while rounding
+@@ -1110,10 +1112,17 @@
+ --wcp;
+
+ if (grouping)
+- /* Add in separator characters, overwriting the same buffer. */
+- wcp = group_number (wstartp, wcp, intdig_no, grouping, thousands_sepwc,
+- ngroups);
++ {
++ /* Rounding might have changed the number of groups. We allocated
++ enough memory but we need here the correct number of groups. */
++ if (intdig_no != intdig_max)
++ ngroups = __guess_grouping (intdig_no, grouping);
+
++ /* Add in separator characters, overwriting the same buffer. */
++ wcp = group_number (wstartp, wcp, intdig_no, grouping, thousands_sepwc,
++ ngroups);
++ }
++
+ /* Write the exponent if it is needed. */
+ if (type != 'f')
+ {
+@@ -1232,7 +1241,7 @@
+
+ tmpptr = buffer;
+ if (__builtin_expect (info->i18n, 0))
+- {
++ {
+ #ifdef COMPILE_WPRINTF
+ wstartp = _i18n_number_rewrite (wstartp, wcp,
+ wbuffer + wbuffer_to_alloc);
+@@ -1246,7 +1255,7 @@
+ assert ((uintptr_t) buffer <= (uintptr_t) tmpptr);
+ assert ((uintptr_t) tmpptr < (uintptr_t) buffer_end);
+ #endif
+- }
++ }
+
+ PRINT (tmpptr, wstartp, wide ? wcp - wstartp : cp - tmpptr);
+
+--- a/stdio-common/tst-grouping.c (revision 0)
++++ b/stdio-common/tst-grouping.c (revision 16211)
+@@ -0,0 +1,83 @@
++/* BZ 12394, test by Bruno Haible. */
++#include <locale.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++
++static int
++do_test (void)
++{
++ char buf1[1000];
++ char buf2[1000];
++ int result = 0;
++
++ if (setlocale (LC_NUMERIC, "de_DE.UTF-8") == NULL)
++ return 1;
++
++ sprintf (buf1, "%'.2f", 999.996);
++ sprintf (buf2, "%'.2f", 1000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 2;
++
++ sprintf (buf1, "%'.2f", 999999.996);
++ sprintf (buf2, "%'.2f", 1000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 2;
++
++ sprintf (buf1, "%'.2f", 999999999.996);
++ sprintf (buf2, "%'.2f", 1000000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 2;
++
++ sprintf (buf1, "%'.2f", 999999999999.996);
++ sprintf (buf2, "%'.2f", 1000000000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 2;
++
++ sprintf (buf1, "%'.2f", 999999999999999.996);
++ sprintf (buf2, "%'.2f", 1000000000000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 2;
++
++ sprintf (buf1, "%'.5g", 999.996);
++ sprintf (buf2, "%'.5g", 1000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 4;
++
++ sprintf (buf1, "%'.4g", 9999.996);
++ sprintf (buf2, "%'.4g", 10000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 8;
++
++ sprintf (buf1, "%'.5g", 99999.996);
++ sprintf (buf2, "%'.5g", 100000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 8;
++
++ sprintf (buf1, "%'.6g", 999999.996);
++ sprintf (buf2, "%'.6g", 1000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 8;
++
++ sprintf (buf1, "%'.7g", 9999999.996);
++ sprintf (buf2, "%'.7g", 10000000.004);
++ printf ("%d: \"%s\" vs \"%s\"\n", __LINE__, buf1, buf2);
++ if (strcmp (buf1, buf2) != 0)
++ result |= 8;
++
++ return result;
++}
++
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- a/stdio-common/_i18n_number.h (revision 12231)
++++ b/stdio-common/_i18n_number.h (revision 16211)
+@@ -33,8 +33,8 @@
+ # define decimal NULL
+ # define thousands NULL
+ #else
+- char decimal[MB_LEN_MAX];
+- char thousands[MB_LEN_MAX];
++ char decimal[MB_LEN_MAX + 1];
++ char thousands[MB_LEN_MAX + 1];
+ #endif
+
+ /* "to_outpunct" is a map from ASCII decimal point and thousands-sep
+@@ -50,13 +50,19 @@
+ mbstate_t state;
+ memset (&state, '\0', sizeof (state));
+
+- if (__wcrtomb (decimal, wdecimal, &state) == (size_t) -1)
++ size_t n = __wcrtomb (decimal, wdecimal, &state);
++ if (n == (size_t) -1)
+ memcpy (decimal, ".", 2);
++ else
++ decimal[n] = '\0';
+
+ memset (&state, '\0', sizeof (state));
+
+- if (__wcrtomb (thousands, wthousands, &state) == (size_t) -1)
++ n = __wcrtomb (thousands, wthousands, &state);
++ if (n == (size_t) -1)
+ memcpy (thousands, ",", 2);
++ else
++ thousands[n] = '\0';
+ }
+ #endif
+
+--- a/stdio-common/bug23.c (revision 0)
++++ b/stdio-common/bug23.c (revision 16211)
+@@ -0,0 +1,21 @@
++#include <stdio.h>
++#include <string.h>
++
++static char buf[32768];
++static const char expected[] = "\
++\n\
++a\n\
++abbcd55%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
++
++static int
++do_test (void)
++{
++ snprintf (buf, sizeof (buf),
++ "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d"
++ "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
++ "a", "b", "c", "d", 5);
++ return strcmp (buf, expected) != 0;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- a/stdio-common/Makefile (revision 12231)
++++ b/stdio-common/Makefile (revision 16211)
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1991-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
++# Copyright (C) 1991-2009, 2011 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
+@@ -68,9 +68,9 @@
+ tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
+ tst-fwrite bug16 bug17 tst-sprintf2 bug18 \
+ bug19 tst-popen2 scanf14 scanf15 bug21 bug22 scanf16 scanf17 \
+- tst-setvbuf1
++ tst-setvbuf1 bug23
+ tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+- += tst-sscanf tst-swprintf bug15 test-vfprintf bug14 scanf13
++ += tst-sscanf tst-swprintf bug15 test-vfprintf bug14 scanf13 tst-grouping
+ tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \
+ += tst-perror bug19a bug20
+ tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \
+@@ -142,6 +142,7 @@
+ scanf13-ENV = LOCPATH=$(common-objpfx)localedata
+ bug14-ENV = LOCPATH=$(common-objpfx)localedata
+ bug15-ENV = LOCPATH=$(common-objpfx)localedata
++tst-grouping-ENV = LOCPATH=$(common-objpfx)localedata
+
+ ifneq (,$(filter %REENTRANT, $(defines)))
+ CPPFLAGS += -D_IO_MTSAFE_IO
+--- a/stdio-common/vfprintf.c (revision 12231)
++++ b/stdio-common/vfprintf.c (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991-2008, 2009 Free Software Foundation, Inc.
++/* Copyright (C) 1991-2008, 2009, 2011 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
+@@ -1699,7 +1699,8 @@
+ {
+ /* Extend the array of format specifiers. */
+ struct printf_spec *old = specs;
+- specs = extend_alloca (specs, nspecs_max, 2 * nspecs_max);
++ specs = extend_alloca (specs, nspecs_max,
++ 2 * nspecs_max * sizeof (*specs));
+
+ /* Copy the old array's elements to the new space. */
+ memmove (specs, old, nspecs * sizeof (struct printf_spec));
+--- a/stdio-common/printf-parsemb.c (revision 12231)
++++ b/stdio-common/printf-parsemb.c (revision 16211)
+@@ -295,9 +295,9 @@
+ /* We don't try to get the types for all arguments if the format
+ uses more than one. The normal case is covered though. If
+ the call returns -1 we continue with the normal specifiers. */
+- || (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
+- (&spec->info, 1, &spec->data_arg_type,
+- &spec->size)) < 0)
++ || (int) (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
++ (&spec->info, 1, &spec->data_arg_type,
++ &spec->size)) < 0)
+ {
+ /* Find the data argument types of a built-in spec. */
+ spec->ndata_args = 1;
+--- a/resolv/res_debug.c (revision 12231)
++++ b/resolv/res_debug.c (revision 16211)
+@@ -189,7 +189,7 @@
+ buf = malloc(buflen += 1024);
+ if (buf == NULL) {
+ fprintf(file,
+- ";; memory allocation failure\n");
++ ";; memory allocation failure\n");
+ return;
+ }
+ continue;
+@@ -356,7 +356,7 @@
+ {C_HS, "HESIOD"},
+ {C_ANY, "ANY"},
+ {C_NONE, "NONE"},
+- {C_IN, (char *)0}
++ {C_IN, (char *)0}
+ };
+ libresolv_hidden_data_def (__p_class_syms)
+
+@@ -588,6 +588,7 @@
+ case RES_USEBSTRING: return "ip6-bytstring";
+ case RES_USE_EDNS0: return "edns0";
+ case RES_USE_DNSSEC: return "dnssec";
++ case RES_NOTLDQUERY: return "no-tld-query";
+ /* XXX nonreentrant */
+ default: sprintf(nbuf, "?0x%lx?", (u_long)option);
+ return (nbuf);
+--- a/resolv/netdb.h (revision 12231)
++++ b/resolv/netdb.h (revision 16211)
+@@ -1,4 +1,4 @@
+- /* Copyright (C) 1996-2002, 2003, 2004, 2009 Free Software Foundation, Inc.
++ /* Copyright (C) 1996-2004, 2009, 2011 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
+@@ -677,7 +677,7 @@
+ extern int getnameinfo (__const struct sockaddr *__restrict __sa,
+ socklen_t __salen, char *__restrict __host,
+ socklen_t __hostlen, char *__restrict __serv,
+- socklen_t __servlen, unsigned int __flags);
++ socklen_t __servlen, int __flags);
+ #endif /* POSIX */
+
+ #ifdef __USE_GNU
+--- a/resolv/res_init.c (revision 12231)
++++ b/resolv/res_init.c (revision 16211)
+@@ -545,6 +545,11 @@
+ } else if (!strncmp(cp, "single-request",
+ sizeof("single-request") - 1)) {
+ statp->options |= RES_SNGLKUP;
++ } else if (!strncmp(cp, "no_tld_query",
++ sizeof("no_tld_query") - 1) ||
++ !strncmp(cp, "no-tld-query",
++ sizeof("no-tld-query") - 1)) {
++ statp->options |= RES_NOTLDQUERY;
+ } else {
+ /* XXX - print a warning here? */
+ }
+--- a/resolv/res_query.c (revision 12231)
++++ b/resolv/res_query.c (revision 16211)
+@@ -123,7 +123,7 @@
+ {
+ HEADER *hp = (HEADER *) answer;
+ int n, use_malloc = 0;
+- u_int oflags = statp->_flags;
++ u_int oflags = statp->_flags;
+
+ size_t bufsize = (type == T_UNSPEC ? 2 : 1) * QUERYSIZE;
+ u_char *buf = alloca (bufsize);
+@@ -210,7 +210,7 @@
+ if (statp->options & RES_DEBUG)
+ printf(";; res_nquery: retry without EDNS0\n");
+ #endif
+- goto again;
++ goto again;
+ }
+ #ifdef DEBUG
+ if (statp->options & RES_DEBUG)
+@@ -344,6 +344,7 @@
+ int trailing_dot, ret, saved_herrno;
+ int got_nodata = 0, got_servfail = 0, root_on_list = 0;
+ int tried_as_is = 0;
++ int searched = 0;
+
+ __set_errno (0);
+ RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */
+@@ -406,6 +407,7 @@
+ for (domain = (const char * const *)statp->dnsrch;
+ *domain && !done;
+ domain++) {
++ searched = 1;
+
+ if (domain[0][0] == '\0' ||
+ (domain[0][0] == '.' && domain[0][1] == '\0'))
+@@ -477,11 +479,11 @@
+ }
+
+ /*
+- * If the name has any dots at all, and no earlier 'as-is' query
+- * for the name, and "." is not on the search list, then try an as-is
+- * query now.
++ * f the query has not already been tried as is then try it
++ * unless RES_NOTLDQUERY is set and there were no dots.
+ */
+- if (dots && !(tried_as_is || root_on_list)) {
++ if ((dots || !searched || (statp->options & RES_NOTLDQUERY) == 0)
++ && !(tried_as_is || root_on_list)) {
+ ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
+ answer, anslen, answerp,
+ answerp2, nanswerp2, resplen2);
+--- a/resolv/resolv.h (revision 12231)
++++ b/resolv/resolv.h (revision 16211)
+@@ -102,7 +102,7 @@
+ # define RES_MAXTIME 65535 /* Infinity, in milliseconds. */
+
+ struct __res_state {
+- int retrans; /* retransmition time interval */
++ int retrans; /* retransmition time interval */
+ int retry; /* number of times to retransmit */
+ u_long options; /* option flags - see below. */
+ int nscount; /* number of name servers */
+@@ -219,6 +219,8 @@
+ #define RES_SNGLKUPREOP 0x00400000 /* -"-, but open new socket for each
+ request */
+ #define RES_USE_DNSSEC 0x00800000 /* use DNSSEC using OK bit in OPT */
++#define RES_NOTLDQUERY 0x01000000 /* Do not look up unqualified name
++ as a TLD. */
+
+ #define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT)
+
+--- a/resolv/nss_dns/dns-host.c (revision 12231)
++++ b/resolv/nss_dns/dns-host.c (revision 16211)
+@@ -599,7 +599,6 @@
+ int (*name_ok) (const char *);
+ u_char packtmp[NS_MAXCDNAME];
+ int have_to_map = 0;
+- int32_t ttl = 0;
+ uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data);
+ buffer += pad;
+ if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0))
+@@ -733,7 +732,7 @@
+ cp += INT16SZ; /* type */
+ class = __ns_get16 (cp);
+ cp += INT16SZ; /* class */
+- ttl = __ns_get32 (cp);
++ int32_t ttl = __ns_get32 (cp);
+ cp += INT32SZ; /* TTL */
+ n = __ns_get16 (cp);
+ cp += INT16SZ; /* len */
+@@ -907,7 +906,7 @@
+ {
+ register int nn;
+
+- if (ttlp != NULL && ttl != 0)
++ if (ttlp != NULL)
+ *ttlp = ttl;
+ if (canonp != NULL)
+ *canonp = bp;
+@@ -1163,7 +1162,7 @@
+
+ if (*firstp)
+ {
+- if (ttl != 0 && ttlp != NULL)
++ if (ttlp != NULL)
+ *ttlp = ttl;
+
+ (*pat)->name = canon ?: h_name;
+--- a/conform/data/netdb.h-data (revision 12231)
++++ b/conform/data/netdb.h-data (revision 16211)
+@@ -87,7 +87,7 @@
+ function {struct hostent*} gethostbyaddr (const void*, socklen_t, int)
+ function {struct hostent*} gethostbyname (const char*)
+ function {struct hostent*} gethostent (void)
+-function int getnameinfo (const struct sockaddr*, socklen_t, char*, socklen_t, char*, socklen_t, unsigned)
++function int getnameinfo (const struct sockaddr*, socklen_t, char*, socklen_t, char*, socklen_t, int)
+ function {struct netent*} getnetbyaddr (uint32_t, int)
+ function {struct netent*} getnetbyname (const char*)
+ function {struct netent*} getnetent (void)
+--- a/elf/dl-tls.c (revision 12231)
++++ b/elf/dl-tls.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Thread-local storage handling in the ELF dynamic linker. Generic version.
+- Copyright (C) 2002,2003,2004,2005,2006,2008 Free Software Foundation, Inc.
++ Copyright (C) 2002-2006,2008,2011 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
+@@ -33,10 +33,7 @@
+ to allow dynamic loading of modules defining IE-model TLS data. */
+ #define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
+
+-/* Value used for dtv entries for which the allocation is delayed. */
+-#define TLS_DTV_UNALLOCATED ((void *) -1l)
+
+-
+ /* Out-of-memory handler. */
+ #ifdef SHARED
+ static void
+--- a/elf/dl-deps.c (revision 12231)
++++ b/elf/dl-deps.c (revision 16211)
+@@ -491,6 +491,10 @@
+ if (errno == 0 && errno_saved != 0)
+ __set_errno (errno_saved);
+
++ if (errno_reason)
++ _dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,
++ NULL, errstring);
++
+ struct link_map **old_l_initfini = NULL;
+ if (map->l_initfini != NULL && map->l_type == lt_loaded)
+ {
+@@ -666,8 +670,4 @@
+ }
+ if (old_l_initfini != NULL)
+ _dl_scope_free (old_l_initfini);
+-
+- if (errno_reason)
+- _dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,
+- NULL, errstring);
+ }
+--- a/elf/dl-dst.h (revision 12231)
++++ b/elf/dl-dst.h (revision 16211)
+@@ -1,6 +1,5 @@
+ /* Handling of dynamic sring tokens.
+- Copyright (C) 1999,2001,2002,2003,2004,2006,2007
+- Free Software Foundation, Inc.
++ Copyright (C) 1999,2001-2004,2006,2007,2011 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
+@@ -18,6 +17,8 @@
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
++#include "trusted-dirs.h"
++
+ /* Determine the number of DST elements in the name. Only if IS_PATH is
+ nonzero paths are recognized (i.e., multiple, ':' separated filenames). */
+ #define DL_DST_COUNT(name, is_path) \
+@@ -31,6 +32,11 @@
+ __cnt; })
+
+
++#ifdef SHARED
++# define IS_RTLD(l) (l) == &GL(dl_rtld_map)
++#else
++# define IS_RTLD(l) 0
++#endif
+ /* Guess from the number of DSTs the length of the result string. */
+ #define DL_DST_REQUIRED(l, name, len, cnt) \
+ ({ \
+@@ -39,28 +45,32 @@
+ \
+ if (__cnt > 0) \
+ { \
+- size_t origin_len; \
++ size_t dst_len; \
+ /* Now we make a guess how many extra characters on top of the \
+ length of S we need to represent the result. We know that \
+ we have CNT replacements. Each at most can use \
+- MAX (strlen (ORIGIN), strlen (_dl_platform)) \
+- minus 7 (which is the length of "$ORIGIN"). \
++ MAX (MAX (strlen (ORIGIN), strlen (_dl_platform)), \
++ strlen (DL_DST_LIB)) \
++ minus 4 (which is the length of "$LIB"). \
+ \
+ First get the origin string if it is not available yet. \
+- This can only happen for the map of the executable. */ \
++ This can only happen for the map of the executable or, when \
++ auditing, in ld.so. */ \
+ DL_DST_REQ_STATIC (l) \
+ if ((l)->l_origin == NULL) \
+ { \
+- assert ((l)->l_name[0] == '\0'); \
++ assert ((l)->l_name[0] == '\0' || IS_RTLD (l)); \
+ (l)->l_origin = _dl_get_origin (); \
+- origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1 \
++ dst_len = ((l)->l_origin && (l)->l_origin != (char *) -1 \
+ ? strlen ((l)->l_origin) : 0); \
+ } \
+ else \
+- origin_len = (l)->l_origin == (char *) -1 \
++ dst_len = (l)->l_origin == (char *) -1 \
+ ? 0 : strlen ((l)->l_origin); \
+- \
+- __len += __cnt * (MAX (origin_len, GLRO(dl_platformlen)) - 7); \
++ dst_len = MAX (MAX (dst_len, GLRO(dl_platformlen)), \
++ strlen (DL_DST_LIB)); \
++ if (dst_len > 4) \
++ __len += __cnt * (dst_len - 4); \
+ } \
+ \
+ __len; })
+@@ -72,7 +82,7 @@
+ if ((l) == NULL) \
+ { \
+ const char *origin = _dl_get_origin (); \
+- origin_len = (origin && origin != (char *) -1 ? strlen (origin) : 0); \
++ dst_len = (origin && origin != (char *) -1 ? strlen (origin) : 0); \
+ } \
+ else
+ #endif
+--- a/elf/dl-runtime.c (revision 12231)
++++ b/elf/dl-runtime.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* On-demand PLT fixup for shared objects.
+- Copyright (C) 1995-2009, 2010 Free Software Foundation, Inc.
++ Copyright (C) 1995-2009, 2010, 2011 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
+@@ -446,6 +446,7 @@
+
+ /* Set up the sym parameter. */
+ ElfW(Sym) sym = *defsym;
++ sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
+
+ /* Get the symbol name. */
+ const char *strtab = (const void *) D_PTR (reloc_result->bound,
+--- a/elf/dl-load.c (revision 12231)
++++ b/elf/dl-load.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Map in a shared object's segments from the file.
+- Copyright (C) 1995-2005, 2006, 2007, 2009 Free Software Foundation, Inc.
++ Copyright (C) 1995-2007, 2009, 2011 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
+@@ -168,6 +168,87 @@
+ }
+
+
++static bool
++is_trusted_path (const char *path, size_t len)
++{
++ const char *trun = system_dirs;
++
++ for (size_t idx = 0; idx < nsystem_dirs_len; ++idx)
++ {
++ if (len == system_dirs_len[idx] && memcmp (trun, path, len) == 0)
++ /* Found it. */
++ return true;
++
++ trun += system_dirs_len[idx] + 1;
++ }
++
++ return false;
++}
++
++
++static bool
++is_trusted_path_normalize (const char *path, size_t len)
++{
++ if (len == 0)
++ return false;
++
++ if (*path == ':')
++ {
++ ++path;
++ --len;
++ }
++
++ char *npath = (char *) alloca (len + 2);
++ char *wnp = npath;
++ while (*path != '\0')
++ {
++ if (path[0] == '/')
++ {
++ if (path[1] == '.')
++ {
++ if (path[2] == '.' && (path[3] == '/' || path[3] == '\0'))
++ {
++ while (wnp > npath && *--wnp != '/')
++ ;
++ path += 3;
++ continue;
++ }
++ else if (path[2] == '/' || path[2] == '\0')
++ {
++ path += 2;
++ continue;
++ }
++ }
++
++ if (wnp > npath && wnp[-1] == '/')
++ {
++ ++path;
++ continue;
++ }
++ }
++
++ *wnp++ = *path++;
++ }
++
++ if (wnp == npath || wnp[-1] != '/')
++ *wnp++ = '/';
++
++ const char *trun = system_dirs;
++
++ for (size_t idx = 0; idx < nsystem_dirs_len; ++idx)
++ {
++ if (wnp - npath >= system_dirs_len[idx]
++ && memcmp (trun, npath, system_dirs_len[idx]) == 0)
++ /* Found it. */
++ return true;
++
++ trun += system_dirs_len[idx] + 1;
++ }
++
++ return false;
++}
++
++
+ static size_t
+ is_dst (const char *start, const char *name, const char *str,
+ int is_path, int secure)
+@@ -200,7 +281,8 @@
+ return 0;
+
+ if (__builtin_expect (secure, 0)
+- && ((name[len] != '\0' && (!is_path || name[len] != ':'))
++ && ((name[len] != '\0' && name[len] != '/'
++ && (!is_path || name[len] != ':'))
+ || (name != start + 1 && (!is_path || name[-2] != ':'))))
+ return 0;
+
+@@ -240,13 +322,14 @@
+ int is_path)
+ {
+ const char *const start = name;
+- char *last_elem, *wp;
+
+ /* Now fill the result path. While copying over the string we keep
+ track of the start of the last path element. When we come accross
+ a DST we copy over the value or (if the value is not available)
+ leave the entire path element out. */
+- last_elem = wp = result;
++ char *wp = result;
++ char *last_elem = result;
++ bool check_for_trusted = false;
+
+ do
+ {
+@@ -265,6 +348,9 @@
+ else
+ #endif
+ repl = l->l_origin;
++
++ check_for_trusted = (INTUSE(__libc_enable_secure)
++ && l->l_type == lt_executable);
+ }
+ else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0)
+ repl = GLRO(dl_platform);
+@@ -284,6 +370,10 @@
+ name += len;
+ while (*name != '\0' && (!is_path || *name != ':'))
+ ++name;
++ /* Also skip following colon if this is the first rpath
++ element, but keep an empty element at the end. */
++ if (wp == result && is_path && *name == ':' && name[1] != '\0')
++ ++name;
+ }
+ else
+ /* No DST we recognize. */
+@@ -293,11 +383,28 @@
+ {
+ *wp++ = *name++;
+ if (is_path && *name == ':')
+- last_elem = wp;
++ {
++ /* In SUID/SGID programs, after $ORIGIN expansion the
++ normalized path must be rooted in one of the trusted
++ directories. */
++ if (__builtin_expect (check_for_trusted, false)
++ && !is_trusted_path_normalize (last_elem, wp - last_elem))
++ wp = last_elem;
++ else
++ last_elem = wp;
++
++ check_for_trusted = false;
++ }
+ }
+ }
+ while (*name != '\0');
+
++ /* In SUID/SGID programs, after $ORIGIN expansion the normalized
++ path must be rooted in one of the trusted directories. */
++ if (__builtin_expect (check_for_trusted, false)
++ && !is_trusted_path_normalize (last_elem, wp - last_elem))
++ wp = last_elem;
++
+ *wp = '\0';
+
+ return result;
+@@ -310,7 +417,7 @@
+ belonging to the map is loaded. In this case the path element
+ containing $ORIGIN is left out. */
+ static char *
+-expand_dynamic_string_token (struct link_map *l, const char *s)
++expand_dynamic_string_token (struct link_map *l, const char *s, int is_path)
+ {
+ /* We make two runs over the string. First we determine how large the
+ resulting string is and then we copy it over. Since this is now
+@@ -321,7 +428,7 @@
+ char *result;
+
+ /* Determine the number of DST elements. */
+- cnt = DL_DST_COUNT (s, 1);
++ cnt = DL_DST_COUNT (s, is_path);
+
+ /* If we do not have to replace anything simply copy the string. */
+ if (__builtin_expect (cnt, 0) == 0)
+@@ -335,7 +442,7 @@
+ if (result == NULL)
+ return NULL;
+
+- return _dl_dst_substitute (l, s, result, 1);
++ return _dl_dst_substitute (l, s, result, is_path);
+ }
+
+
+@@ -407,34 +514,9 @@
+ cp[len++] = '/';
+
+ /* Make sure we don't use untrusted directories if we run SUID. */
+- if (__builtin_expect (check_trusted, 0))
+- {
+- const char *trun = system_dirs;
+- size_t idx;
+- int unsecure = 1;
++ if (__builtin_expect (check_trusted, 0) && !is_trusted_path (cp, len))
++ continue;
+
+- /* All trusted directories must be complete names. */
+- if (cp[0] == '/')
+- {
+- for (idx = 0; idx < nsystem_dirs_len; ++idx)
+- {
+- if (len == system_dirs_len[idx]
+- && memcmp (trun, cp, len) == 0)
+- {
+- /* Found it. */
+- unsecure = 0;
+- break;
+- }
+-
+- trun += system_dirs_len[idx] + 1;
+- }
+- }
+-
+- if (unsecure)
+- /* Simply drop this directory. */
+- continue;
+- }
+-
+ /* See if this directory is already known. */
+ for (dirp = GL(dl_all_dirs); dirp != NULL; dirp = dirp->next)
+ if (dirp->dirnamelen == len && memcmp (cp, dirp->dirname, len) == 0)
+@@ -551,13 +633,21 @@
+
+ /* Make a writable copy. At the same time expand possible dynamic
+ string tokens. */
+- copy = expand_dynamic_string_token (l, rpath);
++ copy = expand_dynamic_string_token (l, rpath, 1);
+ if (copy == NULL)
+ {
+ errstring = N_("cannot create RUNPATH/RPATH copy");
+ goto signal_error;
+ }
+
++ /* Ignore empty rpaths. */
++ if (*copy == 0)
++ {
++ free (copy);
++ sps->dirs = (struct r_search_path_elem **) -1;
++ return false;
++ }
++
+ /* Count the number of necessary elements in the result array. */
+ nelems = 0;
+ for (cp = copy; *cp != '\0'; ++cp)
+@@ -2100,7 +2190,9 @@
+ {
+ #ifdef SHARED
+ // XXX Correct to unconditionally default to namespace 0?
+- l = loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded;
++ l = (loader
++ ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded
++ ?: &GL(dl_rtld_map));
+ #else
+ l = loader;
+ #endif
+@@ -2166,7 +2258,7 @@
+ {
+ /* The path may contain dynamic string tokens. */
+ realname = (loader
+- ? expand_dynamic_string_token (loader, name)
++ ? expand_dynamic_string_token (loader, name, 0)
+ : local_strdup (name));
+ if (realname == NULL)
+ fd = -1;
+--- a/elf/ldconfig.c (revision 12231)
++++ b/elf/ldconfig.c (revision 16211)
+@@ -387,15 +387,18 @@
+ }
+
+ /* Canonify path: for now only remove leading and trailing
+- whitespace and the trailing slashes slashes. */
+- i = strlen (entry->path) - 1;
++ whitespace and the trailing slashes. */
++ i = strlen (entry->path);
+
+- while (isspace (entry->path[i]) && i > 0)
+- entry->path[i--] = '\0';
++ while (i > 0 && isspace (entry->path[i - 1]))
++ entry->path[--i] = '\0';
+
+- while (entry->path[i] == '/' && i > 0)
+- entry->path[i--] = '\0';
++ while (i > 0 && entry->path[i - 1] == '/')
++ entry->path[--i] = '\0';
+
++ if (i == 0)
++ return;
++
+ char *path = entry->path;
+ if (opt_chroot)
+ path = chroot_canon (opt_chroot, path);
+--- a/elf/dl-lookup.c (revision 12231)
++++ b/elf/dl-lookup.c (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Look up a symbol in the loaded objects.
+- Copyright (C) 1995-2005, 2006, 2007, 2009 Free Software Foundation, Inc.
++ Copyright (C) 1995-2007, 2009, 2011 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
+@@ -312,39 +312,21 @@
+ definition we have to use it. */
+ void enter (struct unique_sym *table, size_t size,
+ unsigned int hash, const char *name,
+- const ElfW(Sym) *sym, struct link_map *map)
++ const ElfW(Sym) *sym, const struct link_map *map)
+ {
+ size_t idx = hash % size;
+ size_t hash2 = 1 + hash % (size - 2);
+- while (1)
++ while (table[idx].name != NULL)
+ {
+- if (table[idx].name == NULL)
+- {
+- table[idx].hashval = hash;
+- table[idx].name = name;
+- if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
+- {
+- table[idx].sym = ref;
+- table[idx].map = undef_map;
+- }
+- else
+- {
+- table[idx].sym = sym;
+- table[idx].map = map;
+-
+- if (map->l_type == lt_loaded)
+- /* Make sure we don't unload this object by
+- setting the appropriate flag. */
+- map->l_flags_1 |= DF_1_NODELETE;
+- }
+-
+- return;
+- }
+-
+ idx += hash2;
+ if (idx >= size)
+ idx -= size;
+ }
++
++ table[idx].hashval = hash;
++ table[idx].name = name;
++ table[idx].sym = sym;
++ table[idx].map = map;
+ }
+
+ struct unique_sym_table *tab
+@@ -363,8 +345,19 @@
+ if (entries[idx].hashval == new_hash
+ && strcmp (entries[idx].name, undef_name) == 0)
+ {
+- result->s = entries[idx].sym;
+- result->m = (struct link_map *) entries[idx].map;
++ if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
++ {
++ /* We possibly have to initialize the central
++ copy from the copy addressed through the
++ relocation. */
++ result->s = sym;
++ result->m = (struct link_map *) map;
++ }
++ else
++ {
++ result->s = entries[idx].sym;
++ result->m = (struct link_map *) entries[idx].map;
++ }
+ __rtld_lock_unlock_recursive (tab->lock);
+ return 1;
+ }
+@@ -425,8 +418,19 @@
+ tab->free = free;
+ }
+
+- enter (entries, size, new_hash, strtab + sym->st_name, sym,
+- (struct link_map *) map);
++ if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
++ enter (entries, size, new_hash, strtab + sym->st_name, ref,
++ undef_map);
++ else
++ {
++ enter (entries, size, new_hash, strtab + sym->st_name, sym,
++ map);
++
++ if (map->l_type == lt_loaded)
++ /* Make sure we don't unload this object by
++ setting the appropriate flag. */
++ ((struct link_map *) map)->l_flags_1 |= DF_1_NODELETE;
++ }
+ ++tab->n_elements;
+
+ __rtld_lock_unlock_recursive (tab->lock);
+--- a/io/fcntl.h (revision 12231)
++++ b/io/fcntl.h (revision 16211)
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991,1992,1994-2001,2003,2004,2005,2006,2007, 2009
++/* Copyright (C) 1991,1992,1994-2001,2003,2004,2005,2006,2007,2009,2010,2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -64,6 +64,8 @@
+ # define AT_REMOVEDIR 0x200 /* Remove directory instead of
+ unlinking file. */
+ # define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
++# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
++ traversal. */
+ # define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
+ #endif
+--- a/ports/sysdeps/arm/sysdep.h (revision 12231)
++++ b/ports/sysdeps/arm/sysdep.h (revision 16211)
+@@ -18,6 +18,7 @@
+ 02111-1307 USA. */
+
+ #include <sysdeps/generic/sysdep.h>
++#include <features.h>
+
+ #if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \
+ && !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__))
+@@ -89,10 +90,16 @@
+
+ /* If compiled for profiling, call `mcount' at the start of each function. */
+ #ifdef PROF
++#if __GNUC_PREREQ(4,4) && defined(__ARM_EABI__)
+ #define CALL_MCOUNT \
+ str lr,[sp, #-4]! ; \
++ bl PLTJMP(mcount) ;
++#else
++#define CALL_MCOUNT \
++ str lr,[sp, #-4]! ; \
+ bl PLTJMP(mcount) ; \
+ ldr lr, [sp], #4 ;
++#endif
+ #else
+ #define CALL_MCOUNT /* Do nothing. */
+ #endif
+@@ -102,8 +109,12 @@
+ on this system, the asm identifier `syscall_error' intrudes on the
+ C name space. Make sure we use an innocuous name. */
+ #define syscall_error __syscall_error
++#if __GNUC_PREREQ(4,4) && defined(__ARM_EABI__)
++#define mcount __gnu_mcount_nc
++#else
+ #define mcount _mcount
+ #endif
++#endif
+
+ #if defined(__ARM_EABI__)
+ /* Tag_ABI_align8_preserved: This code preserves 8-byte
+--- a/ports/sysdeps/arm/elf/start.S (revision 12231)
++++ b/ports/sysdeps/arm/elf/start.S (revision 16211)
+@@ -134,6 +134,7 @@
+ bl abort
+
+ #ifdef SHARED
++ .align 2
+ .L_GOT:
+ .word _GLOBAL_OFFSET_TABLE_ - .L_GOT
+ .word __libc_csu_fini(GOT)
+--- a/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h (revision 12231)
++++ b/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/ARM version.
+- Copyright (C) 1997, 2000, 2003, 2005, 2006, 2009
++ Copyright (C) 1997, 2000, 2003, 2005, 2006, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -94,6 +94,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h (revision 12231)
++++ b/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/m68k version.
+- Copyright (C) 1997, 2000, 2003, 2005, 2008, 2009
++ Copyright (C) 1997, 2000, 2003, 2005, 2008, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -94,6 +94,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c (revision 0)
++++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c (revision 16211)
+@@ -0,0 +1 @@
++#include <io/ftw.c>
+--- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c (revision 0)
++++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c (revision 16211)
+@@ -0,0 +1 @@
++#include <io/ftw64.c>
+--- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c (revision 0)
++++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c (revision 16211)
+@@ -0,0 +1 @@
++/* Empty. */
+--- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c (revision 0)
++++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c (revision 16211)
+@@ -0,0 +1 @@
++/* Empty. */
+--- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (revision 0)
++++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (revision 16211)
+@@ -0,0 +1,4 @@
++# File name Caller Syscall name # args Strong name Weak names
++
++fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64
++statfs - statfs i:sp __statfs statfs statfs64 __statfs64
+--- a/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h (revision 12231)
++++ b/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h (revision 16211)
+@@ -1,5 +1,5 @@
+ /* Definitions for POSIX memory map interface. Linux/MIPS version.
+- Copyright (C) 1997, 2000, 2003, 2004, 2005, 2006, 2009
++ Copyright (C) 1997, 2000, 2003, 2004, 2005, 2006, 2009, 2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+@@ -96,6 +96,8 @@
+ # define MADV_DOFORK 11 /* Do inherit across fork. */
+ # define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+ # define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
++# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
++# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+ # define MADV_HWPOISON 100 /* Poison a page for testing. */
+ #endif
+
+--- a/ports/sysdeps/unix/sysv/linux/mips/bits/socket.h (revision 12231)
++++ b/ports/sysdeps/unix/sysv/linux/mips/bits/socket.h (revision 16211)
+@@ -1,6 +1,6 @@
+ /* System-specific socket constants and types. Linux/MIPS version.
+ Copyright (C) 1991, 92, 1994-1999, 2000, 2001, 2004, 2005, 2006, 2007, 2008,
+- 2009 Free Software Foundation, Inc.
++ 2009, 2010, 2011 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
+@@ -109,7 +109,9 @@
+ #define PF_ISDN 34 /* mISDN sockets. */
+ #define PF_PHONET 35 /* Phonet sockets. */
+ #define PF_IEEE802154 36 /* IEEE 802.15.4 sockets. */
+-#define PF_MAX 37 /* For now.. */
++#define PF_CAIF 37 /* CAIF sockets. */
++#define PF_ALG 38 /* Algorithm sockets. */
++#define PF_MAX 39 /* For now.. */
+
+ /* Address families. */
+ #define AF_UNSPEC PF_UNSPEC
+@@ -150,6 +152,8 @@
+ #define AF_ISDN PF_ISDN
+ #define AF_PHONET PF_PHONET
+ #define AF_IEEE802154 PF_IEEE802154
++#define AF_CAIF PF_CAIF
++#define AF_ALG PF_ALG
+ #define AF_MAX PF_MAX
+
+ /* Socket level values. Others are defined in the appropriate headers.
+--- a/ports/ChangeLog.mips (revision 12231)
++++ b/ports/ChangeLog.mips (revision 16211)
+@@ -1,3 +1,26 @@
++2011-11-17 Joseph Myers <joseph@codesourcery.com>
++
++ * sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c,
++ sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c: New.
++
++2011-09-06 Joseph Myers <joseph@codesourcery.com>
++
++ [BZ #13109]
++ * sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (fstatfs)
++ (statfs): New.
++ * sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c,
++ sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c: New.
++
++2011-01-25 Joseph Myers <joseph@codesourcery.com>
++
++ * sysdeps/unix/sysv/linux/mips/bits/mman.h (MADV_HUGEPAGE,
++ MADV_NOHUGEPAGE): Define.
++
++2011-01-25 Joseph Myers <joseph@codesourcery.com>
++
++ * sysdeps/unix/sysv/linux/mips/bits/socket.h (AF_CAIF, AF_ALG,
++ PF_CAIF, PF_ALG): Define.
++
+ 2009-12-16 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/mips/dl-lookup.c: Update from generic version.
+--- a/ports/ChangeLog.arm (revision 12231)
++++ b/ports/ChangeLog.arm (revision 16211)
+@@ -1,3 +1,19 @@
++2011-06-30 Richard Sandiford <richard.sandiford@linaro.org>
++
++ * sysdeps/arm/elf/start.S (_start): Align the constant pool to 4 bytes.
++
++2011-02-16 Manjunath Matti <manjunath81@gmail.com>
++
++ * sysdeps/arm/sysdep.h (CALL_MCOUNT): Use __gnu_mcount_nc
++ interface for EABI with GCC 4.4 or later.
++ (mcount): Define to __gnu_mcount_nc for EABI with GCC 4.4 or
++ later.
++
++2011-01-25 Joseph Myers <joseph@codesourcery.com>
++
++ * sysdeps/unix/sysv/linux/arm/bits/mman.h (MADV_HUGEPAGE,
++ MADV_NOHUGEPAGE): Define.
++
+ 2009-11-19 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/arm/kernel-features.h (__ASSUME_PSELECT,
+--- a/ports/ChangeLog.m68k (revision 12231)
++++ b/ports/ChangeLog.m68k (revision 16211)
+@@ -1,3 +1,8 @@
++2011-01-18 Andreas Schwab <schwab@linux-m68k.org>
++
++ * sysdeps/unix/sysv/linux/m68k/bits/mman.h (MADV_HUGEPAGE)
++ (MADV_NOHUGEPAGE): Define.
++
+ 2009-11-17 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #10972]
diff -Nru eglibc-2.11.2/elf/Makefile eglibc-2.11.3/elf/Makefile
--- eglibc-2.11.2/elf/Makefile 2010-03-22 21:19:13.000000000 +0000
+++ eglibc-2.11.3/elf/Makefile 2010-12-06 20:55:10.000000000 +0000
@@ -766,11 +766,11 @@
$(objpfx)tst-tls9: $(libdl)
$(objpfx)tst-tls9.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
-$(objpfx)tst-tls10: $(objpfx)tst-tlsmod8.so
+$(objpfx)tst-tls10: $(objpfx)tst-tlsmod8.so $(objpfx)tst-tlsmod7.so
-$(objpfx)tst-tls11: $(objpfx)tst-tlsmod10.so
+$(objpfx)tst-tls11: $(objpfx)tst-tlsmod10.so $(objpfx)tst-tlsmod9.so
-$(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so
+$(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so $(objpfx)tst-tlsmod11.so
$(objpfx)tst-tls13: $(libdl)
$(objpfx)tst-tls13.out: $(objpfx)tst-tlsmod13a.so
diff -Nru eglibc-2.11.2/elf/dl-deps.c eglibc-2.11.3/elf/dl-deps.c
--- eglibc-2.11.2/elf/dl-deps.c 2007-10-08 15:18:44.000000000 +0000
+++ eglibc-2.11.3/elf/dl-deps.c 2010-11-07 12:16:06.000000000 +0000
@@ -62,7 +62,7 @@
{
struct openaux_args *args = (struct openaux_args *) a;
- args->aux = _dl_map_object (args->map, args->name, 0,
+ args->aux = _dl_map_object (args->map, args->name,
(args->map->l_type == lt_executable
? lt_library : args->map->l_type),
args->trace_mode, args->open_mode,
diff -Nru eglibc-2.11.2/elf/dl-load.c eglibc-2.11.3/elf/dl-load.c
--- eglibc-2.11.2/elf/dl-load.c 2009-10-22 19:51:30.000000000 +0000
+++ eglibc-2.11.3/elf/dl-load.c 2010-12-06 20:55:10.000000000 +0000
@@ -801,19 +801,7 @@
/* The file might already be closed. */
if (fd != -1)
(void) __close (fd);
- if (l != NULL)
- {
- /* Remove the stillborn object from the list and free it. */
- assert (l->l_next == NULL);
- if (l->l_prev == NULL)
- /* No other module loaded. This happens only in the static library,
- or in rtld under --verify. */
- GL(dl_ns)[l->l_ns]._ns_loaded = NULL;
- else
- l->l_prev->l_next = NULL;
- --GL(dl_ns)[l->l_ns]._ns_nloaded;
- free (l);
- }
+ free (l);
free (realname);
if (r != NULL)
@@ -898,6 +886,9 @@
never be unloaded. */
__close (fd);
+ /* Add the map for the mirrored object to the object list. */
+ _dl_add_to_namespace_list (l, nsid);
+
return l;
}
#endif
@@ -1492,6 +1483,9 @@
add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB])
+ l->l_info[DT_SONAME]->d_un.d_val));
+ /* Now that the object is fully initialized add it to the object list. */
+ _dl_add_to_namespace_list (l, nsid);
+
#ifdef SHARED
/* Auditing checkpoint: we have a new object. */
if (__builtin_expect (GLRO(dl_naudit) > 0, 0)
@@ -1802,7 +1796,7 @@
if MAY_FREE_DIRS is true. */
static int
-open_path (const char *name, size_t namelen, int preloaded,
+open_path (const char *name, size_t namelen, int secure,
struct r_search_path_struct *sps, char **realname,
struct filebuf *fbp, struct link_map *loader, int whatcode,
bool *found_other_class)
@@ -1884,7 +1878,7 @@
/* Remember whether we found any existing directory. */
here_any |= this_dir->status[cnt] != nonexisting;
- if (fd != -1 && __builtin_expect (preloaded, 0)
+ if (fd != -1 && __builtin_expect (secure, 0)
&& INTUSE(__libc_enable_secure))
{
/* This is an extra security effort to make sure nobody can
@@ -1953,7 +1947,7 @@
struct link_map *
internal_function
-_dl_map_object (struct link_map *loader, const char *name, int preloaded,
+_dl_map_object (struct link_map *loader, const char *name,
int type, int trace_mode, int mode, Lmid_t nsid)
{
int fd;
@@ -2057,7 +2051,8 @@
for (l = loader; l; l = l->l_loader)
if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH"))
{
- fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs,
+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
+ &l->l_rpath_dirs,
&realname, &fb, loader, LA_SER_RUNPATH,
&found_other_class);
if (fd != -1)
@@ -2072,14 +2067,15 @@
&& main_map != NULL && main_map->l_type != lt_loaded
&& cache_rpath (main_map, &main_map->l_rpath_dirs, DT_RPATH,
"RPATH"))
- fd = open_path (name, namelen, preloaded, &main_map->l_rpath_dirs,
+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
+ &main_map->l_rpath_dirs,
&realname, &fb, loader ?: main_map, LA_SER_RUNPATH,
&found_other_class);
}
/* Try the LD_LIBRARY_PATH environment variable. */
if (fd == -1 && env_path_list.dirs != (void *) -1)
- fd = open_path (name, namelen, preloaded, &env_path_list,
+ fd = open_path (name, namelen, mode & __RTLD_SECURE, &env_path_list,
&realname, &fb,
loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded,
LA_SER_LIBPATH, &found_other_class);
@@ -2088,12 +2084,12 @@
if (fd == -1 && loader != NULL
&& cache_rpath (loader, &loader->l_runpath_dirs,
DT_RUNPATH, "RUNPATH"))
- fd = open_path (name, namelen, preloaded,
+ fd = open_path (name, namelen, mode & __RTLD_SECURE,
&loader->l_runpath_dirs, &realname, &fb, loader,
LA_SER_RUNPATH, &found_other_class);
if (fd == -1
- && (__builtin_expect (! preloaded, 1)
+ && (__builtin_expect (! (mode & __RTLD_SECURE), 1)
|| ! INTUSE(__libc_enable_secure)))
{
/* Check the list of libraries in the file /etc/ld.so.cache,
@@ -2159,7 +2155,7 @@
&& ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL
|| __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
&& rtld_search_dirs.dirs != (void *) -1)
- fd = open_path (name, namelen, preloaded, &rtld_search_dirs,
+ fd = open_path (name, namelen, mode & __RTLD_SECURE, &rtld_search_dirs,
&realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
/* Add another newline when we are tracing the library loading. */
@@ -2204,7 +2200,7 @@
have. */
static const Elf_Symndx dummy_bucket = STN_UNDEF;
- /* Enter the new object in the list of loaded objects. */
+ /* Allocate a new object map. */
if ((name_copy = local_strdup (name)) == NULL
|| (l = _dl_new_object (name_copy, name, type, loader,
mode, nsid)) == NULL)
@@ -2222,6 +2218,9 @@
l->l_nbuckets = 1;
l->l_relocated = 1;
+ /* Enter the object in the object list. */
+ _dl_add_to_namespace_list (l, nsid);
+
return l;
}
else if (found_other_class)
diff -Nru eglibc-2.11.2/elf/dl-object.c eglibc-2.11.3/elf/dl-object.c
--- eglibc-2.11.2/elf/dl-object.c 2010-01-26 11:29:51.000000000 +0000
+++ eglibc-2.11.3/elf/dl-object.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Storage management for the chain of loaded shared objects.
- Copyright (C) 1995-2002,2004,2006-2008,2009 Free Software Foundation, Inc.
+ Copyright (C) 1995-2002,2004,2006-2009,2010 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
@@ -26,16 +26,36 @@
#include <assert.h>
+/* Add the new link_map NEW to the end of the namespace list. */
+void
+internal_function
+_dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
+{
+ if (GL(dl_ns)[nsid]._ns_loaded != NULL)
+ {
+ struct link_map *l = GL(dl_ns)[nsid]._ns_loaded;
+ while (l->l_next != NULL)
+ l = l->l_next;
+ new->l_prev = l;
+ /* new->l_next = NULL; Would be necessary but we use calloc. */
+ l->l_next = new;
+ }
+ else
+ GL(dl_ns)[nsid]._ns_loaded = new;
+ ++GL(dl_ns)[nsid]._ns_nloaded;
+ new->l_serial = GL(dl_load_adds);
+ ++GL(dl_load_adds);
+}
+
+
/* Allocate a `struct link_map' for a new object being loaded,
and enter it into the _dl_loaded list. */
-
struct link_map *
internal_function
_dl_new_object (char *realname, const char *libname, int type,
struct link_map *loader, int mode, Lmid_t nsid)
{
struct link_map *l;
- int idx;
size_t libname_len = strlen (libname) + 1;
struct link_map *new;
struct libname_list *newname;
@@ -94,25 +114,11 @@
new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]);
/* Counter for the scopes we have to handle. */
- idx = 0;
+ int idx = 0;
if (GL(dl_ns)[nsid]._ns_loaded != NULL)
- {
- l = GL(dl_ns)[nsid]._ns_loaded;
- while (l->l_next != NULL)
- l = l->l_next;
- new->l_prev = l;
- /* new->l_next = NULL; Would be necessary but we use calloc. */
- l->l_next = new;
-
- /* Add the global scope. */
- new->l_scope[idx++] = &GL(dl_ns)[nsid]._ns_loaded->l_searchlist;
- }
- else
- GL(dl_ns)[nsid]._ns_loaded = new;
- ++GL(dl_ns)[nsid]._ns_nloaded;
- new->l_serial = GL(dl_load_adds);
- ++GL(dl_load_adds);
+ /* Add the global scope. */
+ new->l_scope[idx++] = &GL(dl_ns)[nsid]._ns_loaded->l_searchlist;
/* If we have no loader the new object acts as it. */
if (loader == NULL)
diff -Nru eglibc-2.11.2/elf/dl-open.c eglibc-2.11.3/elf/dl-open.c
--- eglibc-2.11.2/elf/dl-open.c 2009-07-29 15:58:14.000000000 +0000
+++ eglibc-2.11.3/elf/dl-open.c 2010-12-06 20:55:10.000000000 +0000
@@ -220,38 +220,9 @@
assert (_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT);
- /* Maybe we have to expand a DST. */
- if (__builtin_expect (dst != NULL, 0))
- {
- size_t len = strlen (file);
-
- /* Determine how much space we need. We have to allocate the
- memory locally. */
- size_t required = DL_DST_REQUIRED (call_map, file, len,
- _dl_dst_count (dst, 0));
-
- /* Get space for the new file name. */
- char *new_file = (char *) alloca (required + 1);
-
- /* Generate the new file name. */
- _dl_dst_substitute (call_map, file, new_file, 0);
-
- /* If the substitution failed don't try to load. */
- if (*new_file == '\0')
- _dl_signal_error (0, "dlopen", NULL,
- N_("empty dynamic string token substitution"));
-
- /* Now we have a new file name. */
- file = new_file;
-
- /* It does not matter whether call_map is set even if we
- computed it only because of the DST. Since the path contains
- a slash the value is not used. See dl-load.c. */
- }
-
/* Load the named object. */
struct link_map *new;
- args->map = new = _dl_map_object (call_map, file, 0, lt_loaded, 0,
+ args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
mode | __RTLD_CALLMAP, args->nsid);
/* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
diff -Nru eglibc-2.11.2/elf/dl-reloc.c eglibc-2.11.3/elf/dl-reloc.c
--- eglibc-2.11.2/elf/dl-reloc.c 2009-09-30 15:40:23.000000000 +0000
+++ eglibc-2.11.3/elf/dl-reloc.c 2010-11-07 12:16:06.000000000 +0000
@@ -1,5 +1,5 @@
/* Relocate a shared object and resolve its references to other loaded objects.
- Copyright (C) 1995-2006, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1995-2006, 2008, 2009, 2010 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
@@ -319,6 +319,10 @@
goto call_error;
}
+#ifdef CLEAR_CACHE
+ CLEAR_CACHE (textrels->start, textrels->start + textrels->len);
+#endif
+
textrels = textrels->next;
}
diff -Nru eglibc-2.11.2/elf/dl-sysdep.c eglibc-2.11.3/elf/dl-sysdep.c
--- eglibc-2.11.2/elf/dl-sysdep.c 2009-06-24 16:26:34.000000000 +0000
+++ eglibc-2.11.3/elf/dl-sysdep.c 2010-12-06 20:55:10.000000000 +0000
@@ -424,6 +424,11 @@
{
const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
+ /* Note that we add the dsocaps to the set already chosen by the
+ LD_HWCAP_MASK environment variable (or default HWCAP_IMPORTANT).
+ So there is no way to request ignoring an OS-supplied dsocap
+ string and bit like you can ignore an OS-supplied HWCAP bit. */
+ GLRO(dl_hwcap_mask) |= (uint64_t) mask << _DL_FIRST_EXTRA;
size_t len;
for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
{
diff -Nru eglibc-2.11.2/elf/ldconfig.c eglibc-2.11.3/elf/ldconfig.c
--- eglibc-2.11.2/elf/ldconfig.c 2010-05-13 22:57:47.000000000 +0000
+++ eglibc-2.11.3/elf/ldconfig.c 2010-12-06 20:55:10.000000000 +0000
@@ -1362,14 +1362,9 @@
const char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE;
if (opt_chroot)
- {
- aux_cache_file = chroot_canon (opt_chroot, aux_cache_file);
- if (aux_cache_file == NULL)
- error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"),
- _PATH_LDCONFIG_AUX_CACHE);
- }
+ aux_cache_file = chroot_canon (opt_chroot, aux_cache_file);
- if (! opt_ignore_aux_cache)
+ if (! opt_ignore_aux_cache && aux_cache_file)
load_aux_cache (aux_cache_file);
else
init_aux_cache ();
@@ -1379,7 +1374,8 @@
if (opt_build_cache)
{
save_cache (cache_file);
- save_aux_cache (aux_cache_file);
+ if (aux_cache_file)
+ save_aux_cache (aux_cache_file);
}
return 0;
diff -Nru eglibc-2.11.2/elf/rtld-Rules eglibc-2.11.3/elf/rtld-Rules
--- eglibc-2.11.2/elf/rtld-Rules 2008-02-20 12:48:46.000000000 +0000
+++ eglibc-2.11.3/elf/rtld-Rules 2010-12-06 20:55:10.000000000 +0000
@@ -1,6 +1,6 @@
# Subroutine makefile for compiling libc modules linked into dynamic linker.
-# Copyright (C) 2002, 2003, 2005, 2006, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2002,2003,2005,2006,2008,2010 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
@@ -56,7 +56,7 @@
# Use the verbose option of ar and tar when not running silently.
ifeq "$(findstring s,$(MAKEFLAGS))" "" # if not -s
verbose := v
-else # -s
+else # -s
verbose :=
endif # not -s
@@ -93,6 +93,12 @@
# These are the basic compilation rules corresponding to the Makerules ones.
# The sysd-rules generated makefile already defines pattern rules for rtld-%
# targets built from sysdeps source files.
+$(objpfx)rtld-%.os: rtld-%.S $(before-compile)
+ $(compile-command.S) $(rtld-CPPFLAGS)
+$(objpfx)rtld-%.os: rtld-%.s $(before-compile)
+ $(compile-command.s) $(rtld-CPPFLAGS)
+$(objpfx)rtld-%.os: rtld-%.c $(before-compile)
+ $(compile-command.c) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: %.S $(before-compile)
$(compile-command.S) $(rtld-CPPFLAGS)
$(objpfx)rtld-%.os: %.s $(before-compile)
@@ -101,6 +107,9 @@
$(compile-command.c) $(rtld-CPPFLAGS)
# The rules for generated source files.
+$(objpfx)rtld-%.os: $(objpfx)rtld-%.S $(before-compile); $(compile-command.S)
+$(objpfx)rtld-%.os: $(objpfx)rtld-%.s $(before-compile); $(compile-command.s)
+$(objpfx)rtld-%.os: $(objpfx)rtld-%.c $(before-compile); $(compile-command.c)
$(objpfx)rtld-%.os: $(objpfx)%.S $(before-compile); $(compile-command.S)
$(objpfx)rtld-%.os: $(objpfx)%.s $(before-compile); $(compile-command.s)
$(objpfx)rtld-%.os: $(objpfx)%.c $(before-compile); $(compile-command.c)
diff -Nru eglibc-2.11.2/elf/rtld.c eglibc-2.11.3/elf/rtld.c
--- eglibc-2.11.2/elf/rtld.c 2009-07-29 15:58:14.000000000 +0000
+++ eglibc-2.11.3/elf/rtld.c 2010-12-06 20:55:10.000000000 +0000
@@ -588,7 +588,6 @@
/* Argument to map_doit. */
char *str;
struct link_map *loader;
- int is_preloaded;
int mode;
/* Return value of map_doit. */
struct link_map *map;
@@ -626,16 +625,17 @@
map_doit (void *a)
{
struct map_args *args = (struct map_args *) a;
- args->map = _dl_map_object (args->loader, args->str,
- args->is_preloaded, lt_library, 0, args->mode,
- LM_ID_BASE);
+ args->map = _dl_map_object (args->loader, args->str, lt_library, 0,
+ args->mode, LM_ID_BASE);
}
static void
dlmopen_doit (void *a)
{
struct dlmopen_args *args = (struct dlmopen_args *) a;
- args->map = _dl_open (args->fname, RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT,
+ args->map = _dl_open (args->fname,
+ (RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT
+ | __RTLD_SECURE),
dl_main, LM_ID_NEWLM, _dl_argc, INTUSE(_dl_argv),
__environ);
}
@@ -805,8 +805,7 @@
args.str = fname;
args.loader = main_map;
- args.is_preloaded = 1;
- args.mode = 0;
+ args.mode = __RTLD_SECURE;
unsigned int old_nloaded = GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
@@ -1052,7 +1051,6 @@
args.str = rtld_progname;
args.loader = NULL;
- args.is_preloaded = 0;
args.mode = __RTLD_OPENEXEC;
(void) _dl_catch_error (&objname, &err_str, &malloced, map_doit,
&args);
@@ -1064,7 +1062,7 @@
else
{
HP_TIMING_NOW (start);
- _dl_map_object (NULL, rtld_progname, 0, lt_library, 0,
+ _dl_map_object (NULL, rtld_progname, lt_library, 0,
__RTLD_OPENEXEC, LM_ID_BASE);
HP_TIMING_NOW (stop);
@@ -1090,11 +1088,15 @@
main_map = _dl_new_object ((char *) "", "", lt_executable, NULL,
__RTLD_OPENEXEC, LM_ID_BASE);
assert (main_map != NULL);
- assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded);
main_map->l_phdr = phdr;
main_map->l_phnum = phnum;
main_map->l_entry = *user_entry;
+ /* Even though the link map is not yet fully initialized we can add
+ it to the map list since there are no possible users running yet. */
+ _dl_add_to_namespace_list (main_map, LM_ID_BASE);
+ assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded);
+
/* At this point we are in a bit of trouble. We would have to
fill in the values for l_dev and l_ino. But in general we
do not know where the file is. We also do not handle AT_EXECFD
@@ -1237,7 +1239,7 @@
/* We were invoked directly, so the program might not have a
PT_INTERP. */
_dl_rtld_libname.name = GL(dl_rtld_map).l_name;
- /* _dl_rtld_libname.next = NULL; Already zero. */
+ /* _dl_rtld_libname.next = NULL; Already zero. */
GL(dl_rtld_map).l_libname = &_dl_rtld_libname;
}
else
@@ -1362,6 +1364,9 @@
l->l_libname->name = memcpy (copy, dsoname, len);
}
+ /* Add the vDSO to the object list. */
+ _dl_add_to_namespace_list (l, LM_ID_BASE);
+
/* Rearrange the list so this DSO appears after rtld_map. */
assert (l->l_next == NULL);
assert (l->l_prev == main_map);
diff -Nru eglibc-2.11.2/hurd/hurd/fd.h eglibc-2.11.3/hurd/hurd/fd.h
--- eglibc-2.11.2/hurd/hurd/fd.h 2008-07-07 18:11:39.000000000 +0000
+++ eglibc-2.11.3/hurd/hurd/fd.h 2010-12-06 20:55:10.000000000 +0000
@@ -254,8 +254,9 @@
const sigset_t *sigmask);
/* Variant of file_name_lookup used in *at function implementations.
- AT_FLAGS should contain only AT_SYMLINK_NOFOLLOW; other bits
- cause EINVAL. */
+ AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW,
+ which will remove and add O_NOLINK from FLAGS respectively.
+ Other bits cause EINVAL. */
extern file_t __file_name_lookup_at (int fd, int at_flags,
const char *file_name,
int flags, mode_t mode);
diff -Nru eglibc-2.11.2/hurd/hurdselect.c eglibc-2.11.3/hurd/hurdselect.c
--- eglibc-2.11.2/hurd/hurdselect.c 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/hurd/hurdselect.c 2010-12-06 20:55:10.000000000 +0000
@@ -52,7 +52,7 @@
int firstfd, lastfd;
mach_msg_timeout_t to = (timeout != NULL ?
(timeout->tv_sec * 1000 +
- timeout->tv_nsec / 1000000) :
+ (timeout->tv_nsec + 999999) / 1000000) :
0);
struct
{
diff -Nru eglibc-2.11.2/hurd/lookup-at.c eglibc-2.11.3/hurd/lookup-at.c
--- eglibc-2.11.2/hurd/lookup-at.c 2010-05-13 22:57:47.000000000 +0000
+++ eglibc-2.11.3/hurd/lookup-at.c 2010-12-06 20:55:10.000000000 +0000
@@ -30,8 +30,14 @@
error_t err;
file_t result;
+ if ((at_flags & AT_SYMLINK_FOLLOW) && (at_flags & AT_SYMLINK_NOFOLLOW))
+ return (__hurd_fail (EINVAL), MACH_PORT_NULL);
+
flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0;
at_flags &= ~AT_SYMLINK_NOFOLLOW;
+ if (at_flags & AT_SYMLINK_FOLLOW)
+ flags &= ~O_NOLINK;
+ at_flags &= ~AT_SYMLINK_FOLLOW;
if (at_flags != 0)
return (__hurd_fail (EINVAL), MACH_PORT_NULL);
diff -Nru eglibc-2.11.2/include/dlfcn.h eglibc-2.11.3/include/dlfcn.h
--- eglibc-2.11.2/include/dlfcn.h 2007-03-18 18:01:40.000000000 +0000
+++ eglibc-2.11.3/include/dlfcn.h 2010-11-07 12:16:06.000000000 +0000
@@ -9,6 +9,7 @@
#define __RTLD_OPENEXEC 0x20000000
#define __RTLD_CALLMAP 0x10000000
#define __RTLD_AUDIT 0x08000000
+#define __RTLD_SECURE 0x04000000 /* Apply additional security checks. */
#define __LM_ID_CALLER -2
diff -Nru eglibc-2.11.2/libio/stdio.h eglibc-2.11.3/libio/stdio.h
--- eglibc-2.11.2/libio/stdio.h 2009-03-15 15:53:55.000000000 +0000
+++ eglibc-2.11.3/libio/stdio.h 2010-11-07 12:16:06.000000000 +0000
@@ -427,9 +427,9 @@
__isoc99_fscanf) __wur;
extern int __REDIRECT (scanf, (__const char *__restrict __format, ...),
__isoc99_scanf) __wur;
-extern int __REDIRECT (sscanf, (__const char *__restrict __s,
- __const char *__restrict __format, ...),
- __isoc99_sscanf) __THROW;
+extern int __REDIRECT_NTH (sscanf, (__const char *__restrict __s,
+ __const char *__restrict __format, ...),
+ __isoc99_sscanf);
# else
extern int __isoc99_fscanf (FILE *__restrict __stream,
__const char *__restrict __format, ...) __wur;
@@ -481,11 +481,11 @@
extern int __REDIRECT (vscanf, (__const char *__restrict __format,
_G_va_list __arg), __isoc99_vscanf)
__attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
-extern int __REDIRECT (vsscanf,
- (__const char *__restrict __s,
- __const char *__restrict __format, _G_va_list __arg),
- __isoc99_vsscanf)
- __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));
+extern int __REDIRECT_NTH (vsscanf,
+ (__const char *__restrict __s,
+ __const char *__restrict __format,
+ _G_va_list __arg), __isoc99_vsscanf)
+ __attribute__ ((__format__ (__scanf__, 2, 0)));
# else
extern int __isoc99_vfscanf (FILE *__restrict __s,
__const char *__restrict __format,
diff -Nru eglibc-2.11.2/locale/programs/locale.c eglibc-2.11.3/locale/programs/locale.c
--- eglibc-2.11.2/locale/programs/locale.c 2009-02-13 18:31:14.000000000 +0000
+++ eglibc-2.11.3/locale/programs/locale.c 2010-12-06 20:55:10.000000000 +0000
@@ -765,6 +765,29 @@
twalk (all_data, print_names);
}
+/* Print a properly quoted assignment of NAME with VAL, using double
+ quotes iff DQUOTE is true. */
+static void
+print_assignment (const char *name, const char *val, bool dquote)
+{
+ printf ("%s=", name);
+ if (dquote)
+ putchar ('"');
+ while (*val != '\0')
+ {
+ size_t segment
+ = strcspn (val, dquote ? "$`\"\\" : "~|&;<>()$`\\\"' \t\n");
+ printf ("%.*s", (int) segment, val);
+ val += segment;
+ if (*val == '\0')
+ break;
+ putchar ('\\');
+ putchar (*val++);
+ }
+ if (dquote)
+ putchar ('"');
+ putchar ('\n');
+}
/* We have to show the contents of the environments determining the
locale. */
@@ -772,7 +795,7 @@
show_locale_vars (void)
{
size_t cat_no;
- const char *lcall = getenv ("LC_ALL");
+ const char *lcall = getenv ("LC_ALL") ? : "";
const char *lang = getenv ("LANG") ? : "";
auto void get_source (const char *name);
@@ -781,15 +804,15 @@
{
char *val = getenv (name);
- if ((lcall ?: "")[0] != '\0' || val == NULL)
- printf ("%s=\"%s\"\n", name,
- (lcall ?: "")[0] ? lcall : (lang ?: "")[0] ? lang : "POSIX");
+ if (lcall[0] != '\0' || val == NULL)
+ print_assignment (name, lcall[0] ? lcall : lang[0] ? lang : "POSIX",
+ true);
else
- printf ("%s=%s\n", name, val);
+ print_assignment (name, val, false);
}
/* LANG has to be the first value. */
- printf ("LANG=%s\n", lang);
+ print_assignment ("LANG", lang, false);
/* Now all categories in an unspecified order. */
for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no)
@@ -797,7 +820,7 @@
get_source (category[cat_no].name);
/* The last is the LC_ALL value. */
- printf ("LC_ALL=%s\n", lcall ? : "");
+ print_assignment ("LC_ALL", lcall, false);
}
diff -Nru eglibc-2.11.2/malloc/malloc.c eglibc-2.11.3/malloc/malloc.c
--- eglibc-2.11.2/malloc/malloc.c 2010-05-13 22:57:47.000000000 +0000
+++ eglibc-2.11.3/malloc/malloc.c 2010-12-06 20:55:10.000000000 +0000
@@ -4850,7 +4850,7 @@
}
if (__builtin_expect (perturb_byte, 0))
- free_perturb (chunk2mem(p), size - SIZE_SZ);
+ free_perturb (chunk2mem(p), size - 2 * SIZE_SZ);
set_fastchunks(av);
fb = &fastbin (av, fastbin_index(size));
@@ -4938,7 +4938,7 @@
}
if (__builtin_expect (perturb_byte, 0))
- free_perturb (chunk2mem(p), size - SIZE_SZ);
+ free_perturb (chunk2mem(p), size - 2 * SIZE_SZ);
/* consolidate backward */
if (!prev_inuse(p)) {
diff -Nru eglibc-2.11.2/malloc/mcheck.c eglibc-2.11.3/malloc/mcheck.c
--- eglibc-2.11.2/malloc/mcheck.c 2007-05-24 16:37:12.000000000 +0000
+++ eglibc-2.11.3/malloc/mcheck.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,6 @@
/* Standard debugging hooks for `malloc'.
- Copyright (C) 1990-1997,1999,2000-2002,2007 Free Software Foundation, Inc.
+ Copyright (C) 1990-1997,1999,2000-2002,2007,2010
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written May 1989 by Mike Haertel.
@@ -25,6 +26,7 @@
# include <stdint.h>
# include <stdio.h>
# include <libintl.h>
+# include <errno.h>
#endif
/* Old hook values. */
@@ -209,6 +211,12 @@
if (pedantic)
mcheck_check_all ();
+ if (size > ~((size_t) 0) - (sizeof (struct hdr) + 1))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+
__malloc_hook = old_malloc_hook;
if (old_malloc_hook != NULL)
hdr = (struct hdr *) (*old_malloc_hook) (sizeof (struct hdr) + size + 1,
@@ -241,6 +249,12 @@
slop = (sizeof *hdr + alignment - 1) & -alignment;
+ if (size > ~((size_t) 0) - (slop + 1))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+
__memalign_hook = old_memalign_hook;
if (old_memalign_hook != NULL)
block = (*old_memalign_hook) (alignment, slop + size + 1, caller);
@@ -276,6 +290,12 @@
if (pedantic)
mcheck_check_all ();
+ if (size > ~((size_t) 0) - (sizeof (struct hdr) + 1))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+
if (ptr)
{
hdr = ((struct hdr *) ptr) - 1;
diff -Nru eglibc-2.11.2/nis/nss_compat/compat-initgroups.c eglibc-2.11.3/nis/nss_compat/compat-initgroups.c
--- eglibc-2.11.2/nis/nss_compat/compat-initgroups.c 2009-06-24 16:26:34.000000000 +0000
+++ eglibc-2.11.3/nis/nss_compat/compat-initgroups.c 2010-12-06 20:55:10.000000000 +0000
@@ -474,18 +474,21 @@
/* If the selected module does not support getgrent_r or
initgroups_dyn, abort. We cannot find the needed group
entries. */
- if (nss_getgrent_r == NULL && nss_initgroups_dyn == NULL)
+ if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
+ {
+ if (nss_setgrent != NULL)
+ {
+ nss_setgrent (1);
+ ent->need_endgrent = true;
+ }
+ ent->skip_initgroups_dyn = true;
+ }
+
+ if (ent->skip_initgroups_dyn && nss_getgrent_r == NULL)
return NSS_STATUS_UNAVAIL;
ent->files = false;
- if (nss_initgroups_dyn == NULL && nss_setgrent != NULL)
- {
- nss_setgrent (1);
- ent->need_endgrent = true;
- }
- ent->skip_initgroups_dyn = true;
-
return getgrent_next_nss (ent, buffer, buflen, user, group,
start, size, groupsp, limit, errnop);
}
diff -Nru eglibc-2.11.2/nis/nss_nis/nis-initgroups.c eglibc-2.11.3/nis/nss_nis/nis-initgroups.c
--- eglibc-2.11.2/nis/nss_nis/nis-initgroups.c 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/nis/nss_nis/nis-initgroups.c 2010-11-07 12:16:06.000000000 +0000
@@ -139,7 +139,7 @@
if (r != ERANGE)
break;
- extend_alloca (buf, buflen, 2 * buflen);
+ buf = extend_alloca (buf, buflen, 2 * buflen);
}
return 1;
diff -Nru eglibc-2.11.2/nptl/ChangeLog eglibc-2.11.3/nptl/ChangeLog
--- eglibc-2.11.2/nptl/ChangeLog 2009-12-07 21:57:26.000000000 +0000
+++ eglibc-2.11.3/nptl/ChangeLog 2010-12-06 20:55:10.000000000 +0000
@@ -1,3 +1,23 @@
+2010-08-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ * nptl/sysdeps/unix/sysv/linux/i386/Makefile: New file.
+
+2010-07-01 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile (tst-_res1): Add tst-_res1mod1 to dependency list.
+
+2010-10-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #12113]
+ * sysdeps/x86_64/pthreaddef.h (TCB_ALIGNMENT): Changed to 32.
+ * sysdeps/x86_64/tls.h (TLS_TCB_ALIGN): Defined with alignment
+ of "struct pthread".
+
+2010-06-01 Takashi Yoshii <takashi.yoshii.zj@renesas.com>
+
+ * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Fix incorrect
+ location of ifndef __ASSUME_FUTEX_CLOCK_REALTIME.
+
2009-11-27 Andreas Schwab <schwab@redhat.com>
* sysdeps/unix/sysv/linux/x86_64/cancellation.S: Reload
diff -Nru eglibc-2.11.2/nptl/Makefile eglibc-2.11.3/nptl/Makefile
--- eglibc-2.11.2/nptl/Makefile 2009-07-29 15:58:14.000000000 +0000
+++ eglibc-2.11.3/nptl/Makefile 2010-12-06 20:55:10.000000000 +0000
@@ -509,7 +509,8 @@
$(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so
LDFLAGS-tst-_res1mod1.so = -Wl,-soname,tst-_res1mod1.so
LDFLAGS-tst-_res1mod2.so = -Wl,-soname,tst-_res1mod2.so
-$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library)
+$(objpfx)tst-_res1: $(objpfx)tst-_res1mod1.so $(objpfx)tst-_res1mod2.so \
+ $(shared-thread-library)
else
$(objpfx)tst-cond11: $(common-objpfx)rt/librt.a
$(objpfx)tst-cond19: $(common-objpfx)rt/librt.a
diff -Nru eglibc-2.11.2/nptl/sysdeps/unix/sysv/linux/i386/Makefile eglibc-2.11.3/nptl/sysdeps/unix/sysv/linux/i386/Makefile
--- eglibc-2.11.2/nptl/sysdeps/unix/sysv/linux/i386/Makefile 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/nptl/sysdeps/unix/sysv/linux/i386/Makefile 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,3 @@
+ifeq ($(subdir),nptl)
+CFLAGS-pt-initfini.s += -fno-asynchronous-unwind-tables
+endif
diff -Nru eglibc-2.11.2/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S eglibc-2.11.3/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
--- eglibc-2.11.2/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S 2009-09-03 14:33:58.000000000 +0000
+++ eglibc-2.11.3/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S 2010-11-07 12:16:06.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
+/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -282,6 +282,7 @@
rts
mov.l @r15+, r12
+# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
.align 2
# ifdef PIC
.Lgot:
@@ -293,7 +294,6 @@
.long __have_futex_clock_realtime
# endif
-# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
.Lreltmo:
/* Check for a valid timeout value. */
mov.l @(4,r6), r1
diff -Nru eglibc-2.11.2/nptl/sysdeps/x86_64/pthreaddef.h eglibc-2.11.3/nptl/sysdeps/x86_64/pthreaddef.h
--- eglibc-2.11.2/nptl/sysdeps/x86_64/pthreaddef.h 2008-08-19 17:24:09.000000000 +0000
+++ eglibc-2.11.3/nptl/sysdeps/x86_64/pthreaddef.h 2010-11-07 12:16:06.000000000 +0000
@@ -27,8 +27,9 @@
/* Minimal stack size after allocating thread descriptor and guard size. */
#define MINIMAL_REST_STACK 2048
-/* Alignment requirement for TCB. */
-#define TCB_ALIGNMENT 16
+/* Alignment requirement for TCB. Need to store post-AVX vector registers
+ in the TCB and we want the storage to be aligned at 32-byte. */
+#define TCB_ALIGNMENT 32
/* Location of current stack frame. The frame pointer is not usable. */
diff -Nru eglibc-2.11.2/nptl/sysdeps/x86_64/tls.h eglibc-2.11.3/nptl/sysdeps/x86_64/tls.h
--- eglibc-2.11.2/nptl/sysdeps/x86_64/tls.h 2009-08-26 02:17:41.000000000 +0000
+++ eglibc-2.11.3/nptl/sysdeps/x86_64/tls.h 2010-11-07 12:16:06.000000000 +0000
@@ -117,12 +117,7 @@
# define TLS_TCB_SIZE sizeof (struct pthread)
/* Alignment requirements for the TCB. */
-//# define TLS_TCB_ALIGN __alignof__ (struct pthread)
-// Normally the above would be correct But we have to store post-AVX
-// vector registers in the TCB and we want the storage to be aligned.
-// unfortunately there isn't yet a type for these values and hence no
-// 32-byte alignment requirement. Make this explicit, for now.
-# define TLS_TCB_ALIGN 32
+# define TLS_TCB_ALIGN __alignof__ (struct pthread)
/* The TCB can have any size and the memory following the address the
thread pointer points to is unspecified. Allocate the TCB there. */
diff -Nru eglibc-2.11.2/posix/Makefile eglibc-2.11.3/posix/Makefile
--- eglibc-2.11.2/posix/Makefile 2009-11-19 16:22:59.000000000 +0000
+++ eglibc-2.11.3/posix/Makefile 2010-12-06 20:55:10.000000000 +0000
@@ -94,6 +94,7 @@
bug-regex14 bug-regex15 \
bug-regex21 bug-regex24 \
bug-regex27 bug-regex28 bug-regex29 bug-regex30 \
+ bug-regex31 \
tst-nice tst-nanosleep \
transbug \
tst-vfork1 tst-vfork2 tst-vfork3 tst-waitid \
@@ -134,10 +135,12 @@
annexc annexc.out wordexp-tst.out bug-regex2-mem \
bug-regex2.mtrace bug-regex14-mem bug-regex14.mtrace \
bug-regex21-mem bug-regex21.mtrace \
+ bug-regex31-mem bug-regex31.mtrace \
tst-rxspencer-mem tst-rxspencer.mtrace tst-getconf.out \
tst-pcre-mem tst-pcre.mtrace tst-boost-mem tst-boost.mtrace \
bug-ga2.mtrace bug-ga2-mem bug-glob2.mtrace bug-glob2-mem \
- tst-vfork3-mem tst-vfork3.mtrace getconf.speclist
+ tst-vfork3-mem tst-vfork3.mtrace getconf.speclist \
+ tst-fnmatch-mem tst-fnmatch.mtrace
include ../Rules
@@ -254,11 +257,11 @@
# Run a test on the header files we use.
# XXX Please note that for now we ignore the result of this test.
tests: $(objpfx)annexc.out
-# eglibc: ifeq (no,$(cross-compiling))
tests: $(objpfx)bug-regex2-mem \
$(objpfx)bug-regex21-mem \
+ $(objpfx)bug-regex31-mem \
$(objpfx)tst-getconf.out \
- $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem
+ $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem $(objpfx)tst-fnmatch-mem
ifeq (y,($OPTION_POSIX_REGEXP_GLIBC))
tests: $(objpfx)bug-regex14-mem $(objpfx)tst-rxspencer-mem \
$(objpfx)tst-pcre-mem $(objpfx)tst-boost-mem
@@ -274,6 +277,11 @@
$(objpfx)annexc: annexc.c
$(native-compile)
+tst-fnmatch-ENV += MALLOC_TRACE=$(objpfx)tst-fnmatch.mtrace
+
+$(objpfx)tst-fnmatch-mem: $(objpfx)tst-fnmatch.out
+ $(common-objpfx)malloc/mtrace $(objpfx)tst-fnmatch.mtrace > $@
+
bug-regex2-ENV = MALLOC_TRACE=$(objpfx)bug-regex2.mtrace
$(objpfx)bug-regex2-mem: $(objpfx)bug-regex2.out
@@ -289,6 +297,11 @@
$(objpfx)bug-regex21-mem: $(objpfx)bug-regex21.out
$(common-objpfx)malloc/mtrace $(objpfx)bug-regex21.mtrace > $@
+bug-regex31-ENV = MALLOC_TRACE=$(objpfx)bug-regex31.mtrace
+
+$(objpfx)bug-regex31-mem: $(objpfx)bug-regex31.out
+ $(common-objpfx)malloc/mtrace $(objpfx)bug-regex31.mtrace > $@
+
tst-vfork3-ENV = MALLOC_TRACE=$(objpfx)tst-vfork3.mtrace
$(objpfx)tst-vfork3-mem: $(objpfx)tst-vfork3.out
diff -Nru eglibc-2.11.2/posix/bug-regex31.c eglibc-2.11.3/posix/bug-regex31.c
--- eglibc-2.11.2/posix/bug-regex31.c 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/posix/bug-regex31.c 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,36 @@
+#include <mcheck.h>
+#include <regex.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+ mtrace ();
+
+ int res = 0;
+ char *buf = NULL;
+ size_t len = 0;
+ while (! feof (stdin))
+ {
+ ssize_t n = getline (&buf, &len, stdin);
+ if (n <= 0)
+ break;
+ if (buf[n - 1] == '\n')
+ buf[n - 1] = '\0';
+
+ regex_t regex;
+ int rc = regcomp (®ex, buf, REG_EXTENDED);
+ if (rc != 0)
+ printf ("%s: Error %d (expected)\n", buf, rc);
+ else
+ {
+ printf ("%s: succeeded !\n", buf);
+ res = 1;
+ }
+ }
+
+ free (buf);
+
+ return 0;
+}
diff -Nru eglibc-2.11.2/posix/bug-regex31.input eglibc-2.11.3/posix/bug-regex31.input
--- eglibc-2.11.2/posix/bug-regex31.input 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/posix/bug-regex31.input 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,4 @@
+[[][
+([0]
+([0]a
+([0]([0])
diff -Nru eglibc-2.11.2/posix/fnmatch.c eglibc-2.11.3/posix/fnmatch.c
--- eglibc-2.11.2/posix/fnmatch.c 2007-12-11 23:38:31.000000000 +0000
+++ eglibc-2.11.3/posix/fnmatch.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007
+/* Copyright (C) 1991,1992,1993,1996,1997,1998,1999,2000,2001,2002,2003,2007,2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -45,6 +45,12 @@
# include <stdlib.h>
#endif
+#ifdef _LIBC
+# include <alloca.h>
+#else
+# define alloca_account(size., var) alloca (size)
+#endif
+
/* For platform which support the ISO C amendement 1 functionality we
support user defined character classes. */
#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
@@ -334,8 +340,11 @@
mbstate_t ps;
size_t n;
const char *p;
+ wchar_t *wpattern_malloc = NULL;
wchar_t *wpattern;
+ wchar_t *wstring_malloc = NULL;
wchar_t *wstring;
+ size_t alloca_used = 0;
/* Convert the strings into wide characters. */
memset (&ps, '\0', sizeof (ps));
@@ -347,7 +356,8 @@
#endif
if (__builtin_expect (n < 1024, 1))
{
- wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
+ wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
+ alloca_used);
n = mbsrtowcs (wpattern, &p, n + 1, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
/* Something wrong.
@@ -369,8 +379,11 @@
XXX Do we have to set `errno' to something which mbsrtows hasn't
already done? */
return -1;
- wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
+ wpattern_malloc = wpattern
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
assert (mbsinit (&ps));
+ if (wpattern == NULL)
+ return -2;
(void) mbsrtowcs (wpattern, &pattern, n + 1, &ps);
}
@@ -383,13 +396,18 @@
p = string;
if (__builtin_expect (n < 1024, 1))
{
- wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
+ wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
+ alloca_used);
n = mbsrtowcs (wstring, &p, n + 1, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
- /* Something wrong.
- XXX Do we have to set `errno' to something which mbsrtows hasn't
- already done? */
- return -1;
+ {
+ /* Something wrong.
+ XXX Do we have to set `errno' to something which
+ mbsrtows hasn't already done? */
+ free_return:
+ free (wpattern_malloc);
+ return -1;
+ }
if (p)
{
memset (&ps, '\0', sizeof (ps));
@@ -404,19 +422,32 @@
/* Something wrong.
XXX Do we have to set `errno' to something which mbsrtows hasn't
already done? */
- return -1;
- wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
+ goto free_return;
+
+ wstring_malloc = wstring
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
+ if (wstring == NULL)
+ {
+ free (wpattern_malloc);
+ return -2;
+ }
assert (mbsinit (&ps));
(void) mbsrtowcs (wstring, &string, n + 1, &ps);
}
- return internal_fnwmatch (wpattern, wstring, wstring + n,
- flags & FNM_PERIOD, flags, NULL);
+ int res = internal_fnwmatch (wpattern, wstring, wstring + n,
+ flags & FNM_PERIOD, flags, NULL,
+ alloca_used);
+
+ free (wstring_malloc);
+ free (wpattern_malloc);
+
+ return res;
}
# endif /* mbstate_t and mbsrtowcs or _LIBC. */
return internal_fnmatch (pattern, string, string + strlen (string),
- flags & FNM_PERIOD, flags, NULL);
+ flags & FNM_PERIOD, flags, NULL, 0);
}
# ifdef _LIBC
diff -Nru eglibc-2.11.2/posix/fnmatch_loop.c eglibc-2.11.3/posix/fnmatch_loop.c
--- eglibc-2.11.2/posix/fnmatch_loop.c 2009-11-09 13:46:29.000000000 +0000
+++ eglibc-2.11.3/posix/fnmatch_loop.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007
+/* Copyright (C) 1991-1993,1996-2001,2003-2005,2007,2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -30,22 +30,24 @@
it matches, nonzero if not. */
static int FCT (const CHAR *pattern, const CHAR *string,
const CHAR *string_end, int no_leading_period, int flags,
- struct STRUCT *ends)
+ struct STRUCT *ends, size_t alloca_used)
internal_function;
static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
- const CHAR *string_end, int no_leading_period, int flags)
+ const CHAR *string_end, int no_leading_period, int flags,
+ size_t alloca_used)
internal_function;
static const CHAR *END (const CHAR *patternp) internal_function;
static int
internal_function
-FCT (pattern, string, string_end, no_leading_period, flags, ends)
+FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
const CHAR *pattern;
const CHAR *string;
const CHAR *string_end;
int no_leading_period;
int flags;
struct STRUCT *ends;
+ size_t alloca_used;
{
register const CHAR *p = pattern, *n = string;
register UCHAR c;
@@ -74,10 +76,8 @@
case L('?'):
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
{
- int res;
-
- res = EXT (c, p, n, string_end, no_leading_period,
- flags);
+ int res = EXT (c, p, n, string_end, no_leading_period,
+ flags, alloca_used);
if (res != -1)
return res;
}
@@ -106,10 +106,8 @@
case L('*'):
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
{
- int res;
-
- res = EXT (c, p, n, string_end, no_leading_period,
- flags);
+ int res = EXT (c, p, n, string_end, no_leading_period,
+ flags, alloca_used);
if (res != -1)
return res;
}
@@ -198,7 +196,7 @@
for (--p; n < endp; ++n, no_leading_period = 0)
if (FCT (p, n, string_end, no_leading_period, flags2,
- &end) == 0)
+ &end, alloca_used) == 0)
goto found;
}
else if (c == L('/') && (flags & FNM_FILE_NAME))
@@ -207,7 +205,7 @@
++n;
if (n < string_end && *n == L('/')
&& (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags,
- NULL) == 0))
+ NULL, alloca_used) == 0))
return 0;
}
else
@@ -221,7 +219,7 @@
for (--p; n < endp; ++n, no_leading_period = 0)
if (FOLD ((UCHAR) *n) == c
&& (FCT (p, n, string_end, no_leading_period, flags2,
- &end) == 0))
+ &end, alloca_used) == 0))
{
found:
if (end.pattern == NULL)
@@ -758,7 +756,7 @@
_NL_COLLATE_SYMB_EXTRAMB);
/* Locate the character in the hashing
- table. */
+ table. */
hash = elem_hash (str, c1);
idx = 0;
@@ -980,9 +978,8 @@
case L('!'):
if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
{
- int res;
-
- res = EXT (c, p, n, string_end, no_leading_period, flags);
+ int res = EXT (c, p, n, string_end, no_leading_period, flags,
+ alloca_used);
if (res != -1)
return res;
}
@@ -1061,26 +1058,32 @@
static int
internal_function
EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
- int no_leading_period, int flags)
+ int no_leading_period, int flags, size_t alloca_used)
{
const CHAR *startp;
int level;
struct patternlist
{
struct patternlist *next;
+ CHAR malloced;
CHAR str[0];
} *list = NULL;
struct patternlist **lastp = &list;
size_t pattern_len = STRLEN (pattern);
+ int any_malloced = 0;
const CHAR *p;
const CHAR *rs;
+ int retval = 0;
/* Parse the pattern. Store the individual parts in the list. */
level = 0;
for (startp = p = pattern + 1; level >= 0; ++p)
if (*p == L('\0'))
- /* This is an invalid pattern. */
- return -1;
+ {
+ /* This is an invalid pattern. */
+ retval = -1;
+ goto out;
+ }
else if (*p == L('['))
{
/* Handle brackets special. */
@@ -1097,8 +1100,11 @@
/* Skip over all characters of the list. */
while (*p != L(']'))
if (*p++ == L('\0'))
- /* This is no valid pattern. */
- return -1;
+ {
+ /* This is no valid pattern. */
+ retval = -1;
+ goto out;
+ }
}
else if ((*p == L('?') || *p == L('*') || *p == L('+') || *p == L('@')
|| *p == L('!')) && p[1] == L('('))
@@ -1111,15 +1117,25 @@
/* This means we found the end of the pattern. */
#define NEW_PATTERN \
struct patternlist *newp; \
- \
- if (opt == L('?') || opt == L('@')) \
- newp = alloca (sizeof (struct patternlist) \
- + (pattern_len * sizeof (CHAR))); \
+ size_t slen = (opt == L('?') || opt == L('@') \
+ ? pattern_len : (p - startp + 1)); \
+ slen = sizeof (struct patternlist) + (slen * sizeof (CHAR)); \
+ int malloced = ! __libc_use_alloca (alloca_used + slen); \
+ if (__builtin_expect (malloced, 0)) \
+ { \
+ newp = malloc (slen); \
+ if (newp == NULL) \
+ { \
+ retval = -2; \
+ goto out; \
+ } \
+ any_malloced = 1; \
+ } \
else \
- newp = alloca (sizeof (struct patternlist) \
- + ((p - startp + 1) * sizeof (CHAR))); \
- *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \
+ newp = alloca_account (slen, alloca_used); \
newp->next = NULL; \
+ newp->malloced = malloced; \
+ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \
*lastp = newp; \
lastp = &newp->next
NEW_PATTERN;
@@ -1140,8 +1156,9 @@
switch (opt)
{
case L('*'):
- if (FCT (p, string, string_end, no_leading_period, flags, NULL) == 0)
- return 0;
+ if (FCT (p, string, string_end, no_leading_period, flags, NULL,
+ alloca_used) == 0)
+ goto success;
/* FALLTHROUGH */
case L('+'):
@@ -1152,7 +1169,7 @@
current pattern. */
if (FCT (list->str, string, rs, no_leading_period,
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
- NULL) == 0
+ NULL, alloca_used) == 0
/* This was successful. Now match the rest with the rest
of the pattern. */
&& (FCT (p, rs, string_end,
@@ -1160,7 +1177,7 @@
? no_leading_period
: rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0,
flags & FNM_FILE_NAME
- ? flags : flags & ~FNM_PERIOD, NULL) == 0
+ ? flags : flags & ~FNM_PERIOD, NULL, alloca_used) == 0
/* This didn't work. Try the whole pattern. */
|| (rs != string
&& FCT (pattern - 1, rs, string_end,
@@ -1169,18 +1186,21 @@
: (rs[-1] == '/' && NO_LEADING_PERIOD (flags)
? 1 : 0),
flags & FNM_FILE_NAME
- ? flags : flags & ~FNM_PERIOD, NULL) == 0)))
+ ? flags : flags & ~FNM_PERIOD, NULL,
+ alloca_used) == 0)))
/* It worked. Signal success. */
- return 0;
+ goto success;
}
while ((list = list->next) != NULL);
/* None of the patterns lead to a match. */
- return FNM_NOMATCH;
+ retval = FNM_NOMATCH;
+ break;
case L('?'):
- if (FCT (p, string, string_end, no_leading_period, flags, NULL) == 0)
- return 0;
+ if (FCT (p, string, string_end, no_leading_period, flags, NULL,
+ alloca_used) == 0)
+ goto success;
/* FALLTHROUGH */
case L('@'):
@@ -1192,13 +1212,14 @@
if (FCT (STRCAT (list->str, p), string, string_end,
no_leading_period,
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
- NULL) == 0)
+ NULL, alloca_used) == 0)
/* It worked. Signal success. */
- return 0;
+ goto success;
while ((list = list->next) != NULL);
/* None of the patterns lead to a match. */
- return FNM_NOMATCH;
+ retval = FNM_NOMATCH;
+ break;
case L('!'):
for (rs = string; rs <= string_end; ++rs)
@@ -1208,7 +1229,7 @@
for (runp = list; runp != NULL; runp = runp->next)
if (FCT (runp->str, string, rs, no_leading_period,
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
- NULL) == 0)
+ NULL, alloca_used) == 0)
break;
/* If none of the patterns matched see whether the rest does. */
@@ -1218,21 +1239,34 @@
? no_leading_period
: rs[-1] == '/' && NO_LEADING_PERIOD (flags) ? 1 : 0,
flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
- NULL) == 0))
+ NULL, alloca_used) == 0))
/* This is successful. */
- return 0;
+ goto success;
}
/* None of the patterns together with the rest of the pattern
lead to a match. */
- return FNM_NOMATCH;
+ retval = FNM_NOMATCH;
+ break;
default:
assert (! "Invalid extended matching operator");
+ retval = -1;
break;
}
- return -1;
+ success:
+ out:
+ if (any_malloced)
+ while (list != NULL)
+ {
+ struct patternlist *old = list;
+ list = list->next;
+ if (old->malloced)
+ free (old);
+ }
+
+ return retval;
}
diff -Nru eglibc-2.11.2/posix/getopt.h eglibc-2.11.3/posix/getopt.h
--- eglibc-2.11.2/posix/getopt.h 2009-03-15 15:53:55.000000000 +0000
+++ eglibc-2.11.3/posix/getopt.h 2010-11-07 12:16:06.000000000 +0000
@@ -1,5 +1,5 @@
/* Declarations for getopt.
- Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009
+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -158,9 +158,9 @@
additional functionality can be disable at runtime. This redirection
helps to also do this at runtime. */
# ifdef __REDIRECT
- extern int __REDIRECT (getopt, (int ___argc, char *const *___argv,
- const char *__shortopts),
- __posix_getopt) __THROW;
+ extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
+ const char *__shortopts),
+ __posix_getopt);
# else
extern int __posix_getopt (int ___argc, char *const *___argv,
const char *__shortopts) __THROW;
diff -Nru eglibc-2.11.2/posix/regcomp.c eglibc-2.11.3/posix/regcomp.c
--- eglibc-2.11.2/posix/regcomp.c 2010-01-26 11:29:51.000000000 +0000
+++ eglibc-2.11.3/posix/regcomp.c 2010-12-06 20:55:10.000000000 +0000
@@ -2164,16 +2164,21 @@
exp = parse_expression (regexp, preg, token, syntax, nest, err);
if (BE (*err != REG_NOERROR && exp == NULL, 0))
{
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
return NULL;
}
if (tree != NULL && exp != NULL)
{
- tree = create_tree (dfa, tree, exp, CONCAT);
- if (tree == NULL)
+ bin_tree_t *newtree = create_tree (dfa, tree, exp, CONCAT);
+ if (newtree == NULL)
{
+ postorder (exp, free_tree, NULL);
+ postorder (tree, free_tree, NULL);
*err = REG_ESPACE;
return NULL;
}
+ tree = newtree;
}
else if (tree == NULL)
tree = exp;
@@ -2422,7 +2427,11 @@
{
tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
- *err = REG_EPAREN;
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ *err = REG_EPAREN;
+ }
if (BE (*err != REG_NOERROR, 0))
return NULL;
}
@@ -3049,6 +3058,10 @@
if (BE (sbcset == NULL, 0))
#endif /* RE_ENABLE_I18N */
{
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ re_free (mbcset);
+#endif
*err = REG_ESPACE;
return NULL;
}
diff -Nru eglibc-2.11.2/posix/tst-fnmatch.c eglibc-2.11.3/posix/tst-fnmatch.c
--- eglibc-2.11.2/posix/tst-fnmatch.c 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/posix/tst-fnmatch.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Tests for fnmatch function.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2010 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
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
+#include <mcheck.h>
static char *next_input (char **line, int first, int last);
@@ -46,6 +47,8 @@
size_t escpatternlen = 0;
int nr = 0;
+ mtrace ();
+
/* Read lines from stdin with the following format:
locale input-string match-string flags result
diff -Nru eglibc-2.11.2/resolv/res_init.c eglibc-2.11.3/resolv/res_init.c
--- eglibc-2.11.2/resolv/res_init.c 2009-06-30 20:19:02.000000000 +0000
+++ eglibc-2.11.3/resolv/res_init.c 2010-12-06 20:55:10.000000000 +0000
@@ -176,13 +176,6 @@
statp->id = res_randomid();
}
-#ifdef USELOOPBACK
- statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
-#else
- statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
-#endif
- statp->nsaddr.sin_family = AF_INET;
- statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
statp->nscount = 0;
statp->ndots = 1;
statp->pfcode = 0;
@@ -321,24 +314,24 @@
nserv++;
#ifdef _LIBC
nservall++;
- } else {
- struct in6_addr a6;
- char *el;
+ } else {
+ struct in6_addr a6;
+ char *el;
- if ((el = strchr(cp, '\n')) != NULL)
- *el = '\0';
+ if ((el = strchr(cp, '\n')) != NULL)
+ *el = '\0';
if ((el = strchr(cp, SCOPE_DELIMITER)) != NULL)
*el = '\0';
- if ((*cp != '\0') &&
- (inet_pton(AF_INET6, cp, &a6) > 0)) {
- struct sockaddr_in6 *sa6;
-
- sa6 = malloc(sizeof(*sa6));
- if (sa6 != NULL) {
- sa6->sin6_family = AF_INET6;
- sa6->sin6_port = htons(NAMESERVER_PORT);
+ if ((*cp != '\0') &&
+ (inet_pton(AF_INET6, cp, &a6) > 0)) {
+ struct sockaddr_in6 *sa6;
+
+ sa6 = malloc(sizeof(*sa6));
+ if (sa6 != NULL) {
+ sa6->sin6_family = AF_INET6;
+ sa6->sin6_port = htons(NAMESERVER_PORT);
sa6->sin6_flowinfo = 0;
- sa6->sin6_addr = a6;
+ sa6->sin6_addr = a6;
if (__builtin_expect (el == NULL, 1))
sa6->sin6_scope_id = 0;
@@ -365,9 +358,9 @@
statp->_u._ext.nsaddrs[nservall] = sa6;
statp->_u._ext.nssocks[nservall] = -1;
statp->_u._ext.nsmap[nservall] = MAXNS + 1;
- nservall++;
- }
- }
+ nservall++;
+ }
+ }
#endif
}
continue;
@@ -433,6 +426,12 @@
#endif
(void) fclose(fp);
}
+ if (__builtin_expect(statp->nscount == 0, 0)) {
+ statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
+ statp->nsaddr.sin_family = AF_INET;
+ statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
+ statp->nscount = 1;
+ }
if (statp->defdname[0] == 0 &&
__gethostname(buf, sizeof(statp->defdname) - 1) == 0 &&
(cp = strchr(buf, '.')) != NULL)
@@ -538,12 +537,12 @@
} else if (!strncmp(cp, "no-check-names",
sizeof("no-check-names") - 1)) {
statp->options |= RES_NOCHECKNAME;
- } else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {
+ } else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {
statp->options |= RES_USE_EDNS0;
- } else if (!strncmp(cp, "single-request-reopen",
+ } else if (!strncmp(cp, "single-request-reopen",
sizeof("single-request-reopen") - 1)) {
statp->options |= RES_SNGLKUPREOP;
- } else if (!strncmp(cp, "single-request",
+ } else if (!strncmp(cp, "single-request",
sizeof("single-request") - 1)) {
statp->options |= RES_SNGLKUP;
} else {
diff -Nru eglibc-2.11.2/scripts/data/localplt-s390-linux-gnu.data eglibc-2.11.3/scripts/data/localplt-s390-linux-gnu.data
--- eglibc-2.11.2/scripts/data/localplt-s390-linux-gnu.data 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/scripts/data/localplt-s390-linux-gnu.data 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,7 @@
+libc.so: _Unwind_Find_FDE
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: memalign
+libc.so: realloc
+libm.so: matherr
diff -Nru eglibc-2.11.2/scripts/data/localplt-s390x-linux-gnu.data eglibc-2.11.3/scripts/data/localplt-s390x-linux-gnu.data
--- eglibc-2.11.2/scripts/data/localplt-s390x-linux-gnu.data 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/scripts/data/localplt-s390x-linux-gnu.data 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,7 @@
+libc.so: _Unwind_Find_FDE
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: memalign
+libc.so: realloc
+libm.so: matherr
diff -Nru eglibc-2.11.2/stdlib/strtod_l.c eglibc-2.11.3/stdlib/strtod_l.c
--- eglibc-2.11.2/stdlib/strtod_l.c 2009-04-30 21:37:18.000000000 +0000
+++ eglibc-2.11.3/stdlib/strtod_l.c 2010-12-06 20:55:10.000000000 +0000
@@ -1504,7 +1504,9 @@
register int i;
(void) __mpn_lshift (&retval[used
/ BITS_PER_MP_LIMB],
- retval, RETURN_LIMB_SIZE,
+ retval,
+ (RETURN_LIMB_SIZE
+ - used / BITS_PER_MP_LIMB),
used % BITS_PER_MP_LIMB);
for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i)
retval[i] = 0;
diff -Nru eglibc-2.11.2/string/Makefile eglibc-2.11.3/string/Makefile
--- eglibc-2.11.2/string/Makefile 2009-04-14 19:46:20.000000000 +0000
+++ eglibc-2.11.3/string/Makefile 2010-11-07 12:16:06.000000000 +0000
@@ -58,7 +58,7 @@
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
tst-strtok tst-strfry \
bug-strtok1 $(addprefix test-,$(strop-tests)) \
- tst-strxfrm2 tst-endian tst-svc2
+ tst-strxfrm2 tst-endian tst-svc2 bug-strstr1
tests-$(OPTION_EGLIBC_ENVZ) += bug-envz1
tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+= tst-strxfrm bug-strcoll1
@@ -81,6 +81,7 @@
CFLAGS-stratcliff.c = -fno-builtin
CFLAGS-test-ffs.c = -fno-builtin
CFLAGS-tst-inlcall.c = -fno-builtin
+CFLAGS-bug-strstr1.c = -fno-builtin
# eglibc: ifeq ($(cross-compiling),no)
tests: $(objpfx)tst-svc.out
diff -Nru eglibc-2.11.2/string/bug-strstr1.c eglibc-2.11.3/string/bug-strstr1.c
--- eglibc-2.11.2/string/bug-strstr1.c 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/string/bug-strstr1.c 2010-11-07 12:16:06.000000000 +0000
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <string.h>
+
+int main (int argc, char** argv)
+{
+ const char haystack[] =
+ "F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD";
+
+ const char needle[] =
+ "_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD";
+
+ const char* sub = strstr (haystack, needle);
+
+ if (sub != NULL)
+ {
+ int j;
+
+ fprintf (stderr, "BUG: expected NULL, got:\n%s\n%s\n", sub, needle);
+ for (j = 0; needle[j] != '\0'; ++j)
+ putchar (needle[j] == sub[j] ? ' ' : '^');
+ puts ("");
+ return 1;
+ }
+
+ return 0;
+}
diff -Nru eglibc-2.11.2/string/str-two-way.h eglibc-2.11.3/string/str-two-way.h
--- eglibc-2.11.2/string/str-two-way.h 2008-05-15 12:10:03.000000000 +0000
+++ eglibc-2.11.3/string/str-two-way.h 2010-11-07 12:16:06.000000000 +0000
@@ -350,8 +350,8 @@
a byte out of place, there can be no match until
after the mismatch. */
shift = needle_len - period;
- memory = 0;
}
+ memory = 0;
j += shift;
continue;
}
diff -Nru eglibc-2.11.2/string/stratcliff.c eglibc-2.11.3/string/stratcliff.c
--- eglibc-2.11.2/string/stratcliff.c 2009-05-09 18:19:07.000000000 +0000
+++ eglibc-2.11.3/string/stratcliff.c 2010-11-07 12:16:06.000000000 +0000
@@ -1,5 +1,6 @@
/* Test for string function add boundaries of usable memory.
- Copyright (C) 1996,1997,1999-2003,2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1996,1997,1999-2003,2007,2009,2010
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -47,6 +48,8 @@
# define MEMCPY memcpy
# define MEMPCPY mempcpy
# define MEMCHR memchr
+# define STRCMP strcmp
+# define STRNCMP strncmp
#endif
@@ -70,12 +73,12 @@
if (adr == MAP_FAILED || dest == MAP_FAILED)
{
if (errno == ENOSYS)
- puts ("No test, mmap not available.");
+ puts ("No test, mmap not available.");
else
- {
- printf ("mmap failed: %m");
- result = 1;
- }
+ {
+ printf ("mmap failed: %m");
+ result = 1;
+ }
}
else
{
@@ -93,8 +96,8 @@
/* strlen/wcslen test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
+ {
+ for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
{
adr[inner] = L('\0');
@@ -107,12 +110,12 @@
adr[inner] = L('T');
}
- }
+ }
/* strnlen/wcsnlen test */
for (outer = nchars; outer >= MAX (0, nchars - 128); --outer)
- {
- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
+ {
+ for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
{
adr[inner] = L('\0');
@@ -126,9 +129,9 @@
adr[inner] = L('T');
}
- }
+ }
for (outer = nchars; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
for (inner = MAX (outer, nchars - 64); inner <= nchars; ++inner)
{
if (STRNLEN (&adr[outer], inner - outer)
@@ -139,11 +142,11 @@
result = 1;
}
}
- }
+ }
/* strchr/wcschr test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
{
for (inner = middle; inner < nchars; ++inner)
@@ -167,7 +170,7 @@
adr[middle] = L('T');
}
}
- }
+ }
/* Special test. */
adr[nchars - 1] = L('\0');
@@ -180,7 +183,7 @@
/* strrchr/wcsrchr test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
{
for (inner = middle; inner < nchars; ++inner)
@@ -204,11 +207,11 @@
adr[middle] = L('T');
}
}
- }
+ }
/* memchr test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
{
adr[middle] = L('V');
@@ -224,9 +227,9 @@
adr[middle] = L('T');
}
- }
+ }
for (outer = nchars; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
CHAR *cp = MEMCHR (&adr[outer], L('V'), nchars - outer);
if (cp != NULL)
@@ -235,13 +238,13 @@
STRINGIFY (MEMCHR), outer);
result = 1;
}
- }
+ }
/* This function only exists for single-byte characters. */
#ifndef WCSTEST
/* rawmemchr test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
+ {
for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
{
adr[middle] = L('V');
@@ -257,13 +260,13 @@
adr[middle] = L('T');
}
- }
+ }
#endif
/* strcpy/wcscpy test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
+ {
+ for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
{
adr[inner] = L('\0');
@@ -277,7 +280,74 @@
adr[inner] = L('T');
}
- }
+ }
+
+ /* strcmp/wcscmp tests */
+ for (outer = 1; outer < 32; ++outer)
+ for (middle = 0; middle < 16; ++middle)
+ {
+ MEMSET (adr + middle, L('T'), 256);
+ adr[256] = L('\0');
+ MEMSET (dest + nchars - outer, L('T'), outer - 1);
+ dest[nchars - 1] = L('\0');
+
+ if (STRCMP (adr + middle, dest + nchars - outer) <= 0)
+ {
+ printf ("%s 1 flunked for outer = %d, middle = %d\n",
+ STRINGIFY (STRCMP), outer, middle);
+ result = 1;
+ }
+
+ if (STRCMP (dest + nchars - outer, adr + middle) >= 0)
+ {
+ printf ("%s 2 flunked for outer = %d, middle = %d\n",
+ STRINGIFY (STRCMP), outer, middle);
+ result = 1;
+ }
+ }
+
+ /* strncmp/wcsncmp tests */
+ for (outer = 1; outer < 32; ++outer)
+ for (middle = 0; middle < 16; ++middle)
+ {
+ MEMSET (adr + middle, L('T'), 256);
+ adr[256] = L('\0');
+ MEMSET (dest + nchars - outer, L('T'), outer - 1);
+ dest[nchars - 1] = L('U');
+
+ for (inner = 0; inner < outer; ++inner)
+ {
+ if (STRNCMP (adr + middle, dest + nchars - outer, inner) != 0)
+ {
+ printf ("%s 1 flunked for outer = %d, middle = %d, "
+ "inner = %d\n",
+ STRINGIFY (STRNCMP), outer, middle, inner);
+ result = 1;
+ }
+
+ if (STRNCMP (dest + nchars - outer, adr + middle, inner) != 0)
+ {
+ printf ("%s 2 flunked for outer = %d, middle = %d, "
+ "inner = %d\n",
+ STRINGIFY (STRNCMP), outer, middle, inner);
+ result = 1;
+ }
+ }
+
+ if (STRNCMP (adr + middle, dest + nchars - outer, outer) >= 0)
+ {
+ printf ("%s 1 flunked for outer = %d, middle = %d, full\n",
+ STRINGIFY (STRNCMP), outer, middle);
+ result = 1;
+ }
+
+ if (STRNCMP (dest + nchars - outer, adr + middle, outer) <= 0)
+ {
+ printf ("%s 2 flunked for outer = %d, middle = %d, full\n",
+ STRINGIFY (STRNCMP), outer, middle);
+ result = 1;
+ }
+ }
/* strncpy/wcsncpy tests */
adr[nchars - 1] = L('T');
@@ -295,12 +365,12 @@
result = 1;
}
}
- }
+ }
adr[nchars - 1] = L('\0');
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
+ {
+ for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
{
size_t len;
@@ -334,12 +404,12 @@
adr[inner] = L('T');
}
- }
+ }
/* stpcpy/wcpcpy test */
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
+ {
+ for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner)
{
adr[inner] = L('\0');
@@ -352,7 +422,7 @@
adr[inner] = L('T');
}
- }
+ }
/* stpncpy/wcpncpy test */
adr[nchars - 1] = L('T');
@@ -374,8 +444,8 @@
adr[nchars - 1] = L('\0');
for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer)
- {
- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
+ {
+ for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle)
{
adr[middle] = L('\0');
@@ -393,7 +463,7 @@
adr[middle] = L('T');
}
- }
+ }
/* memcpy/wmemcpy test */
for (outer = nchars; outer >= MAX (0, nchars - 128); --outer)
diff -Nru eglibc-2.11.2/sysdeps/generic/ldsodefs.h eglibc-2.11.3/sysdeps/generic/ldsodefs.h
--- eglibc-2.11.2/sysdeps/generic/ldsodefs.h 2009-07-29 15:58:14.000000000 +0000
+++ eglibc-2.11.3/sysdeps/generic/ldsodefs.h 2010-12-06 20:55:10.000000000 +0000
@@ -820,11 +820,9 @@
/* Open the shared object NAME and map in its segments.
LOADER's DT_RPATH is used in searching for NAME.
- If the object is already opened, returns its existing map.
- For preloaded shared objects PRELOADED is set to a non-zero
- value to allow additional security checks. */
+ If the object is already opened, returns its existing map. */
extern struct link_map *_dl_map_object (struct link_map *loader,
- const char *name, int preloaded,
+ const char *name,
int type, int trace_mode, int mode,
Lmid_t nsid)
internal_function attribute_hidden;
@@ -889,8 +887,11 @@
extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name)
internal_function;
-/* Allocate a `struct link_map' for a new object being loaded,
- and enter it into the _dl_main_map list. */
+/* Add the new link_map NEW to the end of the namespace list. */
+extern void _dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
+ internal_function attribute_hidden;
+
+/* Allocate a `struct link_map' for a new object being loaded. */
extern struct link_map *_dl_new_object (char *realname, const char *libname,
int type, struct link_map *loader,
int mode, Lmid_t nsid)
diff -Nru eglibc-2.11.2/sysdeps/i386/bits/byteswap.h eglibc-2.11.3/sysdeps/i386/bits/byteswap.h
--- eglibc-2.11.2/sysdeps/i386/bits/byteswap.h 2008-05-15 12:10:03.000000000 +0000
+++ eglibc-2.11.3/sysdeps/i386/bits/byteswap.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007, 2008, 2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -27,26 +27,27 @@
/* Swap bytes in 16 bit value. */
#define __bswap_constant_16(x) \
- ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+ ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
#ifdef __GNUC__
# if __GNUC__ >= 2
# define __bswap_16(x) \
(__extension__ \
- ({ register unsigned short int __v, __x = (x); \
+ ({ register unsigned short int __v, __x = (unsigned short int) (x); \
if (__builtin_constant_p (__x)) \
__v = __bswap_constant_16 (__x); \
else \
__asm__ ("rorw $8, %w0" \
: "=r" (__v) \
- : "0" (__x) \
- : "cc"); \
+ : "0" (__x) \
+ : "cc"); \
__v; }))
# else
/* This is better than nothing. */
# define __bswap_16(x) \
(__extension__ \
- ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
+ ({ register unsigned short int __x = (unsigned short int) (x); \
+ __bswap_constant_16 (__x); }))
# endif
#else
static __inline unsigned short int
@@ -122,7 +123,7 @@
(__extension__ \
({ union { __extension__ unsigned long long int __ll; \
unsigned long int __l[2]; } __w, __r; \
- if (__builtin_constant_p (x)) \
+ if (__builtin_constant_p (x)) \
__r.__ll = __bswap_constant_64 (x); \
else \
{ \
diff -Nru eglibc-2.11.2/sysdeps/i386/elf/Makefile eglibc-2.11.3/sysdeps/i386/elf/Makefile
--- eglibc-2.11.2/sysdeps/i386/elf/Makefile 1970-01-01 00:00:00.000000000 +0000
+++ eglibc-2.11.3/sysdeps/i386/elf/Makefile 2010-12-06 20:55:10.000000000 +0000
@@ -0,0 +1,4 @@
+ifeq ($(subdir),csu)
+# Turn off -fasynchronous-unwind-tables
+CFLAGS-initfini.s += -fno-asynchronous-unwind-tables
+endif
diff -Nru eglibc-2.11.2/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c eglibc-2.11.3/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c
--- eglibc-2.11.2/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c 2010-12-06 20:55:10.000000000 +0000
@@ -73,9 +73,9 @@
m = ((a.i[2] >> 20) & 0x7ff) - 54;
}
m += n;
- if (m > 0)
+ if ((int) m > 0)
a.i[2] = (a.i[2] & 0x800fffff) | (m << 20);
- else if (m <= -54) {
+ else if ((int) m <= -54) {
a.i[2] &= 0x80000000;
a.i[3] = 0;
} else {
diff -Nru eglibc-2.11.2/sysdeps/mach/hurd/linkat.c eglibc-2.11.3/sysdeps/mach/hurd/linkat.c
--- eglibc-2.11.2/sysdeps/mach/hurd/linkat.c 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/sysdeps/mach/hurd/linkat.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Make a link between file names relative to open directories. Hurd version.
- Copyright (C) 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006,2010 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
@@ -38,7 +38,9 @@
file_t oldfile, linknode, todir;
char *toname;
- oldfile = __file_name_lookup_at (fromfd, flags, from, 0, 0);
+ /* POSIX says linkat doesn't follow symlinks by default, so pass
+ O_NOLINK. That can be overridden by AT_SYMLINK_FOLLOW in FLAGS. */
+ oldfile = __file_name_lookup_at (fromfd, flags, from, O_NOLINK, 0);
if (oldfile == MACH_PORT_NULL)
return -1;
diff -Nru eglibc-2.11.2/sysdeps/s390/s390-32/__longjmp.c eglibc-2.11.3/sysdeps/s390/s390-32/__longjmp.c
--- eglibc-2.11.2/sysdeps/s390/s390-32/__longjmp.c 2009-06-01 13:59:14.000000000 +0000
+++ eglibc-2.11.3/sysdeps/s390/s390-32/__longjmp.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2001, 2005, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001, 2005, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
@@ -29,16 +29,19 @@
void
__longjmp (__jmp_buf env, int val)
{
- register int r2 __asm ("%r2") = val == 0 ? 1 : val;
#ifdef PTR_DEMANGLE
- register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
- register void *r1 __asm ("%r1") = (void *) env;
+ uintptr_t guard = THREAD_GET_POINTER_GUARD ();
# ifdef CHECK_SP
- CHECK_SP (env, r3);
+ CHECK_SP (env, guard);
# endif
#elif defined CHECK_SP
CHECK_SP (env, 0);
#endif
+ register int r2 __asm ("%r2") = val == 0 ? 1 : val;
+#ifdef PTR_DEMANGLE
+ register uintptr_t r3 __asm ("%r3") = guard;
+ register void *r1 __asm ("%r1") = (void *) env;
+#endif
/* Restore registers and jump back. */
asm volatile ("ld %%f6,48(%1)\n\t"
"ld %%f4,40(%1)\n\t"
diff -Nru eglibc-2.11.2/sysdeps/s390/s390-64/__longjmp.c eglibc-2.11.3/sysdeps/s390/s390-64/__longjmp.c
--- eglibc-2.11.2/sysdeps/s390/s390-64/__longjmp.c 2009-06-01 13:59:14.000000000 +0000
+++ eglibc-2.11.3/sysdeps/s390/s390-64/__longjmp.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2005, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2005, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
@@ -29,16 +29,19 @@
void
__longjmp (__jmp_buf env, int val)
{
- register long int r2 __asm ("%r2") = val == 0 ? 1 : val;
#ifdef PTR_DEMANGLE
- register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
- register void *r1 __asm ("%r1") = (void *) env;
+ uintptr_t guard = THREAD_GET_POINTER_GUARD ();
# ifdef CHECK_SP
- CHECK_SP (env, r3);
+ CHECK_SP (env, guard);
# endif
#elif defined CHECK_SP
CHECK_SP (env, 0);
#endif
+ register long int r2 __asm ("%r2") = val == 0 ? 1 : val;
+#ifdef PTR_DEMANGLE
+ register uintptr_t r3 __asm ("%r3") = guard;
+ register void *r1 __asm ("%r1") = (void *) env;
+#endif
/* Restore registers and jump back. */
asm volatile ("ld %%f7,104(%1)\n\t"
"ld %%f5,96(%1)\n\t"
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/check_pf.c eglibc-2.11.3/sysdeps/unix/sysv/linux/check_pf.c
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/check_pf.c 2008-02-20 12:48:46.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/check_pf.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Determine protocol families for which interfaces exist. Linux version.
- Copyright (C) 2003, 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2006, 2007, 2008, 2010 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
@@ -304,10 +304,13 @@
struct ifaddrs *runp;
for (runp = ifa; runp != NULL; runp = runp->ifa_next)
- if (runp->ifa_addr->sa_family == PF_INET)
- *seen_ipv4 = true;
- else if (runp->ifa_addr->sa_family == PF_INET6)
- *seen_ipv6 = true;
+ if (runp->ifa_addr != NULL)
+ {
+ if (runp->ifa_addr->sa_family == PF_INET)
+ *seen_ipv4 = true;
+ else if (runp->ifa_addr->sa_family == PF_INET6)
+ *seen_ipv6 = true;
+ }
(void) freeifaddrs (ifa);
#endif
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/getdents.c eglibc-2.11.3/sysdeps/unix/sysv/linux/getdents.c
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/getdents.c 2007-02-05 17:59:45.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/getdents.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2003, 2004, 2006, 2007
+/* Copyright (C) 1993, 1995-2004, 2006, 2007, 2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -285,7 +285,11 @@
DIRENT_SET_DP_INO(dp, kdp->d_ino);
dp->d_off = kdp->d_off;
dp->d_reclen = new_reclen;
+#ifdef __ASSUME_GETDENTS32_D_TYPE
+ dp->d_type = *((char *) kdp + kdp->d_reclen - 1);
+#else
dp->d_type = DT_UNKNOWN;
+#endif
memcpy (dp->d_name, kdp->d_name,
kdp->d_reclen - offsetof (struct kernel_dirent, d_name));
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/i386/bits/mman.h eglibc-2.11.3/sysdeps/unix/sysv/linux/i386/bits/mman.h
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/i386/bits/mman.h 2009-11-19 16:22:59.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/i386/bits/mman.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,6 @@
/* Definitions for POSIX memory map interface. Linux/i386 version.
- Copyright (C) 1997,2000,2003,2005,2006,2009 Free Software Foundation, Inc.
+ Copyright (C) 1997,2000,2003,2005,2006,2009,2010
+ 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
@@ -64,6 +65,7 @@
# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
# define MAP_STACK 0x20000 /* Allocation is for a stack. */
+# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
/* Flags to `msync'. */
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/internal_statvfs.c eglibc-2.11.3/sysdeps/unix/sysv/linux/internal_statvfs.c
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/internal_statvfs.c 2007-01-09 13:36:33.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/internal_statvfs.c 2010-12-06 20:55:10.000000000 +0000
@@ -214,7 +214,8 @@
buf->f_files = fsbuf->f_files;
buf->f_ffree = fsbuf->f_ffree;
if (sizeof (buf->f_fsid) == sizeof (fsbuf->f_fsid))
- buf->f_fsid = (fsbuf->f_fsid.__val[0]
+ buf->f_fsid = ((fsbuf->f_fsid.__val[0]
+ & ((1UL << (8 * sizeof (fsbuf->f_fsid.__val[0]))) - 1))
| ((unsigned long int) fsbuf->f_fsid.__val[1]
<< (8 * (sizeof (buf->f_fsid)
- sizeof (fsbuf->f_fsid.__val[0])))));
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/sparc/sys/epoll.h eglibc-2.11.3/sysdeps/unix/sysv/linux/sparc/sys/epoll.h
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/sparc/sys/epoll.h 2008-08-19 17:24:09.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/sparc/sys/epoll.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2006, 2007, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2006, 2007, 2008, 2010 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
@@ -31,7 +31,7 @@
#endif
-/* Flags to be passed to epoll_create2. */
+/* Flags to be passed to epoll_create1. */
enum
{
EPOLL_CLOEXEC = 0x400000,
@@ -101,8 +101,9 @@
returned by epoll_create() should be closed with close(). */
extern int epoll_create (int __size) __THROW;
-/* Same as epoll_create but with an additional FLAGS parameter. */
-extern int epoll_create2 (int __size, int __flags) __THROW;
+/* Same as epoll_create but with an FLAGS parameter. The unused SIZE
+ parameter has been dropped. */
+extern int epoll_create1 (int __flags) __THROW;
/* Manipulate an epoll instance "epfd". Returns 0 in case of success,
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/sys/swap.h eglibc-2.11.3/sysdeps/unix/sysv/linux/sys/swap.h
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/sys/swap.h 2006-08-17 01:18:26.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/sys/swap.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Calls to enable and disable swapping on specified locations. Linux version.
- Copyright (C) 1996, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1998, 1999, 2010 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
@@ -28,6 +28,7 @@
#define SWAP_FLAG_PREFER 0x8000 /* Set if swap priority is specified. */
#define SWAP_FLAG_PRIO_MASK 0x7fff
#define SWAP_FLAG_PRIO_SHIFT 0
+#define SWAP_FLAG_DISCARD 0x10000 /* Discard swap cluster after use. */
__BEGIN_DECLS
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/ttyname.c eglibc-2.11.3/sysdeps/unix/sysv/linux/ttyname.c
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/ttyname.c 2009-10-30 17:58:03.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/ttyname.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,92,93,1996-2002,2006,2009 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1993,1996-2002,2006,2009,2010
+ 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
@@ -131,6 +132,9 @@
if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0))
return NULL;
+ if (__fxstat64 (_STAT_VER, fd, &st) < 0)
+ return NULL;
+
/* We try using the /proc filesystem. */
*_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0';
@@ -161,13 +165,32 @@
{
if ((size_t) len >= buflen)
return NULL;
+
+#define UNREACHABLE_LEN strlen ("(unreachable)")
+ if (len > UNREACHABLE_LEN
+ && memcmp (ttyname_buf, "(unreachable)", UNREACHABLE_LEN) == 0)
+ {
+ memmove (ttyname_buf, ttyname_buf + UNREACHABLE_LEN,
+ len - UNREACHABLE_LEN);
+ len -= UNREACHABLE_LEN;
+ }
+
/* readlink need not terminate the string. */
ttyname_buf[len] = '\0';
- return ttyname_buf;
- }
- if (__fxstat64 (_STAT_VER, fd, &st) < 0)
- return NULL;
+ /* Verify readlink result, fall back on iterating through devices. */
+ if (ttyname_buf[0] == '/'
+ && __xstat64 (_STAT_VER, ttyname_buf, &st1) == 0
+#ifdef _STATBUF_ST_RDEV
+ && S_ISCHR (st1.st_mode)
+ && st1.st_rdev == st.st_rdev
+#else
+ && st1.st_ino == st.st_ino
+ && st1.st_dev == st.st_dev
+#endif
+ )
+ return ttyname_buf;
+ }
if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode))
{
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/ttyname_r.c eglibc-2.11.3/sysdeps/unix/sysv/linux/ttyname_r.c
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/ttyname_r.c 2007-01-09 13:36:33.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/ttyname_r.c 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,92,93,1995-2001,2003,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1993,1995-2001,2003,2006,2010
+ 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
@@ -122,6 +123,9 @@
if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0))
return errno;
+ if (__fxstat64 (_STAT_VER, fd, &st) < 0)
+ return errno;
+
/* We try using the /proc filesystem. */
*_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0';
@@ -145,12 +149,30 @@
#endif
, 1))
{
+#define UNREACHABLE_LEN strlen ("(unreachable)")
+ if (ret > UNREACHABLE_LEN
+ && memcmp (buf, "(unreachable)", UNREACHABLE_LEN) == 0)
+ {
+ memmove (buf, buf + UNREACHABLE_LEN, ret - UNREACHABLE_LEN);
+ ret -= UNREACHABLE_LEN;
+ }
+
+ /* readlink need not terminate the string. */
buf[ret] = '\0';
- return 0;
- }
- if (__fxstat64 (_STAT_VER, fd, &st) < 0)
- return errno;
+ /* Verify readlink result, fall back on iterating through devices. */
+ if (buf[0] == '/'
+ && __xstat64 (_STAT_VER, buf, &st1) == 0
+#ifdef _STATBUF_ST_RDEV
+ && S_ISCHR (st1.st_mode)
+ && st1.st_rdev == st.st_rdev
+#else
+ && st1.st_ino == st.st_ino
+ && st1.st_dev == st.st_dev
+#endif
+ )
+ return 0;
+ }
/* Prepare the result buffer. */
memcpy (buf, "/dev/pts/", sizeof ("/dev/pts/"));
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S 2009-08-03 13:36:46.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001,2004,2005,2006,2009 Free Software Foundation, Inc.
+/* Copyright (C) 2001,2004,2005,2006,2009,2010 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
@@ -49,9 +49,9 @@
.text
ENTRY(____longjmp_chk)
/* Restore registers. */
- movq (JB_RSP*8)(%rdi),%r8
- movq (JB_RBP*8)(%rdi),%r9
- movq (JB_PC*8)(%rdi),%rdx
+ movq (JB_RSP*8)(%rdi), %r8
+ movq (JB_RBP*8)(%rdi), %r9
+ movq (JB_PC*8)(%rdi), %rdx
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (%r8)
PTR_DEMANGLE (%r9)
@@ -63,7 +63,9 @@
/* Save function parameters. */
movq %rdi, %r10
- movl %esi, %ecx
+ cfi_register (%rdi, %r10)
+ movl %esi, %ebx
+ cfi_register (%rsi, %rbx)
xorl %edi, %edi
leaq -24(%rsp), %rsi
@@ -84,7 +86,9 @@
.Lfail: CALL_FAIL
.Lok2: movq %r10, %rdi
- movl %ecx, %esi
+ cfi_restore (%rdi)
+ movl %ebx, %esi
+ cfi_restore (%rsi)
.Lok: /* We add unwind information for the target here. */
cfi_def_cfa(%rdi, 0)
@@ -96,11 +100,11 @@
cfi_offset(%r13,JB_R13*8)
cfi_offset(%r14,JB_R14*8)
cfi_offset(%r15,JB_R15*8)
- movq (JB_RBX*8)(%rdi),%rbx
- movq (JB_R12*8)(%rdi),%r12
- movq (JB_R13*8)(%rdi),%r13
- movq (JB_R14*8)(%rdi),%r14
- movq (JB_R15*8)(%rdi),%r15
+ movq (JB_RBX*8)(%rdi), %rbx
+ movq (JB_R12*8)(%rdi), %r12
+ movq (JB_R13*8)(%rdi), %r13
+ movq (JB_R14*8)(%rdi), %r14
+ movq (JB_R15*8)(%rdi), %r15
/* Set return value for setjmp. */
movl %esi, %eax
movq %r8,%rsp
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/bits/mman.h eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2009-11-19 16:22:59.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Definitions for POSIX memory map interface. Linux/x86_64 version.
- Copyright (C) 2001, 2003, 2005, 2006, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2001,2003,2005,2006,2009,2010 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
@@ -65,6 +65,7 @@
# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
# define MAP_STACK 0x20000 /* Allocation is for a stack. */
+# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
/* Flags to `msync'. */
diff -Nru eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h
--- eglibc-2.11.2/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h 2008-08-19 17:24:09.000000000 +0000
+++ eglibc-2.11.3/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2008, 2010 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
@@ -31,7 +31,7 @@
#endif
-/* Flags to be passed to epoll_create2. */
+/* Flags to be passed to epoll_create1. */
enum
{
EPOLL_CLOEXEC = 02000000,
diff -Nru eglibc-2.11.2/sysdeps/x86_64/bits/byteswap.h eglibc-2.11.3/sysdeps/x86_64/bits/byteswap.h
--- eglibc-2.11.2/sysdeps/x86_64/bits/byteswap.h 2008-05-15 12:10:03.000000000 +0000
+++ eglibc-2.11.3/sysdeps/x86_64/bits/byteswap.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,5 +1,5 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007, 2008, 2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -29,12 +29,12 @@
/* Swap bytes in 16 bit value. */
#define __bswap_constant_16(x) \
- ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+ ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
#if defined __GNUC__ && __GNUC__ >= 2
# define __bswap_16(x) \
(__extension__ \
- ({ register unsigned short int __v, __x = (x); \
+ ({ register unsigned short int __v, __x = (unsigned short int) (x); \
if (__builtin_constant_p (__x)) \
__v = __bswap_constant_16 (__x); \
else \
@@ -47,7 +47,8 @@
/* This is better than nothing. */
# define __bswap_16(x) \
(__extension__ \
- ({ register unsigned short int __x = (x); __bswap_constant_16 (__x); }))
+ ({ register unsigned short int __x = (unsigned short int) (x); \
+ __bswap_constant_16 (__x); }))
#endif
@@ -120,16 +121,16 @@
# define __bswap_64(x) \
(__extension__ \
({ union { __extension__ unsigned long long int __ll; \
- unsigned int __l[2]; } __w, __r; \
- if (__builtin_constant_p (x)) \
- __r.__ll = __bswap_constant_64 (x); \
- else \
- { \
- __w.__ll = (x); \
- __r.__l[0] = __bswap_32 (__w.__l[1]); \
- __r.__l[1] = __bswap_32 (__w.__l[0]); \
- } \
- __r.__ll; }))
+ unsigned int __l[2]; } __w, __r; \
+ if (__builtin_constant_p (x)) \
+ __r.__ll = __bswap_constant_64 (x); \
+ else \
+ { \
+ __w.__ll = (x); \
+ __r.__l[0] = __bswap_32 (__w.__l[1]); \
+ __r.__l[1] = __bswap_32 (__w.__l[0]); \
+ } \
+ __r.__ll; }))
# endif
#endif
diff -Nru eglibc-2.11.2/sysdeps/x86_64/cacheinfo.c eglibc-2.11.3/sysdeps/x86_64/cacheinfo.c
--- eglibc-2.11.2/sysdeps/x86_64/cacheinfo.c 2009-08-09 14:33:15.000000000 +0000
+++ eglibc-2.11.3/sysdeps/x86_64/cacheinfo.c 2010-12-06 20:55:10.000000000 +0000
@@ -453,10 +453,10 @@
/* Half the data cache size for use in memory and string routines, typically
- L1 size. */
+ L1 size, rounded to multiple of 256 bytes. */
long int __x86_64_data_cache_size_half attribute_hidden = 32 * 1024 / 2;
/* Shared cache size for use in memory and string routines, typically
- L2 or L3 size. */
+ L2 or L3 size, rounded to multiple of 256 bytes. */
long int __x86_64_shared_cache_size_half attribute_hidden = 1024 * 1024 / 2;
long int __x86_64_shared_cache_size attribute_hidden = 1024 * 1024;
@@ -657,10 +657,16 @@
}
if (data > 0)
- __x86_64_data_cache_size_half = data / 2;
+ {
+ /* Round data cache size to multiple of 256 bytes. */
+ data = data & ~255L;
+ __x86_64_data_cache_size_half = data / 2;
+ }
if (shared > 0)
{
+ /* Round shared cache size to multiple of 256 bytes. */
+ shared = shared & ~255L;
__x86_64_shared_cache_size_half = shared / 2;
__x86_64_shared_cache_size = shared;
}
diff -Nru eglibc-2.11.2/sysdeps/x86_64/multiarch/strchr.S eglibc-2.11.3/sysdeps/x86_64/multiarch/strchr.S
--- eglibc-2.11.2/sysdeps/x86_64/multiarch/strchr.S 2009-10-28 16:13:02.000000000 +0000
+++ eglibc-2.11.3/sysdeps/x86_64/multiarch/strchr.S 2010-11-07 12:16:06.000000000 +0000
@@ -1,5 +1,5 @@
/* strchr with SSE4.2
- Copyright (C) 2009 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010 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
@@ -87,13 +87,13 @@
pxor %xmm2, %xmm2
movd %esi, %xmm1
movl %edi, %ecx
+ pshufb %xmm2, %xmm1
andl $15, %ecx
movq %rdi, %r8
je L(aligned_start)
/* Handle unaligned string. */
andq $-16, %r8
- pshufb %xmm2, %xmm1
movdqa (%r8), %xmm0
pcmpeqb %xmm0, %xmm2
pcmpeqb %xmm1, %xmm0
diff -Nru eglibc-2.11.2/sysdeps/x86_64/strcmp.S eglibc-2.11.3/sysdeps/x86_64/strcmp.S
--- eglibc-2.11.2/sysdeps/x86_64/strcmp.S 2009-08-09 14:33:15.000000000 +0000
+++ eglibc-2.11.3/sysdeps/x86_64/strcmp.S 2010-11-07 12:16:06.000000000 +0000
@@ -313,7 +313,7 @@
jnz LABEL(ashr_1_exittail) /* find null char*/
#ifdef USE_AS_STRNCMP
- cmp $14, %r11
+ cmp $15, %r11
jbe LABEL(ashr_1_exittail)
#endif
@@ -438,7 +438,7 @@
jnz LABEL(ashr_2_exittail)
#ifdef USE_AS_STRNCMP
- cmp $13, %r11
+ cmp $14, %r11
jbe LABEL(ashr_2_exittail)
#endif
@@ -560,7 +560,7 @@
jnz LABEL(ashr_3_exittail)
#ifdef USE_AS_STRNCMP
- cmp $12, %r11
+ cmp $13, %r11
jbe LABEL(ashr_3_exittail)
#endif
@@ -682,7 +682,7 @@
jnz LABEL(ashr_4_exittail)
#ifdef USE_AS_STRNCMP
- cmp $11, %r11
+ cmp $12, %r11
jbe LABEL(ashr_4_exittail)
#endif
@@ -804,7 +804,7 @@
jnz LABEL(ashr_5_exittail)
#ifdef USE_AS_STRNCMP
- cmp $10, %r11
+ cmp $11, %r11
jbe LABEL(ashr_5_exittail)
#endif
@@ -926,7 +926,7 @@
jnz LABEL(ashr_6_exittail)
#ifdef USE_AS_STRNCMP
- cmp $9, %r11
+ cmp $10, %r11
jbe LABEL(ashr_6_exittail)
#endif
@@ -1048,7 +1048,7 @@
jnz LABEL(ashr_7_exittail)
#ifdef USE_AS_STRNCMP
- cmp $8, %r11
+ cmp $9, %r11
jbe LABEL(ashr_7_exittail)
#endif
@@ -1170,7 +1170,7 @@
jnz LABEL(ashr_8_exittail)
#ifdef USE_AS_STRNCMP
- cmp $7, %r11
+ cmp $8, %r11
jbe LABEL(ashr_8_exittail)
#endif
@@ -1292,7 +1292,7 @@
jnz LABEL(ashr_9_exittail)
#ifdef USE_AS_STRNCMP
- cmp $6, %r11
+ cmp $7, %r11
jbe LABEL(ashr_9_exittail)
#endif
@@ -1414,7 +1414,7 @@
jnz LABEL(ashr_10_exittail)
#ifdef USE_AS_STRNCMP
- cmp $5, %r11
+ cmp $6, %r11
jbe LABEL(ashr_10_exittail)
#endif
@@ -1536,7 +1536,7 @@
jnz LABEL(ashr_11_exittail)
#ifdef USE_AS_STRNCMP
- cmp $4, %r11
+ cmp $5, %r11
jbe LABEL(ashr_11_exittail)
#endif
@@ -1658,7 +1658,7 @@
jnz LABEL(ashr_12_exittail)
#ifdef USE_AS_STRNCMP
- cmp $3, %r11
+ cmp $4, %r11
jbe LABEL(ashr_12_exittail)
#endif
@@ -1780,7 +1780,7 @@
jnz LABEL(ashr_13_exittail)
#ifdef USE_AS_STRNCMP
- cmp $2, %r11
+ cmp $3, %r11
jbe LABEL(ashr_13_exittail)
#endif
@@ -1902,7 +1902,7 @@
jnz LABEL(ashr_14_exittail)
#ifdef USE_AS_STRNCMP
- cmp $1, %r11
+ cmp $2, %r11
jbe LABEL(ashr_14_exittail)
#endif
@@ -2026,8 +2026,8 @@
jnz LABEL(ashr_15_exittail)
#ifdef USE_AS_STRNCMP
- test %r11, %r11
- je LABEL(ashr_15_exittail)
+ cmpq $1, %r11
+ jbe LABEL(ashr_15_exittail)
#endif
pxor %xmm0, %xmm0
diff -Nru eglibc-2.11.2/version.h eglibc-2.11.3/version.h
--- eglibc-2.11.2/version.h 2010-06-10 19:20:45.000000000 +0000
+++ eglibc-2.11.3/version.h 2010-12-06 20:55:10.000000000 +0000
@@ -1,4 +1,4 @@
/* This file just defines the current version number of libc. */
#define RELEASE "stable"
-#define VERSION "2.11.2"
+#define VERSION "2.11.3"
diff -Nru eglibc-2.11.2/wcsmbs/wchar.h eglibc-2.11.3/wcsmbs/wchar.h
--- eglibc-2.11.2/wcsmbs/wchar.h 2009-03-15 15:53:55.000000000 +0000
+++ eglibc-2.11.3/wcsmbs/wchar.h 2010-11-07 12:16:06.000000000 +0000
@@ -658,10 +658,10 @@
extern int __REDIRECT (wscanf, (__const wchar_t *__restrict __format, ...),
__isoc99_wscanf)
/* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
-extern int __REDIRECT (swscanf, (__const wchar_t *__restrict __s,
- __const wchar_t *__restrict __format, ...),
- __isoc99_swscanf)
- __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
+extern int __REDIRECT_NTH (swscanf, (__const wchar_t *__restrict __s,
+ __const wchar_t *__restrict __format,
+ ...), __isoc99_swscanf)
+ /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
# else
extern int __isoc99_fwscanf (__FILE *__restrict __stream,
__const wchar_t *__restrict __format, ...);
@@ -712,10 +712,10 @@
extern int __REDIRECT (vwscanf, (__const wchar_t *__restrict __format,
__gnuc_va_list __arg), __isoc99_vwscanf)
/* __attribute__ ((__format__ (__wscanf__, 1, 0))) */;
-extern int __REDIRECT (vswscanf, (__const wchar_t *__restrict __s,
- __const wchar_t *__restrict __format,
- __gnuc_va_list __arg), __isoc99_vswscanf)
- __THROW /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
+extern int __REDIRECT_NTH (vswscanf, (__const wchar_t *__restrict __s,
+ __const wchar_t *__restrict __format,
+ __gnuc_va_list __arg), __isoc99_vswscanf)
+ /* __attribute__ ((__format__ (__wscanf__, 2, 0))) */;
# else
extern int __isoc99_vfwscanf (__FILE *__restrict __s,
__const wchar_t *__restrict __format,
diff -Nru eglibc-2.11.2/wcsmbs/wcsatcliff.c eglibc-2.11.3/wcsmbs/wcsatcliff.c
--- eglibc-2.11.2/wcsmbs/wcsatcliff.c 2009-04-14 19:46:20.000000000 +0000
+++ eglibc-2.11.3/wcsmbs/wcsatcliff.c 2010-11-07 12:16:06.000000000 +0000
@@ -16,6 +16,8 @@
#define MEMCPY wmemcpy
#define MEMPCPY wmempcpy
#define MEMCHR wmemchr
+#define STRCMP wcscmp
+#define STRNCMP wcsncmp
#include "../string/stratcliff.c"
Attachment:
signature.asc
Description: Digital signature