diff --git a/aarch64-sigstksz.patch b/aarch64-sigstksz.patch
deleted file mode 100644
index a405f0c..0000000
--- a/aarch64-sigstksz.patch
+++ /dev/null
@@ -1,62 +0,0 @@
- [BZ #16850]
- * sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h: New file.
-
-Index: glibc-2.21/sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h
-===================================================================
---- /dev/null
-+++ glibc-2.21/sysdeps/unix/sysv/linux/aarch64/bits/sigstack.h
-@@ -0,0 +1,54 @@
-+/* sigstack, sigaltstack definitions.
-+ Copyright (C) 2015 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, see
-+ . */
-+
-+#ifndef _SIGNAL_H
-+# error "Never include this file directly. Use instead"
-+#endif
-+
-+
-+/* Structure describing a signal stack (obsolete). */
-+struct sigstack
-+ {
-+ void *ss_sp; /* Signal stack pointer. */
-+ int ss_onstack; /* Nonzero if executing on this stack. */
-+ };
-+
-+
-+/* Possible values for `ss_flags.'. */
-+enum
-+{
-+ SS_ONSTACK = 1,
-+#define SS_ONSTACK SS_ONSTACK
-+ SS_DISABLE
-+#define SS_DISABLE SS_DISABLE
-+};
-+
-+/* Minimum stack size for a signal handler. */
-+#define MINSIGSTKSZ 5120
-+
-+/* System default stack size. */
-+#define SIGSTKSZ 16384
-+
-+
-+/* Alternate, preferred interface. */
-+typedef struct sigaltstack
-+ {
-+ void *ss_sp;
-+ int ss_flags;
-+ size_t ss_size;
-+ } stack_t;
diff --git a/dont-remove-nodelete-flag.patch b/dont-remove-nodelete-flag.patch
new file mode 100644
index 0000000..4749ba5
--- /dev/null
+++ b/dont-remove-nodelete-flag.patch
@@ -0,0 +1,34 @@
+Index: glibc-2.22/elf/dl-close.c
+===================================================================
+--- glibc-2.22.orig/elf/dl-close.c
++++ glibc-2.22/elf/dl-close.c
+@@ -144,6 +144,14 @@ _dl_close_worker (struct link_map *map,
+ char done[nloaded];
+ struct link_map *maps[nloaded];
+
++ /* Clear DF_1_NODELETE to force object deletion. We don't need to touch
++ l_tls_dtor_count because forced object deletion only happens when an
++ error occurs during object load. Destructor registration for TLS
++ non-POD objects should not have happened till then for this
++ object. */
++ if (force)
++ map->l_flags_1 &= ~DF_1_NODELETE;
++
+ /* Run over the list and assign indexes to the link maps and enter
+ them into the MAPS array. */
+ int idx = 0;
+@@ -152,14 +160,6 @@ _dl_close_worker (struct link_map *map,
+ l->l_idx = idx;
+ maps[idx] = l;
+ ++idx;
+-
+- /* Clear DF_1_NODELETE to force object deletion. We don't need to touch
+- l_tls_dtor_count because forced object deletion only happens when an
+- error occurs during object load. Destructor registration for TLS
+- non-POD objects should not have happened till then for this
+- object. */
+- if (force)
+- l->l_flags_1 &= ~DF_1_NODELETE;
+ }
+ assert (idx == nloaded);
+
diff --git a/fix-locking-in-_IO_cleanup.patch b/fix-locking-in-_IO_cleanup.patch
index e47c1c2..4608ecc 100644
--- a/fix-locking-in-_IO_cleanup.patch
+++ b/fix-locking-in-_IO_cleanup.patch
@@ -5,7 +5,7 @@ Always do locking when accessing streams
(_IO_flush_all_all_lockp): Delete.
(_IO_flush_all): Replace with body of _IO_flush_all_all_lockp.
Always do locking.
- (_IO_unbuffer_write): Always do locking.
+ (_IO_unbuffer_all): Always do locking.
(_IO_cleanup): Call _IO_flush_all instead of _IO_flush_all_lockp.
* libio/libioP.h (_IO_flush_all_all_lockp): Remove declaration.
@@ -155,7 +155,7 @@ index e0ce8cc..9def1d4 100644
#ifdef _IO_MTSAFE_IO
@@ -947,6 +902,12 @@ static void
- _IO_unbuffer_write (void)
+ _IO_unbuffer_all (void)
{
struct _IO_FILE *fp;
+
diff --git a/glibc-2.21.tar.xz b/glibc-2.21.tar.xz
deleted file mode 100644
index e6aa0d9..0000000
--- a/glibc-2.21.tar.xz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:aeeb362437965a5d3f40b151094ca79def04a115bd363fdd4a9a0c69482923b8
-size 12322092
diff --git a/glibc-2.22.tar.xz b/glibc-2.22.tar.xz
new file mode 100644
index 0000000..cda9102
--- /dev/null
+++ b/glibc-2.22.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eb731406903befef1d8f878a46be75ef862b9056ab0cde1626d08a7a05328948
+size 12969072
diff --git a/glibc-2.22.tar.xz.sig b/glibc-2.22.tar.xz.sig
new file mode 100644
index 0000000..7c558c4
--- /dev/null
+++ b/glibc-2.22.tar.xz.sig
@@ -0,0 +1,11 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iQEcBAABAgAGBQJVwbd/AAoJECXvCkNsKkr/51cIAKdzgyrQSN6EKFIIhj/SrxPz
+RyxACKUITXw5F5BldwIx3pYqpF3V7eslWdkPcZ7Ztcc/9irgvoW+qARAxivciOn1
+N33GA8hLG+Nj4kYCI9DjdJTB01UsR1iEd02ISRB23rqnUvVOgioPubJKb6GJM9Ob
+NyAn/rIR+hVXAb5SDci2lkiA604MWg2VdjPxt+dDc8lBCcBfkGHh1Sz+nVxyXWGR
+v45+US9jwefFCgBLJvfUmqlgUYxmB6RxMcxrlNx4mTtobdsQM+rBOy84T12s3HMK
+k1IPVd6YD7k4lOYjSpzzc/sj7Ib33/hfbGvwDFpjr85RgoGUgsyqnSxEL1U8Azw=
+=C5JY
+-----END PGP SIGNATURE-----
diff --git a/glibc-nodate.patch b/glibc-nodate.patch
index 441713f..d54f631 100644
--- a/glibc-nodate.patch
+++ b/glibc-nodate.patch
@@ -1,7 +1,7 @@
-Index: glibc-2.20.90/nscd/nscd_stat.c
+Index: glibc-2.21/nscd/nscd_stat.c
===================================================================
---- glibc-2.20.90.orig/nscd/nscd_stat.c
-+++ glibc-2.20.90/nscd/nscd_stat.c
+--- glibc-2.21.orig/nscd/nscd_stat.c
++++ glibc-2.21/nscd/nscd_stat.c
@@ -36,8 +36,13 @@
#endif /* HAVE_SELINUX */
@@ -30,3 +30,18 @@ Index: glibc-2.20.90/nscd/nscd_stat.c
data.debug_level = debug_level;
data.runtime = time (NULL) - start_time;
data.client_queued = client_queued;
+@@ -196,7 +206,13 @@ receive_print_stats (void)
+
+ /* Read as much data as we expect. */
+ if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data)
+- || (memcmp (data.version, compilation, sizeof (compilation)) != 0
++ || (
++#ifdef __TIMESTAMP__
++ /* Skip day of the week. */
++ memcmp (data.version, __TIMESTAMP__ + 4, sizeof (compilation)) != 0
++#else
++ memcmp (data.version, compilation, sizeof (compilation)) != 0
++#endif
+ /* Yes, this is an assignment! */
+ && (errno = EINVAL)))
+ {
diff --git a/glibc-testsuite.changes b/glibc-testsuite.changes
index 79672d1..c708e58 100644
--- a/glibc-testsuite.changes
+++ b/glibc-testsuite.changes
@@ -1,3 +1,57 @@
+-------------------------------------------------------------------
+Mon Aug 10 09:23:57 UTC 2015 - schwab@suse.de
+
+- dont-remove-nodelete-flag.patch: Don't remove DF_1_NODELETE flag from
+ all loaded objects on failed dlopen
+- openat64-readd-o-largefile.patch: Readd O_LARGEFILE flag for openat64
+
+-------------------------------------------------------------------
+Wed Aug 5 09:35:41 UTC 2015 - schwab@suse.de
+
+- Update to glibc 2.22 release.
+ * Cache information can be queried via sysconf() function on s390
+ * A buffer overflow in gethostbyname_r and related functions performing DNS
+ requests has been fixed.
+ * The time zone file parser has been made more robust against crafted time
+ zone files
+ * A powerpc and powerpc64 optimization for TLS, similar to TLS descriptors
+ for LD and GD on x86 and x86-64, has been implemented.
+ * Character encoding and ctype tables were updated to Unicode 7.0.0
+ * Added vector math library named libmvec
+ * A new fmemopen implementation has been added with the goal of POSIX
+ compliance.
+ * The header is deprecated, and will be removed in a future
+ release.
+- Patches from upstream removed
+ * htm-tabort.patch
+ * o-tmpfile.patch
+ * memcpy-chk-non-SSE2.patch
+ * pthread-mutexattr-gettype-kind.patch
+ * powerpc-software-sqrt.patch
+ * static-tls-dtv-limit.patch
+ * threaded-trim-threshold.patch
+ * resolv-nameserver-handling.patch
+ * nss-separate-state-getXXent.patch
+ * aarch64-sigstksz.patch
+ * heap-top-corruption.patch
+ * pthread-join-deadlock.patch
+
+-------------------------------------------------------------------
+Mon Jul 27 09:08:21 UTC 2015 - schwab@suse.de
+
+- pthread-join-deadlock.patch: Use IE model for static variables in
+ libc.so, libpthread.so and rtld (bsc#930015, BZ #18457)
+
+-------------------------------------------------------------------
+Wed Jul 22 09:13:48 UTC 2015 - schwab@suse.de
+
+- glibc-nodate.patch: fix verification of timestamp
+
+-------------------------------------------------------------------
+Tue Jul 21 07:50:22 UTC 2015 - meissner@suse.com
+
+- also filter out -fstack-protector-strong
+
-------------------------------------------------------------------
Mon Jun 22 07:22:22 UTC 2015 - schwab@suse.de
diff --git a/glibc-testsuite.spec b/glibc-testsuite.spec
index 45c908d..a00e253 100644
--- a/glibc-testsuite.spec
+++ b/glibc-testsuite.spec
@@ -100,13 +100,15 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
-Version: 2.21
+Version: 2.22
Release: 0
-%define git_id 4e42b5b8f89f
+%define git_id bbab82c25da9
Url: http://www.gnu.org/software/libc/libc.html
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#Source: glibc-%{version}-%{git_id}.tar.xz
Source: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz
+Source1: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz.sig
+Source2: glibc.keyring
Source3: noversion.tar.bz2
Source4: manpages.tar.bz2
Source5: nsswitch.conf
@@ -214,7 +216,6 @@ Patch102: glibc-2.4.90-no_NO.diff
Patch103: glibc-2.4-china.diff
### Broken patches in glibc that we revert for now:
-# None
### Network related patches
# PATCH-FIX-OPENSUSE reload /etc/resolv.conf on change
@@ -229,26 +230,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
-# PATCH-FIX-UPSTREAM powerpc: Fix TABORT encoding for little endian
-Patch1000: htm-tabort.patch
-# PATCH-FIX-UPSTREAM Fix value of O_TMPFILE for architectures with non-default O_DIRECTORY (BZ #17912)
-Patch1001: o-tmpfile.patch
-# PATCH-FIX-UPSTREAM Fix __memcpy_chk on non-SSE2 CPUs (BZ #17949)
-Patch1002: memcpy-chk-non-SSE2.patch
-# PATCH-FIX-UPSTREAM Filter out PTHREAD_MUTEX_NO_ELISION_NP bit in pthread_mutexattr_gettype (BZ #15790)
-Patch1003: pthread-mutexattr-gettype-kind.patch
-# PATCH-FIX-UPSTREAM Fix powerpc software sqrt (BZ #17964, BZ #17967)
-Patch1004: powerpc-software-sqrt.patch
-# PATCH-FIX-UPSTREAM Fix DTV race, assert, DTV_SURPLUS Static TLS limit, and nptl_db garbage (bsc#919678, BZ #17090, BZ #17620, BZ #17621, BZ #17628)
-Patch1005: static-tls-dtv-limit.patch
-# PATCH-FIX-UPSTREAM Fix regression in threaded application malloc performance (bsc#915955, BZ #17195)
-Patch1006: threaded-trim-threshold.patch
-# PATCH-FIX-UPSTREAM Simplify handling of nameserver configuration in resolver
-Patch1007: resolv-nameserver-handling.patch
-# PATCH-FIX-UPSTREAM Separate internal state between getXXent and getXXbyYY NSS calls (bsc#918187, BZ #18007)
-Patch1008: nss-separate-state-getXXent.patch
-# PATCH-FIX-UPSTREAM aarch64: Increase MINSIGSTKSZ and SIGSTKSZ (BZ #16850)
-Patch1009: aarch64-sigstksz.patch
###
# Patches awaiting upstream approval
@@ -263,10 +244,10 @@ Patch2003: abort-no-flush.patch
Patch2005: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Avoid redundant shift character in iconv output at block boundary (BZ #17197)
Patch2006: ibm93x-redundant-shift-si.patch
-# PATCH-FIX-UPSTREAM Don't require rtld lock to store static TLS offset in the DTV (BZ #18457)
-Patch2007: pthread-join-deadlock.patch
-# PATCH-FIX-UPSTREAM malloc: Do not corrupt the top of a threaded heap if top chunk is MINSIZE (BZ #18502)
-Patch2008: heap-top-corruption.patch
+# BZ #18778
+Patch2007: dont-remove-nodelete-flag.patch
+# BZ #18781
+Patch2008: openat64-readd-o-largefile.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@@ -466,17 +447,6 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
-%patch1000 -p1
-%patch1001 -p1
-%patch1002 -p1
-%patch1003 -p1
-%patch1004 -p1
-%patch1005 -p1
-%patch1006 -p1
-%patch1007 -p1
-%patch1008 -p1
-%patch1009 -p1
-
%patch2000 -p1
%patch2002 -p1
%patch2003 -p1
@@ -541,7 +511,7 @@ echo "#define GITID \"%{git_id}\"" >> version.h
# Default CFLAGS and Compiler
#
BuildFlags="%{optflags} -U_FORTIFY_SOURCE"
-BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector##' -e 's#-ffortify=[0-9]*##')
+BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector[^ ]*##' -e 's#-ffortify=[0-9]*##')
BuildCC="%__cc"
BuildCCplus="%__cxx"
add_ons=libidn
@@ -1144,6 +1114,10 @@ exit 0
/%{_lib}/libdl.so.2*
/%{_lib}/libm-%{version}.so
/%{_lib}/libm.so.6*
+%ifarch x86_64
+/%{_lib}/libmvec-%{version}.so
+/%{_lib}/libmvec.so.1
+%endif
/%{_lib}/libnsl-%{version}.so
/%{_lib}/libnsl.so.1
/%{_lib}/libnss_compat-%{version}.so
@@ -1265,6 +1239,9 @@ exit 0
%{_libdir}/libowcrypt.a
%{_libdir}/libdl.a
%{_libdir}/libm.a
+%ifarch x86_64
+%{_libdir}/libmvec.a
+%endif
%{_libdir}/libnsl.a
%{_libdir}/libpthread.a
%{_libdir}/libresolv.a
@@ -1313,6 +1290,9 @@ exit 0
%{_libdir}/libBrokenLocale_p.a
%{_libdir}/libanl_p.a
%{_libdir}/libm_p.a
+%ifarch x86_64
+%{_libdir}/libmvec_p.a
+%endif
%{_libdir}/libcrypt_p.a
%{_libdir}/libowcrypt_p.a
%{_libdir}/libpthread_p.a
diff --git a/glibc-utils.changes b/glibc-utils.changes
index 79672d1..c708e58 100644
--- a/glibc-utils.changes
+++ b/glibc-utils.changes
@@ -1,3 +1,57 @@
+-------------------------------------------------------------------
+Mon Aug 10 09:23:57 UTC 2015 - schwab@suse.de
+
+- dont-remove-nodelete-flag.patch: Don't remove DF_1_NODELETE flag from
+ all loaded objects on failed dlopen
+- openat64-readd-o-largefile.patch: Readd O_LARGEFILE flag for openat64
+
+-------------------------------------------------------------------
+Wed Aug 5 09:35:41 UTC 2015 - schwab@suse.de
+
+- Update to glibc 2.22 release.
+ * Cache information can be queried via sysconf() function on s390
+ * A buffer overflow in gethostbyname_r and related functions performing DNS
+ requests has been fixed.
+ * The time zone file parser has been made more robust against crafted time
+ zone files
+ * A powerpc and powerpc64 optimization for TLS, similar to TLS descriptors
+ for LD and GD on x86 and x86-64, has been implemented.
+ * Character encoding and ctype tables were updated to Unicode 7.0.0
+ * Added vector math library named libmvec
+ * A new fmemopen implementation has been added with the goal of POSIX
+ compliance.
+ * The header is deprecated, and will be removed in a future
+ release.
+- Patches from upstream removed
+ * htm-tabort.patch
+ * o-tmpfile.patch
+ * memcpy-chk-non-SSE2.patch
+ * pthread-mutexattr-gettype-kind.patch
+ * powerpc-software-sqrt.patch
+ * static-tls-dtv-limit.patch
+ * threaded-trim-threshold.patch
+ * resolv-nameserver-handling.patch
+ * nss-separate-state-getXXent.patch
+ * aarch64-sigstksz.patch
+ * heap-top-corruption.patch
+ * pthread-join-deadlock.patch
+
+-------------------------------------------------------------------
+Mon Jul 27 09:08:21 UTC 2015 - schwab@suse.de
+
+- pthread-join-deadlock.patch: Use IE model for static variables in
+ libc.so, libpthread.so and rtld (bsc#930015, BZ #18457)
+
+-------------------------------------------------------------------
+Wed Jul 22 09:13:48 UTC 2015 - schwab@suse.de
+
+- glibc-nodate.patch: fix verification of timestamp
+
+-------------------------------------------------------------------
+Tue Jul 21 07:50:22 UTC 2015 - meissner@suse.com
+
+- also filter out -fstack-protector-strong
+
-------------------------------------------------------------------
Mon Jun 22 07:22:22 UTC 2015 - schwab@suse.de
diff --git a/glibc-utils.spec b/glibc-utils.spec
index 96ecac7..6882c9e 100644
--- a/glibc-utils.spec
+++ b/glibc-utils.spec
@@ -99,13 +99,15 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
-Version: 2.21
+Version: 2.22
Release: 0
-%define git_id 4e42b5b8f89f
+%define git_id bbab82c25da9
Url: http://www.gnu.org/software/libc/libc.html
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#Source: glibc-%{version}-%{git_id}.tar.xz
Source: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz
+Source1: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz.sig
+Source2: glibc.keyring
Source3: noversion.tar.bz2
Source4: manpages.tar.bz2
Source5: nsswitch.conf
@@ -213,7 +215,6 @@ Patch102: glibc-2.4.90-no_NO.diff
Patch103: glibc-2.4-china.diff
### Broken patches in glibc that we revert for now:
-# None
### Network related patches
# PATCH-FIX-OPENSUSE reload /etc/resolv.conf on change
@@ -228,26 +229,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
-# PATCH-FIX-UPSTREAM powerpc: Fix TABORT encoding for little endian
-Patch1000: htm-tabort.patch
-# PATCH-FIX-UPSTREAM Fix value of O_TMPFILE for architectures with non-default O_DIRECTORY (BZ #17912)
-Patch1001: o-tmpfile.patch
-# PATCH-FIX-UPSTREAM Fix __memcpy_chk on non-SSE2 CPUs (BZ #17949)
-Patch1002: memcpy-chk-non-SSE2.patch
-# PATCH-FIX-UPSTREAM Filter out PTHREAD_MUTEX_NO_ELISION_NP bit in pthread_mutexattr_gettype (BZ #15790)
-Patch1003: pthread-mutexattr-gettype-kind.patch
-# PATCH-FIX-UPSTREAM Fix powerpc software sqrt (BZ #17964, BZ #17967)
-Patch1004: powerpc-software-sqrt.patch
-# PATCH-FIX-UPSTREAM Fix DTV race, assert, DTV_SURPLUS Static TLS limit, and nptl_db garbage (bsc#919678, BZ #17090, BZ #17620, BZ #17621, BZ #17628)
-Patch1005: static-tls-dtv-limit.patch
-# PATCH-FIX-UPSTREAM Fix regression in threaded application malloc performance (bsc#915955, BZ #17195)
-Patch1006: threaded-trim-threshold.patch
-# PATCH-FIX-UPSTREAM Simplify handling of nameserver configuration in resolver
-Patch1007: resolv-nameserver-handling.patch
-# PATCH-FIX-UPSTREAM Separate internal state between getXXent and getXXbyYY NSS calls (bsc#918187, BZ #18007)
-Patch1008: nss-separate-state-getXXent.patch
-# PATCH-FIX-UPSTREAM aarch64: Increase MINSIGSTKSZ and SIGSTKSZ (BZ #16850)
-Patch1009: aarch64-sigstksz.patch
###
# Patches awaiting upstream approval
@@ -262,10 +243,10 @@ Patch2003: abort-no-flush.patch
Patch2005: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Avoid redundant shift character in iconv output at block boundary (BZ #17197)
Patch2006: ibm93x-redundant-shift-si.patch
-# PATCH-FIX-UPSTREAM Don't require rtld lock to store static TLS offset in the DTV (BZ #18457)
-Patch2007: pthread-join-deadlock.patch
-# PATCH-FIX-UPSTREAM malloc: Do not corrupt the top of a threaded heap if top chunk is MINSIZE (BZ #18502)
-Patch2008: heap-top-corruption.patch
+# BZ #18778
+Patch2007: dont-remove-nodelete-flag.patch
+# BZ #18781
+Patch2008: openat64-readd-o-largefile.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@@ -466,17 +447,6 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
-%patch1000 -p1
-%patch1001 -p1
-%patch1002 -p1
-%patch1003 -p1
-%patch1004 -p1
-%patch1005 -p1
-%patch1006 -p1
-%patch1007 -p1
-%patch1008 -p1
-%patch1009 -p1
-
%patch2000 -p1
%patch2002 -p1
%patch2003 -p1
@@ -541,7 +511,7 @@ echo "#define GITID \"%{git_id}\"" >> version.h
# Default CFLAGS and Compiler
#
BuildFlags="%{optflags} -U_FORTIFY_SOURCE"
-BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector##' -e 's#-ffortify=[0-9]*##')
+BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector[^ ]*##' -e 's#-ffortify=[0-9]*##')
BuildCC="%__cc"
BuildCCplus="%__cxx"
add_ons=libidn
@@ -1144,6 +1114,10 @@ exit 0
/%{_lib}/libdl.so.2*
/%{_lib}/libm-%{version}.so
/%{_lib}/libm.so.6*
+%ifarch x86_64
+/%{_lib}/libmvec-%{version}.so
+/%{_lib}/libmvec.so.1
+%endif
/%{_lib}/libnsl-%{version}.so
/%{_lib}/libnsl.so.1
/%{_lib}/libnss_compat-%{version}.so
@@ -1265,6 +1239,9 @@ exit 0
%{_libdir}/libowcrypt.a
%{_libdir}/libdl.a
%{_libdir}/libm.a
+%ifarch x86_64
+%{_libdir}/libmvec.a
+%endif
%{_libdir}/libnsl.a
%{_libdir}/libpthread.a
%{_libdir}/libresolv.a
@@ -1313,6 +1290,9 @@ exit 0
%{_libdir}/libBrokenLocale_p.a
%{_libdir}/libanl_p.a
%{_libdir}/libm_p.a
+%ifarch x86_64
+%{_libdir}/libmvec_p.a
+%endif
%{_libdir}/libcrypt_p.a
%{_libdir}/libowcrypt_p.a
%{_libdir}/libpthread_p.a
diff --git a/glibc.changes b/glibc.changes
index 79672d1..c708e58 100644
--- a/glibc.changes
+++ b/glibc.changes
@@ -1,3 +1,57 @@
+-------------------------------------------------------------------
+Mon Aug 10 09:23:57 UTC 2015 - schwab@suse.de
+
+- dont-remove-nodelete-flag.patch: Don't remove DF_1_NODELETE flag from
+ all loaded objects on failed dlopen
+- openat64-readd-o-largefile.patch: Readd O_LARGEFILE flag for openat64
+
+-------------------------------------------------------------------
+Wed Aug 5 09:35:41 UTC 2015 - schwab@suse.de
+
+- Update to glibc 2.22 release.
+ * Cache information can be queried via sysconf() function on s390
+ * A buffer overflow in gethostbyname_r and related functions performing DNS
+ requests has been fixed.
+ * The time zone file parser has been made more robust against crafted time
+ zone files
+ * A powerpc and powerpc64 optimization for TLS, similar to TLS descriptors
+ for LD and GD on x86 and x86-64, has been implemented.
+ * Character encoding and ctype tables were updated to Unicode 7.0.0
+ * Added vector math library named libmvec
+ * A new fmemopen implementation has been added with the goal of POSIX
+ compliance.
+ * The header is deprecated, and will be removed in a future
+ release.
+- Patches from upstream removed
+ * htm-tabort.patch
+ * o-tmpfile.patch
+ * memcpy-chk-non-SSE2.patch
+ * pthread-mutexattr-gettype-kind.patch
+ * powerpc-software-sqrt.patch
+ * static-tls-dtv-limit.patch
+ * threaded-trim-threshold.patch
+ * resolv-nameserver-handling.patch
+ * nss-separate-state-getXXent.patch
+ * aarch64-sigstksz.patch
+ * heap-top-corruption.patch
+ * pthread-join-deadlock.patch
+
+-------------------------------------------------------------------
+Mon Jul 27 09:08:21 UTC 2015 - schwab@suse.de
+
+- pthread-join-deadlock.patch: Use IE model for static variables in
+ libc.so, libpthread.so and rtld (bsc#930015, BZ #18457)
+
+-------------------------------------------------------------------
+Wed Jul 22 09:13:48 UTC 2015 - schwab@suse.de
+
+- glibc-nodate.patch: fix verification of timestamp
+
+-------------------------------------------------------------------
+Tue Jul 21 07:50:22 UTC 2015 - meissner@suse.com
+
+- also filter out -fstack-protector-strong
+
-------------------------------------------------------------------
Mon Jun 22 07:22:22 UTC 2015 - schwab@suse.de
diff --git a/glibc.keyring b/glibc.keyring
new file mode 100644
index 0000000..4de855c
--- /dev/null
+++ b/glibc.keyring
@@ -0,0 +1,149 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+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
+5YGy0WPvg8z+Jq17TMKt8qd7CArYdg==
+=n8pX
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/glibc.spec b/glibc.spec
index b404f9a..ff37d93 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -100,13 +100,15 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
-Version: 2.21
+Version: 2.22
Release: 0
-%define git_id 4e42b5b8f89f
+%define git_id bbab82c25da9
Url: http://www.gnu.org/software/libc/libc.html
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#Source: glibc-%{version}-%{git_id}.tar.xz
Source: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz
+Source1: http://ftp.gnu.org/pub/gnu/glibc/glibc-%{version}.tar.xz.sig
+Source2: glibc.keyring
Source3: noversion.tar.bz2
Source4: manpages.tar.bz2
Source5: nsswitch.conf
@@ -214,7 +216,6 @@ Patch102: glibc-2.4.90-no_NO.diff
Patch103: glibc-2.4-china.diff
### Broken patches in glibc that we revert for now:
-# None
### Network related patches
# PATCH-FIX-OPENSUSE reload /etc/resolv.conf on change
@@ -229,26 +230,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
-# PATCH-FIX-UPSTREAM powerpc: Fix TABORT encoding for little endian
-Patch1000: htm-tabort.patch
-# PATCH-FIX-UPSTREAM Fix value of O_TMPFILE for architectures with non-default O_DIRECTORY (BZ #17912)
-Patch1001: o-tmpfile.patch
-# PATCH-FIX-UPSTREAM Fix __memcpy_chk on non-SSE2 CPUs (BZ #17949)
-Patch1002: memcpy-chk-non-SSE2.patch
-# PATCH-FIX-UPSTREAM Filter out PTHREAD_MUTEX_NO_ELISION_NP bit in pthread_mutexattr_gettype (BZ #15790)
-Patch1003: pthread-mutexattr-gettype-kind.patch
-# PATCH-FIX-UPSTREAM Fix powerpc software sqrt (BZ #17964, BZ #17967)
-Patch1004: powerpc-software-sqrt.patch
-# PATCH-FIX-UPSTREAM Fix DTV race, assert, DTV_SURPLUS Static TLS limit, and nptl_db garbage (bsc#919678, BZ #17090, BZ #17620, BZ #17621, BZ #17628)
-Patch1005: static-tls-dtv-limit.patch
-# PATCH-FIX-UPSTREAM Fix regression in threaded application malloc performance (bsc#915955, BZ #17195)
-Patch1006: threaded-trim-threshold.patch
-# PATCH-FIX-UPSTREAM Simplify handling of nameserver configuration in resolver
-Patch1007: resolv-nameserver-handling.patch
-# PATCH-FIX-UPSTREAM Separate internal state between getXXent and getXXbyYY NSS calls (bsc#918187, BZ #18007)
-Patch1008: nss-separate-state-getXXent.patch
-# PATCH-FIX-UPSTREAM aarch64: Increase MINSIGSTKSZ and SIGSTKSZ (BZ #16850)
-Patch1009: aarch64-sigstksz.patch
###
# Patches awaiting upstream approval
@@ -263,10 +244,10 @@ Patch2003: abort-no-flush.patch
Patch2005: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Avoid redundant shift character in iconv output at block boundary (BZ #17197)
Patch2006: ibm93x-redundant-shift-si.patch
-# PATCH-FIX-UPSTREAM Don't require rtld lock to store static TLS offset in the DTV (BZ #18457)
-Patch2007: pthread-join-deadlock.patch
-# PATCH-FIX-UPSTREAM malloc: Do not corrupt the top of a threaded heap if top chunk is MINSIZE (BZ #18502)
-Patch2008: heap-top-corruption.patch
+# BZ #18778
+Patch2007: dont-remove-nodelete-flag.patch
+# BZ #18781
+Patch2008: openat64-readd-o-largefile.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@@ -466,17 +447,6 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
-%patch1000 -p1
-%patch1001 -p1
-%patch1002 -p1
-%patch1003 -p1
-%patch1004 -p1
-%patch1005 -p1
-%patch1006 -p1
-%patch1007 -p1
-%patch1008 -p1
-%patch1009 -p1
-
%patch2000 -p1
%patch2002 -p1
%patch2003 -p1
@@ -541,7 +511,7 @@ echo "#define GITID \"%{git_id}\"" >> version.h
# Default CFLAGS and Compiler
#
BuildFlags="%{optflags} -U_FORTIFY_SOURCE"
-BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector##' -e 's#-ffortify=[0-9]*##')
+BuildFlags=$(echo $BuildFlags | sed -e 's#-fstack-protector[^ ]*##' -e 's#-ffortify=[0-9]*##')
BuildCC="%__cc"
BuildCCplus="%__cxx"
add_ons=libidn
@@ -1144,6 +1114,10 @@ exit 0
/%{_lib}/libdl.so.2*
/%{_lib}/libm-%{version}.so
/%{_lib}/libm.so.6*
+%ifarch x86_64
+/%{_lib}/libmvec-%{version}.so
+/%{_lib}/libmvec.so.1
+%endif
/%{_lib}/libnsl-%{version}.so
/%{_lib}/libnsl.so.1
/%{_lib}/libnss_compat-%{version}.so
@@ -1265,6 +1239,9 @@ exit 0
%{_libdir}/libowcrypt.a
%{_libdir}/libdl.a
%{_libdir}/libm.a
+%ifarch x86_64
+%{_libdir}/libmvec.a
+%endif
%{_libdir}/libnsl.a
%{_libdir}/libpthread.a
%{_libdir}/libresolv.a
@@ -1313,6 +1290,9 @@ exit 0
%{_libdir}/libBrokenLocale_p.a
%{_libdir}/libanl_p.a
%{_libdir}/libm_p.a
+%ifarch x86_64
+%{_libdir}/libmvec_p.a
+%endif
%{_libdir}/libcrypt_p.a
%{_libdir}/libowcrypt_p.a
%{_libdir}/libpthread_p.a
diff --git a/heap-top-corruption.patch b/heap-top-corruption.patch
deleted file mode 100644
index 9b000a7..0000000
--- a/heap-top-corruption.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From: Mel Gorman
-Subject: [PATCH] [v3] malloc: Do not corrupt the top of a threaded heap if
- top chunk is MINSIZE [BZ #18502]
-Date: Mon, 8 Jun 2015 13:36:13 +0100
-
-mksquashfs was reported in openSUSE to be causing segmentation faults when
-creating installation images. Testing showed that mksquashfs sometimes
-failed and could be reproduced within 10 attempts. The core dump looked
-like the heap top was corrupted and was pointing to an unmapped area. In
-other cases, this has been due to an application corrupting glibc structures
-but mksquashfs appears to be fine in this regard.
-
-The problem is that heap_trim is "growing" the top into unmapped space.
-If the top chunk == MINSIZE then top_area is -1 and this check does not
-behave as expected due to a signed/unsigned comparison
-
- if (top_area <= pad)
- return 0;
-
-The next calculation extra = ALIGN_DOWN(top_area - pad, pagesz) calculates
-extra as a negative number which also is unnoticed due to a signed/unsigned
-comparison. We then call shrink_heap(heap, negative_number) which crashes
-later. This patch adds a simple check against MINSIZE to make sure extra
-does not become negative. It adds a cast to hint to the reader that this
-is a signed vs unsigned issue.
-
-Without the patch, mksquash fails within 10 attempts. With it applied, it
-completed 1000 times without error. The standard test suite "make check"
-showed no changes in the summary of test results.
-
-2015-06-08 Mel Gorman
-
- [BZ #18502]
- * malloc/arena.c: Avoid corruption of the top of heaps for threads
----
- malloc/arena.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: glibc-2.21/malloc/arena.c
-===================================================================
---- glibc-2.21.orig/malloc/arena.c
-+++ glibc-2.21/malloc/arena.c
-@@ -699,7 +699,7 @@ heap_trim (heap_info *heap, size_t pad)
- by preserving the top pad and at least a page. */
- top_size = chunksize (top_chunk);
- top_area = top_size - MINSIZE - 1;
-- if (top_area <= pad)
-+ if (top_area < 0 || (size_t) top_area <= pad)
- return 0;
-
- extra = ALIGN_DOWN(top_area - pad, pagesz);
diff --git a/htm-tabort.patch b/htm-tabort.patch
deleted file mode 100644
index 209b334..0000000
--- a/htm-tabort.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-2015-02-12 Adhemerval Zanella
-
- * sysdeps/unix/sysv/linux/powerpc/htm.h [TABORT]: Fix encoding for
- little endian.
-
-Index: glibc-2.21/sysdeps/unix/sysv/linux/powerpc/htm.h
-===================================================================
---- glibc-2.21.orig/sysdeps/unix/sysv/linux/powerpc/htm.h
-+++ glibc-2.21/sysdeps/unix/sysv/linux/powerpc/htm.h
-@@ -60,7 +60,7 @@
- #define TBEGIN ".long 0x7c00051d"
- #define TEND ".long 0x7c00055d"
- #if __BYTE_ORDER == __LITTLE_ENDIAN
--# define TABORT ".byte 0x1d,0x07,%1,0x1d"
-+# define TABORT ".byte 0x1d,0x07,%1,0x7c"
- #else
- # define TABORT ".byte 0x7c,%1,0x07,0x1d"
- #endif
diff --git a/memcpy-chk-non-SSE2.patch b/memcpy-chk-non-SSE2.patch
deleted file mode 100644
index 810481e..0000000
--- a/memcpy-chk-non-SSE2.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-2015-02-10 Evangelos Foutras
-
- [BZ #17949]
- * sysdeps/i386/i686/multiarch/mempcpy_chk.S: Fix position of
- jump label.
-
-Index: glibc-2.21/sysdeps/i386/i686/multiarch/mempcpy_chk.S
-===================================================================
---- glibc-2.21.orig/sysdeps/i386/i686/multiarch/mempcpy_chk.S
-+++ glibc-2.21/sysdeps/i386/i686/multiarch/mempcpy_chk.S
-@@ -36,8 +36,8 @@ ENTRY(__mempcpy_chk)
- cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
- jne 1f
- call __init_cpu_features
-- leal __mempcpy_chk_ia32@GOTOFF(%ebx), %eax
--1: testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
-+1: leal __mempcpy_chk_ia32@GOTOFF(%ebx), %eax
-+ testl $bit_SSE2, CPUID_OFFSET+index_SSE2+__cpu_features@GOTOFF(%ebx)
- jz 2f
- leal __mempcpy_chk_sse2_unaligned@GOTOFF(%ebx), %eax
- testl $bit_Fast_Unaligned_Load, FEATURE_OFFSET+index_Fast_Unaligned_Load+__cpu_features@GOTOFF(%ebx)
diff --git a/nss-separate-state-getXXent.patch b/nss-separate-state-getXXent.patch
deleted file mode 100644
index 10b4dea..0000000
--- a/nss-separate-state-getXXent.patch
+++ /dev/null
@@ -1,715 +0,0 @@
- [BZ #18007]
- * nis/nss_compat/compat-grp.c (internal_endgrent): Add parameter
- needent, call nss_endgrent only if non-zero.
- (_nss_compat_endgrent): Pass non-zero.
- (_nss_compat_getgrnam_r, _nss_compat_getgrgid_r): Pass zero.
- * nis/nss_compat/compat-pwd.c (internal_endpwent): Add parameter
- needent, call nss_endpwent only if non-zero.
- (_nss_compat_endpwent): Pass non-zero.
- (_nss_compat_getpwnam_r, _nss_compat_getpwuid_r): Pass zero.
- * nis/nss_compat/compat-spwd.c (internal_setspent): Add parameter
- needent, call nss_setspent only if non-zero.
- (_nss_compat_setspent): Pass non-zero.
- (internal_endspent): Add parameter needent, call nss_endspent only
- if non-zero.
- (_nss_compat_endspent, _nss_compat_getspent_r): Pass non-zero.
- (_nss_compat_getspnam_r): Pass zero.
- * nss/nss_files/files-XXX.c (position, last_use, keep_stream):
- Remove. All uses removed.
- (internal_setent): Remove parameter stayopen, add parameter
- stream. Use it instead of global variable.
- (CONCAT(_nss_files_set,ENTNAME)): Pass global stream.
- (internal_endent, internal_getent): Add parameter stream. Use it
- instead of global variable.
- (CONCAT(_nss_files_end,ENTNAME))
- (CONCAT(_nss_files_get,ENTNAME_r)): Pass global stream.
- (_nss_files_get##name##_r): Pass local stream. Remove locking.
- * nss/nss_files/files-alias.c (position, last_use): Remove. All
- uses removed.
- (internal_setent, internal_endent): Add parameter stream. Use it
- instead of global variable.
- (_nss_files_setaliasent, _nss_files_endaliasent): Pass global
- stream.
- (get_next_alias): Add parameter stream.
- (_nss_files_getaliasent_r): Pass global stream.
- (_nss_files_getaliasbyname_r): Pass local stream. Remove locking.
- * nss/nss_files/files-hosts.c (_nss_files_gethostbyname3_r)
- (_nss_files_gethostbyname4_r): Pass local stream to
- internal_setent, internal_getent and internal_endent. Remove
- locking.
-
-Index: glibc-2.21/nis/nss_compat/compat-grp.c
-===================================================================
---- glibc-2.21.orig/nis/nss_compat/compat-grp.c
-+++ glibc-2.21/nis/nss_compat/compat-grp.c
-@@ -192,9 +192,9 @@ _nss_compat_setgrent (int stayopen)
-
-
- static enum nss_status
--internal_endgrent (ent_t *ent)
-+internal_endgrent (ent_t *ent, int needent)
- {
-- if (nss_endgrent)
-+ if (needent && nss_endgrent)
- nss_endgrent ();
-
- if (ent->stream != NULL)
-@@ -222,7 +222,7 @@ _nss_compat_endgrent (void)
-
- __libc_lock_lock (lock);
-
-- result = internal_endgrent (&ext_ent);
-+ result = internal_endgrent (&ext_ent, 1);
-
- __libc_lock_unlock (lock);
-
-@@ -532,7 +532,7 @@ _nss_compat_getgrnam_r (const char *name
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getgrnam_r (name, grp, &ent, buffer, buflen, errnop);
-
-- internal_endgrent (&ent);
-+ internal_endgrent (&ent, 0);
-
- return result;
- }
-@@ -661,7 +661,7 @@ _nss_compat_getgrgid_r (gid_t gid, struc
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getgrgid_r (gid, grp, &ent, buffer, buflen, errnop);
-
-- internal_endgrent (&ent);
-+ internal_endgrent (&ent, 0);
-
- return result;
- }
-Index: glibc-2.21/nis/nss_compat/compat-pwd.c
-===================================================================
---- glibc-2.21.orig/nis/nss_compat/compat-pwd.c
-+++ glibc-2.21/nis/nss_compat/compat-pwd.c
-@@ -309,9 +309,9 @@ _nss_compat_setpwent (int stayopen)
-
-
- static enum nss_status
--internal_endpwent (ent_t *ent)
-+internal_endpwent (ent_t *ent, int needent)
- {
-- if (nss_endpwent)
-+ if (needent && nss_endpwent)
- nss_endpwent ();
-
- if (ent->stream != NULL)
-@@ -346,7 +346,7 @@ _nss_compat_endpwent (void)
-
- __libc_lock_lock (lock);
-
-- result = internal_endpwent (&ext_ent);
-+ result = internal_endpwent (&ext_ent, 1);
-
- __libc_lock_unlock (lock);
-
-@@ -871,7 +871,7 @@ _nss_compat_getpwnam_r (const char *name
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getpwnam_r (name, pwd, &ent, buffer, buflen, errnop);
-
-- internal_endpwent (&ent);
-+ internal_endpwent (&ent, 0);
-
- return result;
- }
-@@ -1110,7 +1110,7 @@ _nss_compat_getpwuid_r (uid_t uid, struc
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getpwuid_r (uid, pwd, &ent, buffer, buflen, errnop);
-
-- internal_endpwent (&ent);
-+ internal_endpwent (&ent, 0);
-
- return result;
- }
-Index: glibc-2.21/nis/nss_compat/compat-spwd.c
-===================================================================
---- glibc-2.21.orig/nis/nss_compat/compat-spwd.c
-+++ glibc-2.21/nis/nss_compat/compat-spwd.c
-@@ -169,7 +169,7 @@ copy_spwd_changes (struct spwd *dest, st
- }
-
- static enum nss_status
--internal_setspent (ent_t *ent, int stayopen)
-+internal_setspent (ent_t *ent, int stayopen, int needent)
- {
- enum nss_status status = NSS_STATUS_SUCCESS;
-
-@@ -239,7 +239,7 @@ internal_setspent (ent_t *ent, int stayo
-
- give_spwd_free (&ent->pwd);
-
-- if (status == NSS_STATUS_SUCCESS && nss_setspent)
-+ if (needent && status == NSS_STATUS_SUCCESS && nss_setspent)
- ent->setent_status = nss_setspent (stayopen);
-
- return status;
-@@ -256,7 +256,7 @@ _nss_compat_setspent (int stayopen)
- if (ni == NULL)
- init_nss_interface ();
-
-- result = internal_setspent (&ext_ent, stayopen);
-+ result = internal_setspent (&ext_ent, stayopen, 1);
-
- __libc_lock_unlock (lock);
-
-@@ -265,9 +265,9 @@ _nss_compat_setspent (int stayopen)
-
-
- static enum nss_status
--internal_endspent (ent_t *ent)
-+internal_endspent (ent_t *ent, int needent)
- {
-- if (nss_endspent)
-+ if (needent && nss_endspent)
- nss_endspent ();
-
- if (ent->stream != NULL)
-@@ -303,7 +303,7 @@ _nss_compat_endspent (void)
-
- __libc_lock_lock (lock);
-
-- result = internal_endspent (&ext_ent);
-+ result = internal_endspent (&ext_ent, 1);
-
- __libc_lock_unlock (lock);
-
-@@ -658,7 +658,7 @@ _nss_compat_getspent_r (struct spwd *pwd
- init_nss_interface ();
-
- if (ext_ent.stream == NULL)
-- result = internal_setspent (&ext_ent, 1);
-+ result = internal_setspent (&ext_ent, 1, 1);
-
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getspent_r (pwd, &ext_ent, buffer, buflen, errnop);
-@@ -830,12 +830,12 @@ _nss_compat_getspnam_r (const char *name
-
- __libc_lock_unlock (lock);
-
-- result = internal_setspent (&ent, 0);
-+ result = internal_setspent (&ent, 0, 0);
-
- if (result == NSS_STATUS_SUCCESS)
- result = internal_getspnam_r (name, pwd, &ent, buffer, buflen, errnop);
-
-- internal_endspent (&ent);
-+ internal_endspent (&ent, 0);
-
- return result;
- }
-Index: glibc-2.21/nss/nss_files/files-XXX.c
-===================================================================
---- glibc-2.21.orig/nss/nss_files/files-XXX.c
-+++ glibc-2.21/nss/nss_files/files-XXX.c
-@@ -63,21 +63,18 @@ __libc_lock_define_initialized (static,
- /* Maintenance of the shared stream open on the database file. */
-
- static FILE *stream;
--static fpos_t position;
--static enum { nouse, getent, getby } last_use;
--static int keep_stream;
-
- /* Open database file if not already opened. */
- static enum nss_status
--internal_setent (int stayopen)
-+internal_setent (FILE **stream)
- {
- enum nss_status status = NSS_STATUS_SUCCESS;
-
-- if (stream == NULL)
-+ if (*stream == NULL)
- {
-- stream = fopen (DATAFILE, "rce");
-+ *stream = fopen (DATAFILE, "rce");
-
-- if (stream == NULL)
-+ if (*stream == NULL)
- status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
- else
- {
-@@ -90,7 +87,7 @@ internal_setent (int stayopen)
- int result;
- int flags;
-
-- result = flags = fcntl (fileno (stream), F_GETFD, 0);
-+ result = flags = fcntl (fileno (*stream), F_GETFD, 0);
- if (result >= 0)
- {
- # ifdef O_CLOEXEC
-@@ -100,15 +97,15 @@ internal_setent (int stayopen)
- # endif
- {
- flags |= FD_CLOEXEC;
-- result = fcntl (fileno (stream), F_SETFD, flags);
-+ result = fcntl (fileno (*stream), F_SETFD, flags);
- }
- }
- if (result < 0)
- {
- /* Something went wrong. Close the stream and return a
- failure. */
-- fclose (stream);
-- stream = NULL;
-+ fclose (*stream);
-+ *stream = NULL;
- status = NSS_STATUS_UNAVAIL;
- }
- }
-@@ -116,11 +113,7 @@ internal_setent (int stayopen)
- }
- }
- else
-- rewind (stream);
--
-- /* Remember STAYOPEN flag. */
-- if (stream != NULL)
-- keep_stream |= stayopen;
-+ rewind (*stream);
-
- return status;
- }
-@@ -134,16 +127,7 @@ CONCAT(_nss_files_set,ENTNAME) (int stay
-
- __libc_lock_lock (lock);
-
-- status = internal_setent (stayopen);
--
-- if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
-- {
-- fclose (stream);
-- stream = NULL;
-- status = NSS_STATUS_UNAVAIL;
-- }
--
-- last_use = getent;
-+ status = internal_setent (&stream);
-
- __libc_lock_unlock (lock);
-
-@@ -153,12 +137,12 @@ CONCAT(_nss_files_set,ENTNAME) (int stay
-
- /* Close the database file. */
- static void
--internal_endent (void)
-+internal_endent (FILE **stream)
- {
-- if (stream != NULL)
-+ if (*stream != NULL)
- {
-- fclose (stream);
-- stream = NULL;
-+ fclose (*stream);
-+ *stream = NULL;
- }
- }
-
-@@ -169,10 +153,7 @@ CONCAT(_nss_files_end,ENTNAME) (void)
- {
- __libc_lock_lock (lock);
-
-- internal_endent ();
--
-- /* Reset STAYOPEN flag. */
-- keep_stream = 0;
-+ internal_endent (&stream);
-
- __libc_lock_unlock (lock);
-
-@@ -227,7 +208,7 @@ get_contents (char *linebuf, size_t len,
-
- /* Parsing the database file into `struct STRUCTURE' data structures. */
- static enum nss_status
--internal_getent (struct STRUCTURE *result,
-+internal_getent (FILE *stream, struct STRUCTURE *result,
- char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO
- EXTRA_ARGS_DECL)
- {
-@@ -300,45 +281,14 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct
- {
- int save_errno = errno;
-
-- status = internal_setent (0);
-+ status = internal_setent (&stream);
-
- __set_errno (save_errno);
--
-- if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
-- {
-- fclose (stream);
-- stream = NULL;
-- status = NSS_STATUS_UNAVAIL;
-- }
- }
-
- if (status == NSS_STATUS_SUCCESS)
-- {
-- /* If the last use was not by the getent function we need the
-- position the stream. */
-- if (last_use != getent)
-- {
-- if (fsetpos (stream, &position) < 0)
-- status = NSS_STATUS_UNAVAIL;
-- else
-- last_use = getent;
-- }
--
-- if (status == NSS_STATUS_SUCCESS)
-- {
-- status = internal_getent (result, buffer, buflen, errnop
-- H_ERRNO_ARG EXTRA_ARGS_VALUE);
--
-- /* Remember this position if we were successful. If the
-- operation failed we give the user a chance to repeat the
-- operation (perhaps the buffer was too small). */
-- if (status == NSS_STATUS_SUCCESS)
-- fgetpos (stream, &position);
-- else
-- /* We must make sure we reposition the stream the next call. */
-- last_use = nouse;
-- }
-- }
-+ status = internal_getent (stream, result, buffer, buflen, errnop
-+ H_ERRNO_ARG EXTRA_ARGS_VALUE);
-
- __libc_lock_unlock (lock);
-
-@@ -364,27 +314,20 @@ _nss_files_get##name##_r (proto,
- size_t buflen, int *errnop H_ERRNO_PROTO) \
- { \
- enum nss_status status; \
-+ FILE *stream = NULL; \
- \
-- __libc_lock_lock (lock); \
-- \
-- /* Reset file pointer to beginning or open file. */ \
-- status = internal_setent (keep_stream); \
-+ /* Open file. */ \
-+ status = internal_setent (&stream); \
- \
- if (status == NSS_STATUS_SUCCESS) \
- { \
-- /* Tell getent function that we have repositioned the file pointer. */ \
-- last_use = getby; \
-- \
-- while ((status = internal_getent (result, buffer, buflen, errnop \
-+ while ((status = internal_getent (stream, result, buffer, buflen, errnop \
- H_ERRNO_ARG EXTRA_ARGS_VALUE)) \
- == NSS_STATUS_SUCCESS) \
- { break_if_match } \
- \
-- if (! keep_stream) \
-- internal_endent (); \
-+ internal_endent (&stream); \
- } \
- \
-- __libc_lock_unlock (lock); \
-- \
- return status; \
- }
-Index: glibc-2.21/nss/nss_files/files-alias.c
-===================================================================
---- glibc-2.21.orig/nss/nss_files/files-alias.c
-+++ glibc-2.21/nss/nss_files/files-alias.c
-@@ -36,20 +36,18 @@ __libc_lock_define_initialized (static,
- /* Maintenance of the shared stream open on the database file. */
-
- static FILE *stream;
--static fpos_t position;
--static enum { nouse, getent, getby } last_use;
-
-
- static enum nss_status
--internal_setent (void)
-+internal_setent (FILE **stream)
- {
- enum nss_status status = NSS_STATUS_SUCCESS;
-
-- if (stream == NULL)
-+ if (*stream == NULL)
- {
-- stream = fopen ("/etc/aliases", "rce");
-+ *stream = fopen ("/etc/aliases", "rce");
-
-- if (stream == NULL)
-+ if (*stream == NULL)
- status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
- else
- {
-@@ -62,7 +60,7 @@ internal_setent (void)
- int result;
- int flags;
-
-- result = flags = fcntl (fileno (stream), F_GETFD, 0);
-+ result = flags = fcntl (fileno (*stream), F_GETFD, 0);
- if (result >= 0)
- {
- # ifdef O_CLOEXEC
-@@ -72,14 +70,14 @@ internal_setent (void)
- # endif
- {
- flags |= FD_CLOEXEC;
-- result = fcntl (fileno (stream), F_SETFD, flags);
-+ result = fcntl (fileno (*stream), F_SETFD, flags);
- }
- }
- if (result < 0)
- {
- /* Something went wrong. Close the stream and return a
- failure. */
-- fclose (stream);
-+ fclose (*stream);
- stream = NULL;
- status = NSS_STATUS_UNAVAIL;
- }
-@@ -88,7 +86,7 @@ internal_setent (void)
- }
- }
- else
-- rewind (stream);
-+ rewind (*stream);
-
- return status;
- }
-@@ -102,16 +100,7 @@ _nss_files_setaliasent (void)
-
- __libc_lock_lock (lock);
-
-- status = internal_setent ();
--
-- if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
-- {
-- fclose (stream);
-- stream = NULL;
-- status = NSS_STATUS_UNAVAIL;
-- }
--
-- last_use = getent;
-+ status = internal_setent (&stream);
-
- __libc_lock_unlock (lock);
-
-@@ -121,12 +110,12 @@ _nss_files_setaliasent (void)
-
- /* Close the database file. */
- static void
--internal_endent (void)
-+internal_endent (FILE **stream)
- {
-- if (stream != NULL)
-+ if (*stream != NULL)
- {
-- fclose (stream);
-- stream = NULL;
-+ fclose (*stream);
-+ *stream = NULL;
- }
- }
-
-@@ -137,7 +126,7 @@ _nss_files_endaliasent (void)
- {
- __libc_lock_lock (lock);
-
-- internal_endent ();
-+ internal_endent (&stream);
-
- __libc_lock_unlock (lock);
-
-@@ -146,7 +135,7 @@ _nss_files_endaliasent (void)
-
- /* Parsing the database file into `struct aliasent' data structures. */
- static enum nss_status
--get_next_alias (const char *match, struct aliasent *result,
-+get_next_alias (FILE *stream, const char *match, struct aliasent *result,
- char *buffer, size_t buflen, int *errnop)
- {
- enum nss_status status = NSS_STATUS_NOTFOUND;
-@@ -397,35 +386,16 @@ _nss_files_getaliasent_r (struct aliasen
-
- /* Be prepared that the set*ent function was not called before. */
- if (stream == NULL)
-- status = internal_setent ();
-+ status = internal_setent (&stream);
-
- if (status == NSS_STATUS_SUCCESS)
- {
-- /* If the last use was not by the getent function we need the
-- position the stream. */
-- if (last_use != getent)
-- {
-- if (fsetpos (stream, &position) < 0)
-- status = NSS_STATUS_UNAVAIL;
-- else
-- last_use = getent;
-- }
--
-- if (status == NSS_STATUS_SUCCESS)
-- {
-- result->alias_local = 1;
-+ result->alias_local = 1;
-
-- /* Read lines until we get a definite result. */
-- do
-- status = get_next_alias (NULL, result, buffer, buflen, errnop);
-- while (status == NSS_STATUS_RETURN);
--
-- /* If we successfully read an entry remember this position. */
-- if (status == NSS_STATUS_SUCCESS)
-- fgetpos (stream, &position);
-- else
-- last_use = nouse;
-- }
-+ /* Read lines until we get a definite result. */
-+ do
-+ status = get_next_alias (stream, NULL, result, buffer, buflen, errnop);
-+ while (status == NSS_STATUS_RETURN);
- }
-
- __libc_lock_unlock (lock);
-@@ -440,6 +410,7 @@ _nss_files_getaliasbyname_r (const char
- {
- /* Return next entry in host file. */
- enum nss_status status = NSS_STATUS_SUCCESS;
-+ FILE *stream = NULL;
-
- if (name == NULL)
- {
-@@ -447,11 +418,8 @@ _nss_files_getaliasbyname_r (const char
- return NSS_STATUS_UNAVAIL;
- }
-
-- __libc_lock_lock (lock);
--
-- /* Open the stream or rest it. */
-- status = internal_setent ();
-- last_use = getby;
-+ /* Open the stream. */
-+ status = internal_setent (&stream);
-
- if (status == NSS_STATUS_SUCCESS)
- {
-@@ -459,13 +427,11 @@ _nss_files_getaliasbyname_r (const char
-
- /* Read lines until we get a definite result. */
- do
-- status = get_next_alias (name, result, buffer, buflen, errnop);
-+ status = get_next_alias (stream, name, result, buffer, buflen, errnop);
- while (status == NSS_STATUS_RETURN);
- }
-
-- internal_endent ();
--
-- __libc_lock_unlock (lock);
-+ internal_endent (&stream);
-
- return status;
- }
-Index: glibc-2.21/nss/nss_files/files-hosts.c
-===================================================================
---- glibc-2.21.orig/nss/nss_files/files-hosts.c
-+++ glibc-2.21/nss/nss_files/files-hosts.c
-@@ -115,14 +115,13 @@ _nss_files_gethostbyname3_r (const char
- char *buffer, size_t buflen, int *errnop,
- int *herrnop, int32_t *ttlp, char **canonp)
- {
-+ FILE *stream = NULL;
- uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data);
- buffer += pad;
- buflen = buflen > pad ? buflen - pad : 0;
-
-- __libc_lock_lock (lock);
--
-- /* Reset file pointer to beginning or open file. */
-- enum nss_status status = internal_setent (keep_stream);
-+ /* Open file. */
-+ enum nss_status status = internal_setent (&stream);
-
- if (status == NSS_STATUS_SUCCESS)
- {
-@@ -130,10 +129,7 @@ _nss_files_gethostbyname3_r (const char
- addresses to IPv6 addresses really the right thing to do? */
- int flags = ((_res.options & RES_USE_INET6) ? AI_V4MAPPED : 0);
-
-- /* Tell getent function that we have repositioned the file pointer. */
-- last_use = getby;
--
-- while ((status = internal_getent (result, buffer, buflen, errnop,
-+ while ((status = internal_getent (stream, result, buffer, buflen, errnop,
- herrnop, af, flags))
- == NSS_STATUS_SUCCESS)
- {
-@@ -160,7 +156,7 @@ _nss_files_gethostbyname3_r (const char
- bufferend = (char *) &result->h_aliases[naliases + 1];
-
- again:
-- while ((status = internal_getent (&tmp_result_buf, tmp_buffer,
-+ while ((status = internal_getent (stream, &tmp_result_buf, tmp_buffer,
- tmp_buflen, errnop, herrnop, af,
- flags))
- == NSS_STATUS_SUCCESS)
-@@ -336,15 +332,12 @@ _nss_files_gethostbyname3_r (const char
- free (tmp_buffer);
- }
-
-- if (! keep_stream)
-- internal_endent ();
-+ internal_endent (&stream);
- }
-
- if (canonp && status == NSS_STATUS_SUCCESS)
- *canonp = result->h_name;
-
-- __libc_lock_unlock (lock);
--
- return status;
- }
-
-@@ -373,16 +366,13 @@ _nss_files_gethostbyname4_r (const char
- char *buffer, size_t buflen, int *errnop,
- int *herrnop, int32_t *ttlp)
- {
-- __libc_lock_lock (lock);
-+ FILE *stream = NULL;
-
-- /* Reset file pointer to beginning or open file. */
-- enum nss_status status = internal_setent (keep_stream);
-+ /* Open file. */
-+ enum nss_status status = internal_setent (&stream);
-
- if (status == NSS_STATUS_SUCCESS)
- {
-- /* Tell getent function that we have repositioned the file pointer. */
-- last_use = getby;
--
- bool any = false;
- bool got_canon = false;
- while (1)
-@@ -394,7 +384,7 @@ _nss_files_gethostbyname4_r (const char
- buflen = buflen > pad ? buflen - pad : 0;
-
- struct hostent result;
-- status = internal_getent (&result, buffer, buflen, errnop,
-+ status = internal_getent (stream, &result, buffer, buflen, errnop,
- herrnop, AF_UNSPEC, 0);
- if (status != NSS_STATUS_SUCCESS)
- break;
-@@ -470,8 +460,7 @@ _nss_files_gethostbyname4_r (const char
- status = NSS_STATUS_SUCCESS;
- }
-
-- if (! keep_stream)
-- internal_endent ();
-+ internal_endent (&stream);
- }
- else if (status == NSS_STATUS_TRYAGAIN)
- {
-@@ -484,7 +473,5 @@ _nss_files_gethostbyname4_r (const char
- *herrnop = NO_DATA;
- }
-
-- __libc_lock_unlock (lock);
--
- return status;
- }
diff --git a/o-tmpfile.patch b/o-tmpfile.patch
deleted file mode 100644
index b8e357e..0000000
--- a/o-tmpfile.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 127ffc81a8565bebd134c0f43afba5ae7997bf97 Mon Sep 17 00:00:00 2001
-From: Andreas Schwab
-Date: Sun, 1 Feb 2015 14:04:15 +0100
-Subject: [PATCH] Fix value of O_TMPFILE for architectures with non-default
- O_DIRECTORY
-
- [BZ #17912]
- * sysdeps/unix/sysv/linux/bits/fcntl-linux.h (__O_TMPFILE): Define
- in terms of __O_DIRECTORY.
----
- sysdeps/unix/sysv/linux/bits/fcntl-linux.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
-index 3d28c84..d2baeb3 100644
---- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
-+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
-@@ -97,7 +97,7 @@
- # define __O_DSYNC 010000
- #endif
- #ifndef __O_TMPFILE
--# define __O_TMPFILE 020200000
-+# define __O_TMPFILE (020000000 | __O_DIRECTORY)
- #endif
-
- #ifndef F_GETLK
---
-2.2.2
-
diff --git a/openat64-readd-o-largefile.patch b/openat64-readd-o-largefile.patch
new file mode 100644
index 0000000..5a5447a
--- /dev/null
+++ b/openat64-readd-o-largefile.patch
@@ -0,0 +1,16 @@
+Index: glibc-2.22/sysdeps/unix/sysv/linux/openat.c
+===================================================================
+--- glibc-2.22.orig/sysdeps/unix/sysv/linux/openat.c
++++ glibc-2.22/sysdeps/unix/sysv/linux/openat.c
+@@ -68,6 +68,11 @@ __OPENAT (int fd, const char *file, int
+ va_end (arg);
+ }
+
++ /* We have to add the O_LARGEFILE flag for openat64. */
++#ifdef MORE_OFLAGS
++ oflag |= MORE_OFLAGS;
++#endif
++
+ return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
+ }
+ libc_hidden_def (__OPENAT)
diff --git a/powerpc-software-sqrt.patch b/powerpc-software-sqrt.patch
deleted file mode 100644
index d86b73f..0000000
--- a/powerpc-software-sqrt.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-2015-02-13 Joseph Myers
-
- [BZ #17967]
- * sysdeps/powerpc/fpu/e_sqrtf.c (__slow_ieee754_sqrtf): Use
- __builtin_fmaf instead of relying on contraction of a * b + c.
-
-2015-02-12 Joseph Myers
-
- [BZ #17964]
- * sysdeps/powerpc/fpu/e_sqrt.c (__slow_ieee754_sqrt): Use
- __builtin_fma instead of relying on contraction of a * b + c.
-
-Index: glibc-2.21/sysdeps/powerpc/fpu/e_sqrt.c
-===================================================================
---- glibc-2.21.orig/sysdeps/powerpc/fpu/e_sqrt.c
-+++ glibc-2.21/sysdeps/powerpc/fpu/e_sqrt.c
-@@ -99,38 +99,41 @@ __slow_ieee754_sqrt (double x)
- /* Here we have three Newton-Raphson iterations each of a
- division and a square root and the remainder of the
- argument reduction, all interleaved. */
-- sd = -(sg * sg - sx);
-+ sd = -__builtin_fma (sg, sg, -sx);
- fsgi = (xi0 + 0x40000000) >> 1 & 0x7ff00000;
- sy2 = sy + sy;
-- sg = sy * sd + sg; /* 16-bit approximation to sqrt(sx). */
-+ sg = __builtin_fma (sy, sd, sg); /* 16-bit approximation to
-+ sqrt(sx). */
-
- /* schedule the INSERT_WORDS (fsg, fsgi, 0) to get separation
- between the store and the load. */
- INSERT_WORDS (fsg, fsgi, 0);
- iw_u.parts.msw = fsgi;
- iw_u.parts.lsw = (0);
-- e = -(sy * sg - almost_half);
-- sd = -(sg * sg - sx);
-+ e = -__builtin_fma (sy, sg, -almost_half);
-+ sd = -__builtin_fma (sg, sg, -sx);
- if ((xi0 & 0x7ff00000) == 0)
- goto denorm;
-- sy = sy + e * sy2;
-- sg = sg + sy * sd; /* 32-bit approximation to sqrt(sx). */
-+ sy = __builtin_fma (e, sy2, sy);
-+ sg = __builtin_fma (sy, sd, sg); /* 32-bit approximation to
-+ sqrt(sx). */
- sy2 = sy + sy;
- /* complete the INSERT_WORDS (fsg, fsgi, 0) operation. */
- fsg = iw_u.value;
-- e = -(sy * sg - almost_half);
-- sd = -(sg * sg - sx);
-- sy = sy + e * sy2;
-+ e = -__builtin_fma (sy, sg, -almost_half);
-+ sd = -__builtin_fma (sg, sg, -sx);
-+ sy = __builtin_fma (e, sy2, sy);
- shx = sx * fsg;
-- sg = sg + sy * sd; /* 64-bit approximation to sqrt(sx),
-- but perhaps rounded incorrectly. */
-+ sg = __builtin_fma (sy, sd, sg); /* 64-bit approximation to
-+ sqrt(sx), but perhaps
-+ rounded incorrectly. */
- sy2 = sy + sy;
- g = sg * fsg;
-- e = -(sy * sg - almost_half);
-- d = -(g * sg - shx);
-- sy = sy + e * sy2;
-+ e = -__builtin_fma (sy, sg, -almost_half);
-+ d = -__builtin_fma (g, sg, -shx);
-+ sy = __builtin_fma (e, sy2, sy);
- fesetenv_register (fe);
-- return g + sy * d;
-+ return __builtin_fma (sy, d, g);
- denorm:
- /* For denormalised numbers, we normalise, calculate the
- square root, and return an adjusted result. */
-Index: glibc-2.21/sysdeps/powerpc/fpu/e_sqrtf.c
-===================================================================
---- glibc-2.21.orig/sysdeps/powerpc/fpu/e_sqrtf.c
-+++ glibc-2.21/sysdeps/powerpc/fpu/e_sqrtf.c
-@@ -87,26 +87,28 @@ __slow_ieee754_sqrtf (float x)
- /* Here we have three Newton-Raphson iterations each of a
- division and a square root and the remainder of the
- argument reduction, all interleaved. */
-- sd = -(sg * sg - sx);
-+ sd = -__builtin_fmaf (sg, sg, -sx);
- fsgi = (xi + 0x40000000) >> 1 & 0x7f800000;
- sy2 = sy + sy;
-- sg = sy * sd + sg; /* 16-bit approximation to sqrt(sx). */
-- e = -(sy * sg - almost_half);
-+ sg = __builtin_fmaf (sy, sd, sg); /* 16-bit approximation to
-+ sqrt(sx). */
-+ e = -__builtin_fmaf (sy, sg, -almost_half);
- SET_FLOAT_WORD (fsg, fsgi);
-- sd = -(sg * sg - sx);
-- sy = sy + e * sy2;
-+ sd = -__builtin_fmaf (sg, sg, -sx);
-+ sy = __builtin_fmaf (e, sy2, sy);
- if ((xi & 0x7f800000) == 0)
- goto denorm;
- shx = sx * fsg;
-- sg = sg + sy * sd; /* 32-bit approximation to sqrt(sx),
-- but perhaps rounded incorrectly. */
-+ sg = __builtin_fmaf (sy, sd, sg); /* 32-bit approximation to
-+ sqrt(sx), but perhaps
-+ rounded incorrectly. */
- sy2 = sy + sy;
- g = sg * fsg;
-- e = -(sy * sg - almost_half);
-- d = -(g * sg - shx);
-- sy = sy + e * sy2;
-+ e = -__builtin_fmaf (sy, sg, -almost_half);
-+ d = -__builtin_fmaf (g, sg, -shx);
-+ sy = __builtin_fmaf (e, sy2, sy);
- fesetenv_register (fe);
-- return g + sy * d;
-+ return __builtin_fmaf (sy, d, g);
- denorm:
- /* For denormalised numbers, we normalise, calculate the
- square root, and return an adjusted result. */
diff --git a/pthread-join-deadlock.patch b/pthread-join-deadlock.patch
deleted file mode 100644
index 34c60d6..0000000
--- a/pthread-join-deadlock.patch
+++ /dev/null
@@ -1,152 +0,0 @@
- [PR dynamic-link/18457]
- * elf/dl-tls.c (tls_get_addr_tail): Don't take the rtld lock
- if we already have a final static TLS offset.
- * nptl/tst-join7.c, nptl/tst-join7mod.c: New.
-
-Index: glibc-2.21/elf/dl-tls.c
-===================================================================
---- glibc-2.21.orig/elf/dl-tls.c
-+++ glibc-2.21/elf/dl-tls.c
-@@ -755,30 +755,44 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t
- the_map = listp->slotinfo[idx].map;
- }
-
-- /* Make sure that, if a dlopen running in parallel forces the
-- variable into static storage, we'll wait until the address in the
-- static TLS block is set up, and use that. If we're undecided
-- yet, make sure we make the decision holding the lock as well. */
-- if (__glibc_unlikely (the_map->l_tls_offset
-- != FORCED_DYNAMIC_TLS_OFFSET))
-+ /* If the TLS block for the map is already assigned to dynamic or to
-+ static TLS, avoid the lock. Be careful to use the same value for
-+ both tests; if we reloaded it, the second test might mistake
-+ forced dynamic for an offset. Now, if the decision hasn't been
-+ made, take the rtld lock, so that an ongoing dlopen gets a chance
-+ to complete, and then retest; if the decision is still pending,
-+ force the module to dynamic TLS. */
-+ ptrdiff_t offset = atomic_load_relaxed (&the_map->l_tls_offset);
-+ if (__glibc_unlikely (offset != FORCED_DYNAMIC_TLS_OFFSET))
- {
-+ if (__glibc_unlikely (offset != NO_TLS_OFFSET))
-+ goto static_tls;
- __rtld_lock_lock_recursive (GL(dl_load_lock));
-- if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
-+ offset = the_map->l_tls_offset;
-+ if (__glibc_likely (offset == NO_TLS_OFFSET))
- {
- the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
-- else if (__glibc_likely (the_map->l_tls_offset
-- != FORCED_DYNAMIC_TLS_OFFSET))
-+ else if (__glibc_likely (offset != FORCED_DYNAMIC_TLS_OFFSET))
- {
-+ /* The decision is made, and it is final. We use the value
-+ we've already loaded, but we could even load the offset
-+ after releasing the lock, since it won't change. Should
-+ the module be released while another thread references
-+ one of its TLS variables, that's undefined behavior. */
-+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
-+
-+ static_tls:
-+ ;
-+
- #if TLS_TCB_AT_TP
-- void *p = (char *) THREAD_SELF - the_map->l_tls_offset;
-+ void *p = (char *) THREAD_SELF - offset;
- #elif TLS_DTV_AT_TP
-- void *p = (char *) THREAD_SELF + the_map->l_tls_offset + TLS_PRE_TCB_SIZE;
-+ void *p = (char *) THREAD_SELF + offset + TLS_PRE_TCB_SIZE;
- #else
- # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
- #endif
-- __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
- dtv[GET_ADDR_MODULE].pointer.is_static = true;
- dtv[GET_ADDR_MODULE].pointer.val = p;
-Index: glibc-2.21/nptl/Makefile
-===================================================================
---- glibc-2.21.orig/nptl/Makefile
-+++ glibc-2.21/nptl/Makefile
-@@ -234,7 +234,7 @@ tests = tst-typesizes \
- tst-basic7 \
- tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \
- tst-raise1 \
-- tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 tst-join6 \
-+ tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 tst-join6 tst-join7 \
- tst-detach1 \
- tst-eintr1 tst-eintr2 tst-eintr3 tst-eintr4 tst-eintr5 \
- tst-tsd1 tst-tsd2 tst-tsd3 tst-tsd4 tst-tsd5 tst-tsd6 \
-@@ -312,7 +312,8 @@ endif
- modules-names = tst-atfork2mod tst-tls3mod tst-tls4moda tst-tls4modb \
- tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \
- tst-tls5modd tst-tls5mode tst-tls5modf tst-stack4mod \
-- tst-_res1mod1 tst-_res1mod2 tst-execstack-mod tst-fini1mod
-+ tst-_res1mod1 tst-_res1mod2 tst-execstack-mod tst-fini1mod \
-+ tst-join7mod
- extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) tst-cleanup4aux.o
- test-extras += $(modules-names) tst-cleanup4aux
- test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
-@@ -517,6 +518,11 @@ $(objpfx)tst-tls6.out: tst-tls6.sh $(obj
- $(evaluate-test)
- endif
-
-+$(objpfx)tst-join7: $(libdl) $(shared-thread-library)
-+$(objpfx)tst-join7.out: $(objpfx)tst-join7mod.so
-+$(objpfx)tst-join7mod.so: $(shared-thread-library)
-+LDFLAGS-tst-join7mod.so = -Wl,-soname,tst-join7mod.so
-+
- $(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library)
-
- $(objpfx)tst-fini1: $(shared-thread-library) $(objpfx)tst-fini1mod.so
-Index: glibc-2.21/nptl/tst-join7.c
-===================================================================
---- /dev/null
-+++ glibc-2.21/nptl/tst-join7.c
-@@ -0,0 +1,12 @@
-+#include
-+
-+int
-+do_test (void)
-+{
-+ void *f = dlopen ("tst-join7mod.so", RTLD_NOW | RTLD_GLOBAL);
-+ if (f) dlclose (f); else return 1;
-+ return 0;
-+}
-+
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
-Index: glibc-2.21/nptl/tst-join7mod.c
-===================================================================
---- /dev/null
-+++ glibc-2.21/nptl/tst-join7mod.c
-@@ -0,0 +1,29 @@
-+#include
-+#include
-+
-+static pthread_t th;
-+static int running = 1;
-+
-+static void *
-+test_run (void *p)
-+{
-+ while (running)
-+ fprintf (stderr, "XXX test_run\n");
-+ fprintf (stderr, "XXX test_run FINISHED\n");
-+ return NULL;
-+}
-+
-+static void __attribute__ ((constructor))
-+do_init (void)
-+{
-+ pthread_create (&th, NULL, test_run, NULL);
-+}
-+
-+static void __attribute__ ((destructor))
-+do_end (void)
-+{
-+ running = 0;
-+ fprintf (stderr, "thread_join...\n");
-+ pthread_join (th, NULL);
-+ fprintf (stderr, "thread_join DONE\n");
-+}
diff --git a/pthread-mutexattr-gettype-kind.patch b/pthread-mutexattr-gettype-kind.patch
deleted file mode 100644
index 0af5da6..0000000
--- a/pthread-mutexattr-gettype-kind.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From 867dbf6ba31c0a0f5c0366f9ed71b0afc3727a23 Mon Sep 17 00:00:00 2001
-From: Andreas Schwab
-Date: Mon, 11 Aug 2014 11:18:26 +0200
-Subject: [PATCH] Filter out PTHREAD_MUTEX_NO_ELISION_NP bit in
- pthread_mutexattr_gettype (BZ #15790)
-
- [BZ #15790]
- * nptl/pthread_mutexattr_gettype.c (pthread_mutexattr_gettype):
- Filter out PTHREAD_MUTEX_NO_ELISION_NP from value returned in
- kind.
- * nptl/Makefile (tests): Add tst-pthread-mutexattr.
- * nptl/tst-pthread-mutexattr.c: New file.
----
- nptl/Makefile | 2 +-
- nptl/pthread_mutexattr_gettype.c | 3 +-
- nptl/tst-pthread-mutexattr.c | 60 ++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 63 insertions(+), 2 deletions(-)
- create mode 100644 nptl/tst-pthread-mutexattr.c
-
-Index: glibc-2.19/nptl/Makefile
-===================================================================
---- glibc-2.19.orig/nptl/Makefile
-+++ glibc-2.19/nptl/Makefile
-@@ -253,7 +253,7 @@ tests = tst-typesizes \
- tst-exit1 tst-exit2 tst-exit3 \
- tst-stdio1 tst-stdio2 \
- tst-stack1 tst-stack2 tst-stack3 tst-stack4 tst-pthread-getattr \
-- tst-pthread-attr-affinity \
-+ tst-pthread-attr-affinity tst-pthread-mutexattr \
- tst-unload \
- tst-dlsym1 \
- tst-sysconf \
-Index: glibc-2.19/nptl/pthread_mutexattr_gettype.c
-===================================================================
---- glibc-2.19.orig/nptl/pthread_mutexattr_gettype.c
-+++ glibc-2.19/nptl/pthread_mutexattr_gettype.c
-@@ -28,7 +28,8 @@ pthread_mutexattr_gettype (attr, kind)
-
- iattr = (const struct pthread_mutexattr *) attr;
-
-- *kind = iattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS;
-+ *kind = (iattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS
-+ & ~PTHREAD_MUTEX_NO_ELISION_NP);
-
- return 0;
- }
-Index: glibc-2.19/nptl/tst-pthread-mutexattr.c
-===================================================================
---- /dev/null
-+++ glibc-2.19/nptl/tst-pthread-mutexattr.c
-@@ -0,0 +1,60 @@
-+/* Make sure that pthread_mutexattr_gettype returns a valid kind.
-+
-+ Copyright (C) 2014 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, see
-+ . */
-+
-+#include
-+#include
-+#include
-+
-+static int
-+do_test (void)
-+{
-+ pthread_mutexattr_t attr;
-+ int kind;
-+ int error;
-+
-+ error = pthread_mutexattr_init (&attr);
-+ if (error)
-+ {
-+ printf ("pthread_mutexattr_init: %s\n", strerror (error));
-+ return 1;
-+ }
-+ error = pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_DEFAULT);
-+ if (error)
-+ {
-+ printf ("pthread_mutexattr_settype (1): %s\n", strerror (error));
-+ return 1;
-+ }
-+ error = pthread_mutexattr_gettype (&attr, &kind);
-+ if (error)
-+ {
-+ printf ("pthread_mutexattr_gettype: %s\n", strerror (error));
-+ return 1;
-+ }
-+ error = pthread_mutexattr_settype (&attr, kind);
-+ if (error)
-+ {
-+ printf ("pthread_mutexattr_settype (2): %s\n", strerror (error));
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
diff --git a/resolv-nameserver-handling.patch b/resolv-nameserver-handling.patch
deleted file mode 100644
index 9bc0e78..0000000
--- a/resolv-nameserver-handling.patch
+++ /dev/null
@@ -1,426 +0,0 @@
-From 6c07233f12e00b9cf66fb5d4a9b7ddb897590912 Mon Sep 17 00:00:00 2001
-From: Andreas Schwab
-Date: Thu, 19 Feb 2015 15:52:08 +0100
-Subject: [PATCH] Simplify handling of nameserver configuration in resolver
-
- [BZ #13028]
- [BZ #17053]
- * resolv/res_init.c (__res_vinit): Remove use of ext.nsmap.
- * resolv/res_send.c (__libc_res_nsend): Likewise.
- (get_nsaddr): New function.
- (res_ourserver_p, send_vc, reopen): Use it instead of accessing
- statp directly.
----
- resolv/res_init.c | 47 +++++-----------
- resolv/res_send.c | 164 +++++++++++++++++++++++-------------------------------
- 2 files changed, 84 insertions(+), 127 deletions(-)
-
-diff --git a/resolv/res_init.c b/resolv/res_init.c
-index 553ba12..66561ff 100644
---- a/resolv/res_init.c
-+++ b/resolv/res_init.c
-@@ -153,10 +153,8 @@ __res_vinit(res_state statp, int preinit) {
- char *cp, **pp;
- int n;
- char buf[BUFSIZ];
-- int nserv = 0; /* number of IPv4 nameservers read from file */
--#ifdef _LIBC
-- int nservall = 0; /* number of (IPv4 + IPV6) nameservers read from file */
--#endif
-+ int nserv = 0; /* number of nameservers read from file */
-+ int have_serv6 = 0;
- int haveenv = 0;
- int havesearch = 0;
- #ifdef RESOLVSORT
-@@ -184,15 +182,9 @@ __res_vinit(res_state statp, int preinit) {
- statp->_flags = 0;
- statp->qhook = NULL;
- statp->rhook = NULL;
-- statp->_u._ext.nsinit = 0;
- statp->_u._ext.nscount = 0;
--#ifdef _LIBC
-- statp->_u._ext.nscount6 = 0;
-- for (n = 0; n < MAXNS; n++) {
-- statp->_u._ext.nsaddrs[n] = NULL;
-- statp->_u._ext.nsmap[n] = MAXNS;
-- }
--#endif
-+ for (n = 0; n < MAXNS; n++)
-+ statp->_u._ext.nsaddrs[n] = NULL;
-
- /* Allow user to override the local domain definition */
- if ((cp = getenv("LOCALDOMAIN")) != NULL) {
-@@ -296,11 +288,7 @@ __res_vinit(res_state statp, int preinit) {
- continue;
- }
- /* read nameservers to query */
--#ifdef _LIBC
-- if (MATCH(buf, "nameserver") && nservall < MAXNS) {
--#else
- if (MATCH(buf, "nameserver") && nserv < MAXNS) {
--#endif
- struct in_addr a;
-
- cp = buf + sizeof("nameserver") - 1;
-@@ -308,13 +296,12 @@ __res_vinit(res_state statp, int preinit) {
- cp++;
- if ((*cp != '\0') && (*cp != '\n')
- && __inet_aton(cp, &a)) {
-- statp->nsaddr_list[nservall].sin_addr = a;
-- statp->nsaddr_list[nservall].sin_family = AF_INET;
-- statp->nsaddr_list[nservall].sin_port =
-+ statp->nsaddr_list[nserv].sin_addr = a;
-+ statp->nsaddr_list[nserv].sin_family = AF_INET;
-+ statp->nsaddr_list[nserv].sin_port =
- htons(NAMESERVER_PORT);
- nserv++;
- #ifdef _LIBC
-- nservall++;
- } else {
- struct in6_addr a6;
- char *el;
-@@ -356,10 +343,11 @@ __res_vinit(res_state statp, int preinit) {
- }
- }
-
-- statp->_u._ext.nsaddrs[nservall] = sa6;
-- statp->_u._ext.nssocks[nservall] = -1;
-- statp->_u._ext.nsmap[nservall] = MAXNS + 1;
-- nservall++;
-+ statp->nsaddr_list[nserv].sin_family = 0;
-+ statp->_u._ext.nsaddrs[nserv] = sa6;
-+ statp->_u._ext.nssocks[nserv] = -1;
-+ have_serv6 = 1;
-+ nserv++;
- }
- }
- #endif
-@@ -414,10 +402,9 @@ __res_vinit(res_state statp, int preinit) {
- continue;
- }
- }
-- statp->nscount = nservall;
-+ statp->nscount = nserv;
- #ifdef _LIBC
-- if (nservall - nserv > 0) {
-- statp->_u._ext.nscount6 = nservall - nserv;
-+ if (have_serv6) {
- /* We try IPv6 servers again. */
- statp->ipv6_unavail = false;
- }
-@@ -606,11 +593,7 @@ __res_iclose(res_state statp, bool free_addr) {
- statp->_vcsock = -1;
- statp->_flags &= ~(RES_F_VC | RES_F_CONN);
- }
--#ifdef _LIBC
-- for (ns = 0; ns < MAXNS; ns++)
--#else
- for (ns = 0; ns < statp->_u._ext.nscount; ns++)
--#endif
- if (statp->_u._ext.nsaddrs[ns]) {
- if (statp->_u._ext.nssocks[ns] != -1) {
- close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);
-@@ -621,8 +604,6 @@ __res_iclose(res_state statp, bool free_addr) {
- statp->_u._ext.nsaddrs[ns] = NULL;
- }
- }
-- if (free_addr)
-- statp->_u._ext.nsinit = 0;
- }
- libc_hidden_def (__res_iclose)
-
-diff --git a/resolv/res_send.c b/resolv/res_send.c
-index c35fb66..5e53cc2 100644
---- a/resolv/res_send.c
-+++ b/resolv/res_send.c
-@@ -184,6 +184,7 @@ evNowTime(struct timespec *res) {
-
- /* Forward. */
-
-+static struct sockaddr *get_nsaddr (res_state, int);
- static int send_vc(res_state, const u_char *, int,
- const u_char *, int,
- u_char **, int *, int *, int, u_char **,
-@@ -221,20 +222,21 @@ res_ourserver_p(const res_state statp, const struct sockaddr_in6 *inp)
- in_port_t port = in4p->sin_port;
- in_addr_t addr = in4p->sin_addr.s_addr;
-
-- for (ns = 0; ns < MAXNS; ns++) {
-+ for (ns = 0; ns < statp->nscount; ns++) {
- const struct sockaddr_in *srv =
-- (struct sockaddr_in *)EXT(statp).nsaddrs[ns];
-+ (struct sockaddr_in *) get_nsaddr (statp, ns);
-
-- if ((srv != NULL) && (srv->sin_family == AF_INET) &&
-+ if ((srv->sin_family == AF_INET) &&
- (srv->sin_port == port) &&
- (srv->sin_addr.s_addr == INADDR_ANY ||
- srv->sin_addr.s_addr == addr))
- return (1);
- }
- } else if (inp->sin6_family == AF_INET6) {
-- for (ns = 0; ns < MAXNS; ns++) {
-- const struct sockaddr_in6 *srv = EXT(statp).nsaddrs[ns];
-- if ((srv != NULL) && (srv->sin6_family == AF_INET6) &&
-+ for (ns = 0; ns < statp->nscount; ns++) {
-+ const struct sockaddr_in6 *srv
-+ = (struct sockaddr_in6 *) get_nsaddr (statp, ns);
-+ if ((srv->sin6_family == AF_INET6) &&
- (srv->sin6_port == inp->sin6_port) &&
- !(memcmp(&srv->sin6_addr, &in6addr_any,
- sizeof (struct in6_addr)) &&
-@@ -384,80 +386,48 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
- * If the ns_addr_list in the resolver context has changed, then
- * invalidate our cached copy and the associated timing data.
- */
-- if (EXT(statp).nsinit) {
-+ if (EXT(statp).nscount != 0) {
- int needclose = 0;
-
- if (EXT(statp).nscount != statp->nscount)
- needclose++;
- else
-- for (ns = 0; ns < MAXNS; ns++) {
-- unsigned int map = EXT(statp).nsmap[ns];
-- if (map < MAXNS
-+ for (ns = 0; ns < statp->nscount; ns++) {
-+ if (statp->nsaddr_list[ns].sin_family != 0
- && !sock_eq((struct sockaddr_in6 *)
-- &statp->nsaddr_list[map],
-+ &statp->nsaddr_list[ns],
- EXT(statp).nsaddrs[ns]))
- {
- needclose++;
- break;
- }
- }
-- if (needclose)
-+ if (needclose) {
- __res_iclose(statp, false);
-+ EXT(statp).nscount = 0;
-+ }
- }
-
- /*
- * Maybe initialize our private copy of the ns_addr_list.
- */
-- if (EXT(statp).nsinit == 0) {
-- unsigned char map[MAXNS];
--
-- memset (map, MAXNS, sizeof (map));
-- for (n = 0; n < MAXNS; n++) {
-- ns = EXT(statp).nsmap[n];
-- if (ns < statp->nscount)
-- map[ns] = n;
-- else if (ns < MAXNS) {
-- free(EXT(statp).nsaddrs[n]);
-- EXT(statp).nsaddrs[n] = NULL;
-- EXT(statp).nsmap[n] = MAXNS;
-- }
-- }
-- n = statp->nscount;
-- if (statp->nscount > EXT(statp).nscount)
-- for (n = EXT(statp).nscount, ns = 0;
-- n < statp->nscount; n++) {
-- while (ns < MAXNS
-- && EXT(statp).nsmap[ns] != MAXNS)
-- ns++;
-- if (ns == MAXNS)
-- break;
-- /* NS never exceeds MAXNS, but gcc 4.9 somehow
-- does not see this. */
-- DIAG_PUSH_NEEDS_COMMENT;
-- DIAG_IGNORE_NEEDS_COMMENT (4.9,
-- "-Warray-bounds");
-- EXT(statp).nsmap[ns] = n;
-- DIAG_POP_NEEDS_COMMENT;
-- map[n] = ns++;
-- }
-- EXT(statp).nscount = n;
-- for (ns = 0; ns < EXT(statp).nscount; ns++) {
-- n = map[ns];
-- if (EXT(statp).nsaddrs[n] == NULL)
-- EXT(statp).nsaddrs[n] =
-+ if (EXT(statp).nscount == 0) {
-+ for (ns = 0; ns < statp->nscount; ns++) {
-+ EXT(statp).nssocks[ns] = -1;
-+ if (statp->nsaddr_list[ns].sin_family == 0)
-+ continue;
-+ if (EXT(statp).nsaddrs[ns] == NULL)
-+ EXT(statp).nsaddrs[ns] =
- malloc(sizeof (struct sockaddr_in6));
-- if (EXT(statp).nsaddrs[n] != NULL) {
-- memset (mempcpy(EXT(statp).nsaddrs[n],
-+ if (EXT(statp).nsaddrs[ns] != NULL)
-+ memset (mempcpy(EXT(statp).nsaddrs[ns],
- &statp->nsaddr_list[ns],
- sizeof (struct sockaddr_in)),
- '\0',
- sizeof (struct sockaddr_in6)
- - sizeof (struct sockaddr_in));
-- EXT(statp).nssocks[n] = -1;
-- n++;
-- }
- }
-- EXT(statp).nsinit = 1;
-+ EXT(statp).nscount = statp->nscount;
- }
-
- /*
-@@ -466,44 +436,37 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
- */
- if (__builtin_expect ((statp->options & RES_ROTATE) != 0, 0) &&
- (statp->options & RES_BLAST) == 0) {
-- struct sockaddr_in6 *ina;
-- unsigned int map;
--
-- n = 0;
-- while (n < MAXNS && EXT(statp).nsmap[n] == MAXNS)
-- n++;
-- if (n < MAXNS) {
-- ina = EXT(statp).nsaddrs[n];
-- map = EXT(statp).nsmap[n];
-- for (;;) {
-- ns = n + 1;
-- while (ns < MAXNS
-- && EXT(statp).nsmap[ns] == MAXNS)
-- ns++;
-- if (ns == MAXNS)
-- break;
-- EXT(statp).nsaddrs[n] = EXT(statp).nsaddrs[ns];
-- EXT(statp).nsmap[n] = EXT(statp).nsmap[ns];
-- n = ns;
-- }
-- EXT(statp).nsaddrs[n] = ina;
-- EXT(statp).nsmap[n] = map;
-+ struct sockaddr_in ina;
-+ struct sockaddr_in6 *inp;
-+ int lastns = statp->nscount - 1;
-+ int fd;
-+
-+ inp = EXT(statp).nsaddrs[0];
-+ ina = statp->nsaddr_list[0];
-+ fd = EXT(statp).nssocks[0];
-+ for (ns = 0; ns < lastns; ns++) {
-+ EXT(statp).nsaddrs[ns] = EXT(statp).nsaddrs[ns + 1];
-+ statp->nsaddr_list[ns] = statp->nsaddr_list[ns + 1];
-+ EXT(statp).nssocks[ns] = EXT(statp).nssocks[ns + 1];
- }
-+ EXT(statp).nsaddrs[lastns] = inp;
-+ statp->nsaddr_list[lastns] = ina;
-+ EXT(statp).nssocks[lastns] = fd;
- }
-
- /*
- * Send request, RETRY times, or until successful.
- */
- for (try = 0; try < statp->retry; try++) {
-- for (ns = 0; ns < MAXNS; ns++)
-+ for (ns = 0; ns < statp->nscount; ns++)
- {
- #ifdef DEBUG
- char tmpbuf[40];
- #endif
-- struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
-+#if defined USE_HOOKS || defined DEBUG
-+ struct sockaddr *nsap = get_nsaddr (statp, ns);
-+#endif
-
-- if (nsap == NULL)
-- goto next_ns;
- same_ns:
- #ifdef USE_HOOKS
- if (__glibc_unlikely (statp->qhook != NULL)) {
-@@ -542,9 +505,9 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen,
-
- Dprint(statp->options & RES_DEBUG,
- (stdout, ";; Querying server (# %d) address = %s\n",
-- ns + 1, inet_ntop(nsap->sin6_family,
-- (nsap->sin6_family == AF_INET6
-- ? &nsap->sin6_addr
-+ ns + 1, inet_ntop(nsap->sa_family,
-+ (nsap->sa_family == AF_INET6
-+ ? &((struct sockaddr_in6 *) nsap)->sin6_addr
- : &((struct sockaddr_in *) nsap)->sin_addr),
- tmpbuf, sizeof (tmpbuf))));
-
-@@ -660,6 +623,21 @@ libresolv_hidden_def (res_nsend)
-
- /* Private */
-
-+static struct sockaddr *
-+get_nsaddr (res_state statp, int n)
-+{
-+
-+ if (statp->nsaddr_list[n].sin_family == 0 && EXT(statp).nsaddrs[n] != NULL)
-+ /* EXT(statp).nsaddrs[n] holds an address that is larger than
-+ struct sockaddr, and user code did not update
-+ statp->nsaddr_list[n]. */
-+ return (struct sockaddr *) EXT(statp).nsaddrs[n];
-+ else
-+ /* User code updated statp->nsaddr_list[n], or statp->nsaddr_list[n]
-+ has the same content as EXT(statp).nsaddrs[n]. */
-+ return (struct sockaddr *) (void *) &statp->nsaddr_list[n];
-+}
-+
- static int
- send_vc(res_state statp,
- const u_char *buf, int buflen, const u_char *buf2, int buflen2,
-@@ -674,7 +652,7 @@ send_vc(res_state statp,
- // XXX REMOVE
- // int anssiz = *anssizp;
- HEADER *anhp = (HEADER *) ans;
-- struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
-+ struct sockaddr *nsap = get_nsaddr (statp, ns);
- int truncating, connreset, n;
- /* On some architectures compiler might emit a warning indicating
- 'resplen' may be used uninitialized. However if buf2 == NULL
-@@ -711,8 +689,8 @@ send_vc(res_state statp,
-
- if (getpeername(statp->_vcsock,
- (struct sockaddr *)&peer, &size) < 0 ||
-- !sock_eq(&peer, nsap)) {
-- __res_iclose(statp, false);
-+ !sock_eq(&peer, (struct sockaddr_in6 *) nsap)) {
-+ __res_iclose(statp, false);
- statp->_flags &= ~RES_F_VC;
- }
- }
-@@ -721,20 +699,19 @@ send_vc(res_state statp,
- if (statp->_vcsock >= 0)
- __res_iclose(statp, false);
-
-- statp->_vcsock = socket(nsap->sin6_family, SOCK_STREAM, 0);
-+ statp->_vcsock = socket(nsap->sa_family, SOCK_STREAM, 0);
- if (statp->_vcsock < 0) {
- *terrno = errno;
- Perror(statp, stderr, "socket(vc)", errno);
- return (-1);
- }
- __set_errno (0);
-- if (connect(statp->_vcsock, (struct sockaddr *)nsap,
-- nsap->sin6_family == AF_INET
-+ if (connect(statp->_vcsock, nsap,
-+ nsap->sa_family == AF_INET
- ? sizeof (struct sockaddr_in)
- : sizeof (struct sockaddr_in6)) < 0) {
- *terrno = errno;
-- Aerror(statp, stderr, "connect/vc", errno,
-- (struct sockaddr *) nsap);
-+ Aerror(statp, stderr, "connect/vc", errno, nsap);
- __res_iclose(statp, false);
- return (0);
- }
-@@ -945,8 +922,7 @@ static int
- reopen (res_state statp, int *terrno, int ns)
- {
- if (EXT(statp).nssocks[ns] == -1) {
-- struct sockaddr *nsap
-- = (struct sockaddr *) EXT(statp).nsaddrs[ns];
-+ struct sockaddr *nsap = get_nsaddr (statp, ns);
- socklen_t slen;
-
- /* only try IPv6 if IPv6 NS and if not failed before */
---
-2.3.2
-
diff --git a/static-tls-dtv-limit.patch b/static-tls-dtv-limit.patch
deleted file mode 100644
index 209153f..0000000
--- a/static-tls-dtv-limit.patch
+++ /dev/null
@@ -1,641 +0,0 @@
-2015-03-17 Alexandre Oliva
-
- [BZ #17090]
- [BZ #17620]
- [BZ #17621]
- [BZ #17628]
- * NEWS: Update.
- * elf/dl-tls.c (_dl_update_slotinfo): Clean up outdated DTV
- entries with Static TLS too. Skip entries past the end of the
- allocated DTV, from Alan Modra.
- (tls_get_addr_tail): Update to glibc_likely/unlikely. Move
- Static TLS DTV entry set up from...
- (_dl_allocate_tls_init): ... here (fix modid assertion), ...
- * elf/dl-reloc.c (_dl_nothread_init_static_tls): ... here...
- * nptl/allocatestack.c (init_one_static_tls): ... and here...
- * elf/dlopen.c (dl_open_worker): Drop l_tls_modid upper bound
- for Static TLS.
- * elf/tlsdeschtab.h (map_generation): Return size_t. Check
- that the slot we find is associated with the given map before
- using its generation count.
- * nptl_db/db_info.c: Include ldsodefs.h.
- (rtld_global, dtv_slotinfo_list, dtv_slotinfo): New typedefs.
- * nptl_db/structs.def (DB_RTLD_VARIABLE): New macro.
- (DB_MAIN_VARIABLE, DB_RTLD_GLOBAL_FIELD): Likewise.
- (link_map::l_tls_offset): New struct field.
- (dtv_t::counter): Likewise.
- (rtld_global): New struct.
- (_rtld_global): New rtld variable.
- (dl_tls_dtv_slotinfo_list): New rtld global field.
- (dtv_slotinfo_list): New struct.
- (dtv_slotinfo): Likewise.
- * nptl_db/td_symbol_list.c: Drop gnu/lib-names.h include.
- (td_lookup): Rename to...
- (td_mod_lookup): ... this. Use new mod parameter instead of
- LIBPTHREAD_SO.
- * nptl_db/td_thr_tlsbase.c: Include link.h.
- (dtv_slotinfo_list, dtv_slotinfo): New functions.
- (td_thr_tlsbase): Check DTV generation. Compute Static TLS
- addresses even if the DTV is out of date or missing them.
- * nptl_db/fetch-value.c (_td_locate_field): Do not refuse to
- index zero-length arrays.
- * nptl_db/thread_dbP.h: Include gnu/lib-names.h.
- (td_lookup): Make it a macro implemented in terms of...
- (td_mod_lookup): ... this declaration.
- * nptl_db/db-symbols.awk (DB_RTLD_VARIABLE): Override.
- (DB_MAIN_VARIABLE): Likewise.
-
-Index: glibc-2.21/elf/dl-open.c
-===================================================================
---- glibc-2.21.orig/elf/dl-open.c
-+++ glibc-2.21/elf/dl-open.c
-@@ -533,17 +533,7 @@ TLS generation counter wrapped! Please
- && 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"));
--
-+ now, but we can delay updating the DTV. */
- imap->l_need_tls_init = 0;
- #ifdef SHARED
- /* Update the slot information data for at least the
-Index: glibc-2.21/elf/dl-reloc.c
-===================================================================
---- glibc-2.21.orig/elf/dl-reloc.c
-+++ glibc-2.21/elf/dl-reloc.c
-@@ -136,12 +136,6 @@ _dl_nothread_init_static_tls (struct lin
- # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
- #endif
-
-- /* Fill in the DTV slot so that a later LD/GD access will find it. */
-- dtv_t *dtv = THREAD_DTV ();
-- assert (map->l_tls_modid <= dtv[-1].counter);
-- dtv[map->l_tls_modid].pointer.val = dest;
-- dtv[map->l_tls_modid].pointer.is_static = true;
--
- /* Initialize the memory. */
- memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
- '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
-Index: glibc-2.21/elf/dl-tls.c
-===================================================================
---- glibc-2.21.orig/elf/dl-tls.c
-+++ glibc-2.21/elf/dl-tls.c
-@@ -493,17 +493,14 @@ _dl_allocate_tls_init (void *result)
- assert (listp->slotinfo[cnt].gen <= GL(dl_tls_generation));
- maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
-
-+ dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED;
-+ dtv[map->l_tls_modid].pointer.is_static = false;
-+
- if (map->l_tls_offset == NO_TLS_OFFSET
- || map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET)
-- {
-- /* For dynamically loaded modules we simply store
-- the value indicating deferred allocation. */
-- dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED;
-- dtv[map->l_tls_modid].pointer.is_static = false;
-- continue;
-- }
-+ continue;
-
-- assert (map->l_tls_modid == cnt);
-+ assert (map->l_tls_modid == total + cnt);
- assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
- #if TLS_TCB_AT_TP
- assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
-@@ -515,8 +512,6 @@ _dl_allocate_tls_init (void *result)
- #endif
-
- /* Copy the initialization image and clear the BSS part. */
-- dtv[map->l_tls_modid].pointer.val = dest;
-- dtv[map->l_tls_modid].pointer.is_static = true;
- memset (__mempcpy (dest, map->l_tls_initimage,
- map->l_tls_initimage_size), '\0',
- map->l_tls_blocksize - map->l_tls_initimage_size);
-@@ -679,13 +674,16 @@ _dl_update_slotinfo (unsigned long int r
- struct link_map *map = listp->slotinfo[cnt].map;
- if (map == NULL)
- {
-- /* If this modid was used at some point the memory
-- might still be allocated. */
-- if (! dtv[total + cnt].pointer.is_static
-- && dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED)
-+ if (dtv[-1].counter >= total + cnt)
- {
-- free (dtv[total + cnt].pointer.val);
-+ /* If this modid was used at some point the memory
-+ might still be allocated. */
-+ if (! dtv[total + cnt].pointer.is_static
-+ && (dtv[total + cnt].pointer.val
-+ != TLS_DTV_UNALLOCATED))
-+ free (dtv[total + cnt].pointer.val);
- dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
-+ dtv[total + cnt].pointer.is_static = false;
- }
-
- continue;
-@@ -718,10 +716,8 @@ _dl_update_slotinfo (unsigned long int r
- memalign and not malloc. */
- free (dtv[modid].pointer.val);
-
-- /* This module is loaded dynamically- We defer memory
-- allocation. */
-- dtv[modid].pointer.is_static = false;
- dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
-+ dtv[modid].pointer.is_static = false;
-
- if (modid == req_modid)
- the_map = map;
-@@ -759,13 +755,12 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t
- the_map = listp->slotinfo[idx].map;
- }
-
-- again:
- /* Make sure that, if a dlopen running in parallel forces the
- variable into static storage, we'll wait until the address in the
- static TLS block is set up, and use that. If we're undecided
- yet, make sure we make the decision holding the lock as well. */
-- if (__builtin_expect (the_map->l_tls_offset
-- != FORCED_DYNAMIC_TLS_OFFSET, 0))
-+ if (__glibc_unlikely (the_map->l_tls_offset
-+ != FORCED_DYNAMIC_TLS_OFFSET))
- {
- __rtld_lock_lock_recursive (GL(dl_load_lock));
- if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
-@@ -773,22 +768,28 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t
- the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
-- else
-+ else if (__glibc_likely (the_map->l_tls_offset
-+ != FORCED_DYNAMIC_TLS_OFFSET))
- {
-+#if TLS_TCB_AT_TP
-+ void *p = (char *) THREAD_SELF - the_map->l_tls_offset;
-+#elif TLS_DTV_AT_TP
-+ void *p = (char *) THREAD_SELF + the_map->l_tls_offset + TLS_PRE_TCB_SIZE;
-+#else
-+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-+#endif
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
-- if (__builtin_expect (the_map->l_tls_offset
-- != FORCED_DYNAMIC_TLS_OFFSET, 1))
-- {
-- void *p = dtv[GET_ADDR_MODULE].pointer.val;
-- if (__glibc_unlikely (p == TLS_DTV_UNALLOCATED))
-- goto again;
-
-- return (char *) p + GET_ADDR_OFFSET;
-- }
-+ dtv[GET_ADDR_MODULE].pointer.is_static = true;
-+ dtv[GET_ADDR_MODULE].pointer.val = p;
-+
-+ return (char *) p + GET_ADDR_OFFSET;
- }
-+ else
-+ __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
- void *p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map);
-- dtv[GET_ADDR_MODULE].pointer.is_static = false;
-+ assert (!dtv[GET_ADDR_MODULE].pointer.is_static);
-
- return (char *) p + GET_ADDR_OFFSET;
- }
-Index: glibc-2.21/elf/tlsdeschtab.h
-===================================================================
---- glibc-2.21.orig/elf/tlsdeschtab.h
-+++ glibc-2.21/elf/tlsdeschtab.h
-@@ -42,7 +42,7 @@ eq_tlsdesc (void *p, void *q)
- return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset;
- }
-
--inline static int
-+inline static size_t
- map_generation (struct link_map *map)
- {
- size_t idx = map->l_tls_modid;
-@@ -58,7 +58,7 @@ map_generation (struct link_map *map)
- we can assume that, if the generation count is zero, we
- still haven't determined the generation count for this
- module. */
-- if (listp->slotinfo[idx].gen)
-+ if (listp->slotinfo[idx].map == map && listp->slotinfo[idx].gen)
- return listp->slotinfo[idx].gen;
- else
- break;
-Index: glibc-2.21/nptl/allocatestack.c
-===================================================================
---- glibc-2.21.orig/nptl/allocatestack.c
-+++ glibc-2.21/nptl/allocatestack.c
-@@ -1190,7 +1190,6 @@ __nptl_setxid (struct xid_command *cmdp)
- static inline void __attribute__((always_inline))
- init_one_static_tls (struct pthread *curp, struct link_map *map)
- {
-- dtv_t *dtv = GET_DTV (TLS_TPADJ (curp));
- # if TLS_TCB_AT_TP
- void *dest = (char *) curp - map->l_tls_offset;
- # elif TLS_DTV_AT_TP
-@@ -1199,11 +1198,9 @@ init_one_static_tls (struct pthread *cur
- # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
- # endif
-
-- /* Fill in the DTV slot so that a later LD/GD access will find it. */
-- dtv[map->l_tls_modid].pointer.val = dest;
-- dtv[map->l_tls_modid].pointer.is_static = true;
--
-- /* Initialize the memory. */
-+ /* We cannot delay the initialization of the Static TLS area, since
-+ it can be accessed with LE or IE, but since the DTV is only used
-+ by GD and LD, we can delay its update to avoid a race. */
- memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
- '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
- }
-Index: glibc-2.21/nptl_db/db-symbols.awk
-===================================================================
---- glibc-2.21.orig/nptl_db/db-symbols.awk
-+++ glibc-2.21/nptl_db/db-symbols.awk
-@@ -2,6 +2,8 @@
- # we've just built. It checks for all the symbols used in td_symbol_list.
-
- BEGIN {
-+%define DB_RTLD_VARIABLE(name) /* Nothing. */
-+%define DB_MAIN_VARIABLE(name) /* Nothing. */
- %define DB_LOOKUP_NAME(idx, name) required[STRINGIFY (name)] = 1;
- %define DB_LOOKUP_NAME_TH_UNIQUE(idx, name) th_unique[STRINGIFY (name)] = 1;
- %include "db-symbols.h"
-Index: glibc-2.21/nptl_db/db_info.c
-===================================================================
---- glibc-2.21.orig/nptl_db/db_info.c
-+++ glibc-2.21/nptl_db/db_info.c
-@@ -21,6 +21,7 @@
- #include
- #include "thread_dbP.h"
- #include
-+#include
-
- typedef struct pthread pthread;
- typedef struct pthread_key_struct pthread_key_struct;
-@@ -37,6 +38,9 @@ typedef struct
- } dtv;
-
- typedef struct link_map link_map;
-+typedef struct rtld_global rtld_global;
-+typedef struct dtv_slotinfo_list dtv_slotinfo_list;
-+typedef struct dtv_slotinfo dtv_slotinfo;
-
- /* Actually static in nptl/init.c, but we only need it for typeof. */
- extern bool __nptl_initial_report_events;
-Index: glibc-2.21/nptl_db/fetch-value.c
-===================================================================
---- glibc-2.21.orig/nptl_db/fetch-value.c
-+++ glibc-2.21/nptl_db/fetch-value.c
-@@ -69,7 +69,8 @@ _td_locate_field (td_thragent_t *ta,
- }
- }
-
-- if (idx != 0 && idx - (psaddr_t) 0 > DB_DESC_NELEM (desc))
-+ if (idx != 0 && DB_DESC_NELEM (desc) != 0
-+ && idx - (psaddr_t) 0 > DB_DESC_NELEM (desc))
- /* This is an internal indicator to callers with nonzero IDX
- that the IDX value is too big. */
- return TD_NOAPLIC;
-Index: glibc-2.21/nptl_db/structs.def
-===================================================================
---- glibc-2.21.orig/nptl_db/structs.def
-+++ glibc-2.21/nptl_db/structs.def
-@@ -22,6 +22,28 @@
- # define STRUCTS_DEF_DEFAULTS 1
- #endif
-
-+#ifndef DB_RTLD_VARIABLE
-+# define DB_RTLD_VARIABLE(name) DB_VARIABLE (name)
-+#endif
-+
-+#ifndef DB_MAIN_VARIABLE
-+# define DB_MAIN_VARIABLE(name) DB_VARIABLE (name)
-+#endif
-+
-+#ifndef DB_RTLD_GLOBAL_FIELD
-+# if !IS_IN (libpthread)
-+# define DB_RTLD_GLOBAL_FIELD(field) \
-+ DB_STRUCT_FIELD (rtld_global, _##field) \
-+ DB_MAIN_VARIABLE (_##field)
-+# elif defined SHARED
-+# define DB_RTLD_GLOBAL_FIELD(field) \
-+ DB_STRUCT_FIELD (rtld_global, _##field)
-+# else
-+# define DB_RTLD_GLOBAL_FIELD(field) \
-+ DB_MAIN_VARIABLE (_##field)
-+# endif
-+#endif /* DB_RTLD_GLOBAL_FIELD */
-+
- DB_STRUCT (pthread)
- DB_STRUCT_FIELD (pthread, list)
- DB_STRUCT_FIELD (pthread, report_events)
-@@ -70,14 +92,31 @@ DB_STRUCT (pthread_key_data_level2)
- DB_STRUCT_ARRAY_FIELD (pthread_key_data_level2, data)
-
- DB_STRUCT_FIELD (link_map, l_tls_modid)
-+DB_STRUCT_FIELD (link_map, l_tls_offset)
-
- DB_STRUCT_ARRAY_FIELD (dtv, dtv)
- #define pointer_val pointer.val /* Field of anonymous struct in dtv_t. */
- DB_STRUCT_FIELD (dtv_t, pointer_val)
-+DB_STRUCT_FIELD (dtv_t, counter)
- #if !IS_IN (libpthread) || TLS_TCB_AT_TP
- DB_STRUCT_FIELD (pthread, dtvp)
- #endif
-
-+#if !(IS_IN (libpthread) && !defined SHARED)
-+DB_STRUCT (rtld_global)
-+DB_RTLD_VARIABLE (_rtld_global)
-+#endif
-+DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list)
-+
-+DB_STRUCT (dtv_slotinfo_list)
-+DB_STRUCT_FIELD (dtv_slotinfo_list, len)
-+DB_STRUCT_FIELD (dtv_slotinfo_list, next)
-+DB_STRUCT_ARRAY_FIELD (dtv_slotinfo_list, slotinfo)
-+
-+DB_STRUCT (dtv_slotinfo)
-+DB_STRUCT_FIELD (dtv_slotinfo, gen)
-+DB_STRUCT_FIELD (dtv_slotinfo, map)
-+
- #ifdef STRUCTS_DEF_DEFAULTS
- # undef DB_STRUCT_ARRAY_FIELD
- # undef DB_ARRAY_VARIABLE
-Index: glibc-2.21/nptl_db/td_symbol_list.c
-===================================================================
---- glibc-2.21.orig/nptl_db/td_symbol_list.c
-+++ glibc-2.21/nptl_db/td_symbol_list.c
-@@ -18,7 +18,6 @@
- . */
-
- #include
--#include
- #include "thread_dbP.h"
-
- static const char *symbol_list_arr[] =
-@@ -41,12 +40,12 @@ td_symbol_list (void)
-
-
- ps_err_e
--td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr)
-+td_mod_lookup (struct ps_prochandle *ps, const char *mod,
-+ int idx, psaddr_t *sym_addr)
- {
- ps_err_e result;
- assert (idx >= 0 && idx < SYM_NUM_MESSAGES);
-- result = ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx],
-- sym_addr);
-+ result = ps_pglobal_lookup (ps, mod, symbol_list_arr[idx], sym_addr);
-
- #ifdef HAVE_ASM_GLOBAL_DOT_NAME
- /* For PowerPC, 64-bit uses dot symbols but 32-bit does not.
-Index: glibc-2.21/nptl_db/td_thr_tlsbase.c
-===================================================================
---- glibc-2.21.orig/nptl_db/td_thr_tlsbase.c
-+++ glibc-2.21/nptl_db/td_thr_tlsbase.c
-@@ -17,14 +17,118 @@
- . */
-
- #include "thread_dbP.h"
-+#include
-
-+/* Get the DTV slotinfo list head entry from the dynamic loader state
-+ into *LISTHEAD. */
-+static td_err_e
-+dtv_slotinfo_list (td_thragent_t *ta,
-+ psaddr_t *listhead)
-+{
-+ td_err_e err;
-+ psaddr_t head;
-+
-+ if (ta->ta_addr__rtld_global == 0
-+ && td_mod_lookup (ta->ph, LD_SO, SYM__rtld_global,
-+ &ta->ta_addr__rtld_global) != PS_OK)
-+ ta->ta_addr__rtld_global = (void*)-1;
-+
-+ if (ta->ta_addr__rtld_global != (void*)-1)
-+ {
-+ err = DB_GET_FIELD (head, ta, ta->ta_addr__rtld_global,
-+ rtld_global, _dl_tls_dtv_slotinfo_list, 0);
-+ if (err != TD_OK)
-+ return err;
-+ }
-+ else
-+ {
-+ if (ta->ta_addr__dl_tls_dtv_slotinfo_list == 0
-+ && td_mod_lookup (ta->ph, NULL, SYM__dl_tls_dtv_slotinfo_list,
-+ &ta->ta_addr__dl_tls_dtv_slotinfo_list) != PS_OK)
-+ return TD_ERR;
-+
-+ err = _td_fetch_value (ta, ta->ta_var__dl_tls_dtv_slotinfo_list,
-+ SYM_DESC__dl_tls_dtv_slotinfo_list,
-+ 0, ta->ta_addr__dl_tls_dtv_slotinfo_list, &head);
-+ if (err != TD_OK)
-+ return err;
-+ }
-+
-+ *listhead = head;
-+ return TD_OK;
-+}
-+
-+/* Get the address of the DTV slotinfo entry for MODID into
-+ *DTVSLOTINFO. */
-+static td_err_e
-+dtv_slotinfo (td_thragent_t *ta,
-+ unsigned long int modid,
-+ psaddr_t *dtvslotinfo)
-+{
-+ td_err_e err;
-+ psaddr_t slot, temp;
-+ size_t slbase = 0;
-+
-+ err = dtv_slotinfo_list (ta, &slot);
-+ if (err != TD_OK)
-+ return err;
-+
-+ while (slot)
-+ {
-+ /* Get the number of entries in this list entry's array. */
-+ err = DB_GET_FIELD (temp, ta, slot, dtv_slotinfo_list, len, 0);
-+ if (err != TD_OK)
-+ return err;
-+ size_t len = (uintptr_t)temp;
-+
-+ /* Did we find the list entry for modid? */
-+ if (modid < slbase + len)
-+ break;
-+
-+ /* We didn't, so get the next list entry. */
-+ slbase += len;
-+ err = DB_GET_FIELD (temp, ta, slot, dtv_slotinfo_list,
-+ next, 0);
-+ if (err != TD_OK)
-+ return err;
-+ slot = temp;
-+ }
-+
-+ /* We reached the end of the list and found nothing. */
-+ if (!slot)
-+ return TD_ERR;
-+
-+ /* Take the slotinfo for modid from the list entry. */
-+ err = DB_GET_FIELD_ADDRESS (temp, ta, slot, dtv_slotinfo_list,
-+ slotinfo, modid - slbase);
-+ if (err != TD_OK)
-+ return err;
-+ slot = temp;
-+
-+ *dtvslotinfo = slot;
-+ return TD_OK;
-+}
-+
-+/* Return in *BASE the base address of the TLS block for MODID within
-+ TH.
-+
-+ It should return success and yield the correct pointer in any
-+ circumstance where the TLS block for the module and thread
-+ requested has already been initialized.
-+
-+ It should fail with TD_TLSDEFER only when the thread could not
-+ possibly have observed any values in that TLS block. That way, the
-+ debugger can fall back to showing initial values from the PT_TLS
-+ segment (and refusing attempts to mutate) for the TD_TLSDEFER case,
-+ and never fail to make the values the program will actually see
-+ available to the user of the debugger. */
- td_err_e
- td_thr_tlsbase (const td_thrhandle_t *th,
- unsigned long int modid,
- psaddr_t *base)
- {
- td_err_e err;
-- psaddr_t dtv, dtvslot, dtvptr;
-+ psaddr_t dtv, dtvslot, dtvptr, temp;
-
- if (modid < 1)
- return TD_NOTLS;
-@@ -50,11 +154,75 @@ td_thr_tlsbase (const td_thrhandle_t *th
- return TD_TLSDEFER;
- }
-
-+ err = dtv_slotinfo (th->th_ta_p, modid, &temp);
-+ if (err != TD_OK)
-+ return err;
-+
-+ psaddr_t slot;
-+ err = DB_GET_STRUCT (slot, th->th_ta_p, temp, dtv_slotinfo);
-+ if (err != TD_OK)
-+ return err;
-+
-+ /* Take the link_map from the slotinfo. */
-+ psaddr_t map;
-+ err = DB_GET_FIELD_LOCAL (map, th->th_ta_p, slot, dtv_slotinfo, map, 0);
-+ if (err != TD_OK)
-+ return err;
-+ if (!map)
-+ return TD_ERR;
-+
-+ /* Ok, the modid is good, now find out what DTV generation it
-+ requires. */
-+ err = DB_GET_FIELD_LOCAL (temp, th->th_ta_p, slot, dtv_slotinfo, gen, 0);
-+ if (err != TD_OK)
-+ return err;
-+ size_t modgen = (uintptr_t)temp;
-+
- /* Get the DTV pointer from the thread descriptor. */
- err = DB_GET_FIELD (dtv, th->th_ta_p, pd, pthread, dtvp, 0);
- if (err != TD_OK)
- return err;
-
-+ psaddr_t dtvgenloc;
-+ /* Get the DTV generation count at dtv[0].counter. */
-+ err = DB_GET_FIELD_ADDRESS (dtvgenloc, th->th_ta_p, dtv, dtv, dtv, 0);
-+ if (err != TD_OK)
-+ return err;
-+ err = DB_GET_FIELD (temp, th->th_ta_p, dtvgenloc, dtv_t, counter, 0);
-+ if (err != TD_OK)
-+ return err;
-+ size_t dtvgen = (uintptr_t)temp;
-+
-+ /* Is the DTV current enough? */
-+ if (dtvgen < modgen)
-+ {
-+ try_static_tls:
-+ /* If the module uses Static TLS, we're still good. */
-+ err = DB_GET_FIELD (temp, th->th_ta_p, map, link_map, l_tls_offset, 0);
-+ if (err != TD_OK)
-+ return err;
-+ ptrdiff_t tlsoff = (uintptr_t)temp;
-+
-+ if (tlsoff != FORCED_DYNAMIC_TLS_OFFSET
-+ && tlsoff != NO_TLS_OFFSET)
-+ {
-+ psaddr_t tp = pd;
-+
-+#if TLS_TCB_AT_TP
-+ dtvptr = tp - tlsoff;
-+#elif TLS_DTV_AT_TP
-+ dtvptr = tp + tlsoff + TLS_PRE_TCB_SIZE;
-+#else
-+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-+#endif
-+
-+ *base = dtvptr;
-+ return TD_OK;
-+ }
-+
-+ return TD_TLSDEFER;
-+ }
-+
- /* Find the corresponding entry in the DTV. */
- err = DB_GET_FIELD_ADDRESS (dtvslot, th->th_ta_p, dtv, dtv, dtv, modid);
- if (err != TD_OK)
-@@ -68,7 +236,7 @@ td_thr_tlsbase (const td_thrhandle_t *th
- /* It could be that the memory for this module is not allocated for
- the given thread. */
- if ((uintptr_t) dtvptr & 1)
-- return TD_TLSDEFER;
-+ goto try_static_tls;
-
- *base = dtvptr;
- return TD_OK;
-Index: glibc-2.21/nptl_db/thread_dbP.h
-===================================================================
---- glibc-2.21.orig/nptl_db/thread_dbP.h
-+++ glibc-2.21/nptl_db/thread_dbP.h
-@@ -29,6 +29,7 @@
- #include "thread_db.h"
- #include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */
- #include
-+#include
-
- /* Indeces for the symbol names. */
- enum
-@@ -139,11 +140,11 @@ ta_ok (const td_thragent_t *ta)
- }
-
-
--/* Internal wrapper around ps_pglobal_lookup. */
--extern ps_err_e td_lookup (struct ps_prochandle *ps,
-- int idx, psaddr_t *sym_addr) attribute_hidden;
--
--
-+/* Internal wrappers around ps_pglobal_lookup. */
-+extern ps_err_e td_mod_lookup (struct ps_prochandle *ps, const char *modname,
-+ int idx, psaddr_t *sym_addr) attribute_hidden;
-+#define td_lookup(ps, idx, sym_addr) \
-+ td_mod_lookup ((ps), LIBPTHREAD_SO, (idx), (sym_addr))
-
-
- /* Store in psaddr_t VAR the address of inferior's symbol NAME. */
diff --git a/threaded-trim-threshold.patch b/threaded-trim-threshold.patch
deleted file mode 100644
index 4457442..0000000
--- a/threaded-trim-threshold.patch
+++ /dev/null
@@ -1,224 +0,0 @@
-From c26efef9798914e208329c0e8c3c73bb1135d9e3 Mon Sep 17 00:00:00 2001
-From: Mel Gorman
-Date: Thu, 2 Apr 2015 12:14:14 +0530
-Subject: [PATCH] malloc: Consistently apply trim_threshold to all heaps [BZ
- #17195]
-
-Trimming heaps is a balance between saving memory and the system overhead
-required to update page tables and discard allocated pages. The malloc
-option M_TRIM_THRESHOLD is a tunable that users are meant to use to decide
-where this balance point is but it is only applied to the main arena.
-
-For scalability reasons, glibc malloc has per-thread heaps but these are
-shrunk with madvise() if there is one page free at the top of the heap.
-In some circumstances this can lead to high system overhead if a thread
-has a control flow like
-
- while (data_to_process) {
- buf = malloc(large_size);
- do_stuff();
- free(buf);
- }
-
-For a large size, the free() will call madvise (pagetable teardown, page
-free and TLB flush) every time followed immediately by a malloc (fault,
-kernel page alloc, zeroing and charge accounting). The kernel overhead
-can dominate such a workload.
-
-This patch allows the user to tune when madvise gets called by applying
-the trim threshold to the per-thread heaps and using similar logic to the
-main arena when deciding whether to shrink. Alternatively if the dynamic
-brk/mmap threshold gets adjusted then the new values will be obeyed by
-the per-thread heaps.
-
-Bug 17195 was a test case motivated by a problem encountered in scientific
-applications written in python that performance badly due to high page fault
-overhead. The basic operation of such a program was posted by Julian Taylor
-https://sourceware.org/ml/libc-alpha/2015-02/msg00373.html
-
-With this patch applied, the overhead is eliminated. All numbers in this
-report are in seconds and were recorded by running Julian's program 30
-times.
-
-pyarray
- glibc madvise
- 2.21 v2
-System min 1.81 ( 0.00%) 0.00 (100.00%)
-System mean 1.93 ( 0.00%) 0.02 ( 99.20%)
-System stddev 0.06 ( 0.00%) 0.01 ( 88.99%)
-System max 2.06 ( 0.00%) 0.03 ( 98.54%)
-Elapsed min 3.26 ( 0.00%) 2.37 ( 27.30%)
-Elapsed mean 3.39 ( 0.00%) 2.41 ( 28.84%)
-Elapsed stddev 0.14 ( 0.00%) 0.02 ( 82.73%)
-Elapsed max 4.05 ( 0.00%) 2.47 ( 39.01%)
-
- glibc madvise
- 2.21 v2
-User 141.86 142.28
-System 57.94 0.60
-Elapsed 102.02 72.66
-
-Note that almost a minutes worth of system time is eliminted and the
-program completes 28% faster on average.
-
-To illustrate the problem without python this is a basic test-case for
-the worst case scenario where every free is a madvise followed by a an alloc
-
-/* gcc bench-free.c -lpthread -o bench-free */
-static int num = 1024;
-
-void __attribute__((noinline,noclone)) dostuff (void *p)
-{
-}
-
-void *worker (void *data)
-{
- int i;
-
- for (i = num; i--;)
- {
- void *m = malloc (48*4096);
- dostuff (m);
- free (m);
- }
-
- return NULL;
-}
-
-int main()
-{
- int i;
- pthread_t t;
- void *ret;
- if (pthread_create (&t, NULL, worker, NULL))
- exit (2);
- if (pthread_join (t, &ret))
- exit (3);
- return 0;
-}
-
-Before the patch, this resulted in 1024 calls to madvise. With the patch applied,
-madvise is called twice because the default trim threshold is high enough to avoid
-this.
-
-This a more complex case where there is a mix of frees. It's simply a different worker
-function for the test case above
-
-void *worker (void *data)
-{
- int i;
- int j = 0;
- void *free_index[num];
-
- for (i = num; i--;)
- {
- void *m = malloc ((i % 58) *4096);
- dostuff (m);
- if (i % 2 == 0) {
- free (m);
- } else {
- free_index[j++] = m;
- }
- }
- for (; j >= 0; j--)
- {
- free(free_index[j]);
- }
-
- return NULL;
-}
-
-glibc 2.21 calls malloc 90305 times but with the patch applied, it's
-called 13438. Increasing the trim threshold will decrease the number of
-times it's called with the option of eliminating the overhead.
-
-ebizzy is meant to generate a workload resembling common web application
-server workloads. It is threaded with a large working set that at its core
-has an allocation, do_stuff, free loop that also hits this case. The primary
-metric of the benchmark is records processed per second. This is running on
-my desktop which is a single socket machine with an I7-4770 and 8 cores.
-Each thread count was run for 30 seconds. It was only run once as the
-performance difference is so high that the variation is insignificant.
-
- glibc 2.21 patch
-threads 1 10230 44114
-threads 2 19153 84925
-threads 4 34295 134569
-threads 8 51007 183387
-
-Note that the saving happens to be a concidence as the size allocated
-by ebizzy was less than the default threshold. If a different number of
-chunks were specified then it may also be necessary to tune the threshold
-to compensate
-
-This is roughly quadrupling the performance of this benchmark. The difference in
-system CPU usage illustrates why.
-
-ebizzy running 1 thread with glibc 2.21
-10230 records/s 306904
-real 30.00 s
-user 7.47 s
-sys 22.49 s
-
-22.49 seconds was spent in the kernel for a workload runinng 30 seconds. With the
-patch applied
-
-ebizzy running 1 thread with patch applied
-44126 records/s 1323792
-real 30.00 s
-user 29.97 s
-sys 0.00 s
-
-system CPU usage was zero with the patch applied. strace shows that glibc
-running this workload calls madvise approximately 9000 times a second. With
-the patch applied madvise was called twice during the workload (or 0.06
-times per second).
-
-2015-02-10 Mel Gorman
-
- [BZ #17195]
- * malloc/arena.c (free): Apply trim threshold to per-thread heaps
- as well as the main arena.
----
-
---- a/malloc/malloc.c
-+++ b/malloc/malloc.c
-@@ -241,6 +241,8 @@
- /* For MIN, MAX, powerof2. */
- #include
-
-+/* For ALIGN_DOWN. */
-+#include
-
- /*
- Debugging:
---- a/malloc/arena.c
-+++ b/malloc/arena.c
-@@ -658,7 +658,7 @@ heap_trim (heap_info *heap, size_t pad)
- unsigned long pagesz = GLRO (dl_pagesize);
- mchunkptr top_chunk = top (ar_ptr), p, bck, fwd;
- heap_info *prev_heap;
-- long new_size, top_size, extra, prev_size, misalign;
-+ long new_size, top_size, top_area, extra, prev_size, misalign;
-
- /* Can this heap go away completely? */
- while (top_chunk == chunk_at_offset (heap, sizeof (*heap)))
-@@ -694,9 +694,16 @@ heap_trim (heap_info *heap, size_t pad)
- set_head (top_chunk, new_size | PREV_INUSE);
- /*check_chunk(ar_ptr, top_chunk);*/
- }
-+
-+ /* Uses similar logic for per-thread arenas as the main arena with systrim
-+ by preserving the top pad and at least a page. */
- top_size = chunksize (top_chunk);
-- extra = (top_size - pad - MINSIZE - 1) & ~(pagesz - 1);
-- if (extra < (long) pagesz)
-+ top_area = top_size - MINSIZE - 1;
-+ if (top_area <= pad)
-+ return 0;
-+
-+ extra = ALIGN_DOWN(top_area - pad, pagesz);
-+ if ((unsigned long) extra < mp_.trim_threshold)
- return 0;
-
- /* Try to shrink. */