From 470d9bf3160006d74bcb2fc1a1de039cac218936 Mon Sep 17 00:00:00 2001 From: Michael Gehring Date: Tue, 10 Oct 2017 14:38:13 +0000 Subject: [PATCH] glibc: update upstream patches --- srcpkgs/glibc/patches/glibc-upstream-01.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-02.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-03.patch | 7 +- srcpkgs/glibc/patches/glibc-upstream-04.patch | 7 +- srcpkgs/glibc/patches/glibc-upstream-05.patch | 21 +- srcpkgs/glibc/patches/glibc-upstream-06.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-07.patch | 7 +- srcpkgs/glibc/patches/glibc-upstream-08.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-09.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-10.patch | 9 +- srcpkgs/glibc/patches/glibc-upstream-11.patch | 6 +- srcpkgs/glibc/patches/glibc-upstream-12.patch | 215 ++++++ srcpkgs/glibc/patches/glibc-upstream-13.patch | 27 + srcpkgs/glibc/patches/glibc-upstream-14.patch | 62 ++ srcpkgs/glibc/patches/glibc-upstream-15.patch | 81 +++ srcpkgs/glibc/patches/glibc-upstream-16.patch | 244 +++++++ srcpkgs/glibc/patches/glibc-upstream-17.patch | 58 ++ srcpkgs/glibc/patches/glibc-upstream-18.patch | 232 +++++++ srcpkgs/glibc/patches/glibc-upstream-19.patch | 61 ++ srcpkgs/glibc/patches/glibc-upstream-20.patch | 47 ++ srcpkgs/glibc/patches/glibc-upstream-21.patch | 99 +++ srcpkgs/glibc/patches/glibc-upstream-22.patch | 117 ++++ srcpkgs/glibc/patches/glibc-upstream-23.patch | 171 +++++ srcpkgs/glibc/patches/glibc-upstream-24.patch | 56 ++ srcpkgs/glibc/patches/glibc-upstream-25.patch | 47 ++ srcpkgs/glibc/patches/glibc-upstream-26.patch | 61 ++ srcpkgs/glibc/patches/glibc-upstream-27.patch | 376 ++++++++++ srcpkgs/glibc/patches/glibc-upstream-28.patch | 346 +++++++++ srcpkgs/glibc/patches/glibc-upstream-29.patch | 316 +++++++++ srcpkgs/glibc/patches/glibc-upstream-30.patch | 58 ++ srcpkgs/glibc/patches/glibc-upstream-31.patch | 58 ++ srcpkgs/glibc/patches/glibc-upstream-32.patch | 41 ++ srcpkgs/glibc/patches/glibc-upstream-33.patch | 139 ++++ srcpkgs/glibc/patches/glibc-upstream-34.patch | 59 ++ srcpkgs/glibc/patches/glibc-upstream-35.patch | 41 ++ srcpkgs/glibc/patches/glibc-upstream-36.patch | 43 ++ srcpkgs/glibc/patches/glibc-upstream-37.patch | 654 ++++++++++++++++++ srcpkgs/glibc/patches/glibc-upstream-38.patch | 223 ++++++ srcpkgs/glibc/patches/glibc-upstream-39.patch | 41 ++ srcpkgs/glibc/patches/glibc-upstream-40.patch | 76 ++ srcpkgs/glibc/patches/glibc-upstream-41.patch | 86 +++ srcpkgs/glibc/patches/glibc-upstream-42.patch | 165 +++++ srcpkgs/glibc/patches/glibc-upstream-43.patch | 28 + srcpkgs/glibc/patches/glibc-upstream-44.patch | 104 +++ srcpkgs/glibc/patches/glibc-upstream-45.patch | 250 +++++++ srcpkgs/glibc/patches/glibc-upstream-46.patch | 64 ++ srcpkgs/glibc/patches/glibc-upstream-47.patch | 217 ++++++ srcpkgs/glibc/patches/glibc-upstream-48.patch | 21 + 48 files changed, 5019 insertions(+), 67 deletions(-) create mode 100644 srcpkgs/glibc/patches/glibc-upstream-12.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-13.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-14.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-15.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-16.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-17.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-18.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-19.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-20.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-21.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-22.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-23.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-24.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-25.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-26.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-27.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-28.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-29.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-30.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-31.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-32.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-33.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-34.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-35.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-36.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-37.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-38.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-39.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-40.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-41.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-42.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-43.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-44.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-45.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-46.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-47.patch create mode 100644 srcpkgs/glibc/patches/glibc-upstream-48.patch diff --git a/srcpkgs/glibc/patches/glibc-upstream-01.patch b/srcpkgs/glibc/patches/glibc-upstream-01.patch index 72edba2bfad..affcee18499 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-01.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-01.patch @@ -12,7 +12,7 @@ Subject: [PATCH 01] getaddrinfo: Release resolver context on error in 3 files changed, 14 insertions(+) diff --git a/ChangeLog b/ChangeLog -index 8dbfc7e..28ce9c8 100644 +index 8dbfc7eaff..28ce9c8479 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ @@ -26,7 +26,7 @@ index 8dbfc7e..28ce9c8 100644 * version.h (RELEASE): Set to "stable" diff --git a/NEWS b/NEWS -index 8295f20..9a64579 100644 +index 8295f20c0a..9a64579658 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,12 @@ See the end for copying conditions. @@ -43,7 +43,7 @@ index 8295f20..9a64579 100644 Major new features: diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index efa7118..699411c 100644 +index efa7118498..699411cc92 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -255,6 +255,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, @@ -55,7 +55,4 @@ index efa7118..699411c 100644 result = -EAI_MEMORY; \ goto free_and_return; \ } \ --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-02.patch b/srcpkgs/glibc/patches/glibc-upstream-02.patch index e3c7c68fb3f..583b9a0825b 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-02.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-02.patch @@ -3,7 +3,7 @@ From: Aurelien Jarno Date: Thu, 3 Aug 2017 22:33:19 +0000 Subject: [PATCH 02] i686/multiarch: Regenerate ulps MIME-Version: 1.0 -Content-Type: text/plain; charset=utf8 +Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This comes from running “make regen-ulps” on an AMD Opteron 2378 CPU. @@ -17,7 +17,7 @@ Changelog: 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 28ce9c8..3478699 100644 +index 28ce9c8479..3478699b10 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ @@ -29,7 +29,7 @@ index 28ce9c8..3478699 100644 [BZ #21885] diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps -index 81dd1a0..053f5ec 100644 +index 81dd1a09ea..053f5ec972 100644 --- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps +++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps @@ -58,7 +58,7 @@ double: 1 @@ -74,7 +74,4 @@ index 81dd1a0..053f5ec 100644 Function: "log": double: 1 --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-03.patch b/srcpkgs/glibc/patches/glibc-upstream-03.patch index 9e2a458df14..f6d9222b1c8 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-03.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-03.patch @@ -16,7 +16,7 @@ Changelog: 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog -index 3478699..4357ad1 100644 +index 3478699b10..4357ad1eb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ @@ -30,7 +30,7 @@ index 3478699..4357ad1 100644 2017-08-03 Florian Weimer diff --git a/stdlib/getentropy.c b/stdlib/getentropy.c -index a71d4cd..a88bbf8 100644 +index a71d4cd8f5..a88bbf8de3 100644 --- a/stdlib/getentropy.c +++ b/stdlib/getentropy.c @@ -21,7 +21,7 @@ @@ -42,7 +42,4 @@ index a71d4cd..a88bbf8 100644 getentropy (void *buffer, size_t length) { __set_errno (ENOSYS); --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-04.patch b/srcpkgs/glibc/patches/glibc-upstream-04.patch index 4f92b2a5eb9..9050cad1cc2 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-04.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-04.patch @@ -56,7 +56,7 @@ server. 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 4357ad1..764c827 100644 +index 4357ad1eb8..764c827161 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ @@ -70,7 +70,7 @@ index 4357ad1..764c827 100644 * stdlib/getentropy.c (getentropy): Change return type to int. diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c -index 1d087ea..6f90084 100644 +index 1d087ea732..6f900840d4 100644 --- a/sysdeps/x86/cpu-features.c +++ b/sysdeps/x86/cpu-features.c @@ -244,10 +244,13 @@ init_cpu_features (struct cpu_features *cpu_features) @@ -89,7 +89,4 @@ index 1d087ea..6f90084 100644 { unsigned int eax; --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-05.patch b/srcpkgs/glibc/patches/glibc-upstream-05.patch index ad85e348400..ebc489d8ac4 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-05.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-05.patch @@ -46,7 +46,7 @@ Cherry-pick of 852d63120783fae5bf85a067320dc4ba1ed59f11 9 files changed, 25 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 764c827..459062c 100644 +index 764c827161..459062cc20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ @@ -67,7 +67,7 @@ index 764c827..459062c 100644 [BZ #21871] diff --git a/sysdeps/posix/preadv2.c b/sysdeps/posix/preadv2.c -index 2a7cf11..d27f702 100644 +index 2a7cf11e27..d27f7028ed 100644 --- a/sysdeps/posix/preadv2.c +++ b/sysdeps/posix/preadv2.c @@ -28,7 +28,7 @@ preadv2 (int fd, const struct iovec *vector, int count, OFF_T offset, @@ -80,7 +80,7 @@ index 2a7cf11..d27f702 100644 } diff --git a/sysdeps/posix/preadv64v2.c b/sysdeps/posix/preadv64v2.c -index e084f3f..ce7cb40 100644 +index e084f3f9e1..ce7cb40bf2 100644 --- a/sysdeps/posix/preadv64v2.c +++ b/sysdeps/posix/preadv64v2.c @@ -25,7 +25,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, OFF_T offset, @@ -93,7 +93,7 @@ index e084f3f..ce7cb40 100644 } diff --git a/sysdeps/posix/pwritev2.c b/sysdeps/posix/pwritev2.c -index 5b7650c..7ec8cbc 100644 +index 5b7650c4fc..7ec8cbc407 100644 --- a/sysdeps/posix/pwritev2.c +++ b/sysdeps/posix/pwritev2.c @@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, OFF_T offset, @@ -106,7 +106,7 @@ index 5b7650c..7ec8cbc 100644 } diff --git a/sysdeps/posix/pwritev64v2.c b/sysdeps/posix/pwritev64v2.c -index 0f2f9ef..be98aee 100644 +index 0f2f9ef863..be98aeed9d 100644 --- a/sysdeps/posix/pwritev64v2.c +++ b/sysdeps/posix/pwritev64v2.c @@ -26,7 +26,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, OFF_T offset, @@ -119,7 +119,7 @@ index 0f2f9ef..be98aee 100644 } diff --git a/sysdeps/unix/sysv/linux/preadv2.c b/sysdeps/unix/sysv/linux/preadv2.c -index 11fe85e..137e2dd 100644 +index 11fe85eaa8..137e2dd791 100644 --- a/sysdeps/unix/sysv/linux/preadv2.c +++ b/sysdeps/unix/sysv/linux/preadv2.c @@ -32,7 +32,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset, @@ -141,7 +141,7 @@ index 11fe85e..137e2dd 100644 } return preadv (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/preadv64v2.c b/sysdeps/unix/sysv/linux/preadv64v2.c -index 9d7f8c9..8f41325 100644 +index 9d7f8c9893..8f413253f4 100644 --- a/sysdeps/unix/sysv/linux/preadv64v2.c +++ b/sysdeps/unix/sysv/linux/preadv64v2.c @@ -30,7 +30,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, off64_t offset, @@ -163,7 +163,7 @@ index 9d7f8c9..8f41325 100644 } return preadv64 (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/pwritev2.c b/sysdeps/unix/sysv/linux/pwritev2.c -index 72f0471..8e5032f 100644 +index 72f0471f96..8e5032fe2f 100644 --- a/sysdeps/unix/sysv/linux/pwritev2.c +++ b/sysdeps/unix/sysv/linux/pwritev2.c @@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, off_t offset, @@ -185,7 +185,7 @@ index 72f0471..8e5032f 100644 } return pwritev (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/pwritev64v2.c b/sysdeps/unix/sysv/linux/pwritev64v2.c -index def9a0b..d2800c6 100644 +index def9a0bc57..d2800c6657 100644 --- a/sysdeps/unix/sysv/linux/pwritev64v2.c +++ b/sysdeps/unix/sysv/linux/pwritev64v2.c @@ -30,7 +30,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, off64_t offset, @@ -206,7 +206,4 @@ index def9a0b..d2800c6 100644 return -1; } return pwritev64 (fd, vector, count, offset); --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-06.patch b/srcpkgs/glibc/patches/glibc-upstream-06.patch index 7d2bed581de..d7a372b6f58 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-06.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-06.patch @@ -16,7 +16,7 @@ resolv_context). 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog -index 459062c..3127648 100644 +index 459062cc20..3127648626 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ @@ -30,7 +30,7 @@ index 459062c..3127648 100644 [BZ #21780] diff --git a/NEWS b/NEWS -index 9a64579..ec6cf34 100644 +index 9a64579658..ec6cf34122 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ Version 2.26.1 @@ -42,7 +42,7 @@ index 9a64579..ec6cf34 100644 Version 2.26 diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c -index 6c547ea..bce80e0 100644 +index 6c547ea1ca..bce80e05dd 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -234,6 +234,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, @@ -69,7 +69,4 @@ index 6c547ea..bce80e0 100644 } #endif --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-07.patch b/srcpkgs/glibc/patches/glibc-upstream-07.patch index 913b9e782f7..42eaaa6aade 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-07.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-07.patch @@ -10,7 +10,7 @@ Subject: [PATCH 07] malloc: Avoid optimizer warning with GCC 7 and -O3 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 3127648..5ea9b8b 100644 +index 3127648626..5ea9b8baa7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ @@ -23,7 +23,7 @@ index 3127648..5ea9b8b 100644 [BZ #21932] diff --git a/malloc/malloc.c b/malloc/malloc.c -index 54e406b..e3ff778 100644 +index 54e406bcb6..e3ff778113 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1658,6 +1658,9 @@ typedef struct malloc_chunk *mfastbinptr; @@ -68,7 +68,4 @@ index 54e406b..e3ff778 100644 /* Initialize a malloc_state struct. --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-08.patch b/srcpkgs/glibc/patches/glibc-upstream-08.patch index f1a3409b511..7384065ac2c 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-08.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-08.patch @@ -12,7 +12,7 @@ Subject: [PATCH 08] assert: Suppress pedantic warning caused by statement 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 5ea9b8b..0057c09 100644 +index 5ea9b8baa7..0057c0902a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ @@ -27,7 +27,7 @@ index 5ea9b8b..0057c09 100644 * malloc/malloc.c (get_max_fast): Reimplement as an inline diff --git a/NEWS b/NEWS -index ec6cf34..d57c405 100644 +index ec6cf34122..d57c4052cf 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Version 2.26.1 @@ -39,7 +39,7 @@ index ec6cf34..d57c405 100644 [21932] Unpaired __resolv_context_get in generic get*_r implementation diff --git a/assert/assert.h b/assert/assert.h -index 22f0195..6801cfe 100644 +index 22f019537c..6801cfeb10 100644 --- a/assert/assert.h +++ b/assert/assert.h @@ -91,13 +91,19 @@ __END_DECLS @@ -73,7 +73,4 @@ index 22f0195..6801cfe 100644 # else # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define __ASSERT_FUNCTION __func__ --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-09.patch b/srcpkgs/glibc/patches/glibc-upstream-09.patch index 46099fd5415..a22b180f6c1 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-09.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-09.patch @@ -35,7 +35,7 @@ Tested for powerpc64le and --with-cpu=power9. 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 0057c09..6886cd9 100644 +index 0057c0902a..6886cd9361 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ @@ -52,7 +52,7 @@ index 0057c09..6886cd9 100644 [BZ #21242] diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h -index d8fd492..396fd05 100644 +index d8fd4923ac..396fd0562e 100644 --- a/sysdeps/powerpc/fpu/math_private.h +++ b/sysdeps/powerpc/fpu/math_private.h @@ -30,7 +30,7 @@ extern __always_inline _Float128 @@ -65,7 +65,7 @@ index d8fd492..396fd05 100644 } #endif diff --git a/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c -index 769d3f8..59fd826 100644 +index 769d3f8922..59fd8269f5 100644 --- a/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c +++ b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c @@ -30,7 +30,7 @@ __float128 @@ -77,7 +77,4 @@ index 769d3f8..59fd826 100644 return z; } strong_alias (__ieee754_sqrtf128, __sqrtf128_finite) --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-10.patch b/srcpkgs/glibc/patches/glibc-upstream-10.patch index 2381da1e4c9..1755cbd3adf 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-10.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-10.patch @@ -27,7 +27,7 @@ Tested for powerpc64le (glibc test suite and libstdc++-v3 configure). 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 6886cd9..415fa3c 100644 +index 6886cd9361..415fa3cc79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ @@ -41,7 +41,7 @@ index 6886cd9..415fa3c 100644 [BZ #21941] diff --git a/NEWS b/NEWS -index d57c405..75b82c8 100644 +index d57c4052cf..75b82c899e 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ The following bugs are resolved with this release: @@ -53,7 +53,7 @@ index d57c405..75b82c8 100644 Version 2.26 diff --git a/math/math.h b/math/math.h -index e217080..dea8dbe 100644 +index e21708045a..dea8dbe1ae 100644 --- a/math/math.h +++ b/math/math.h @@ -442,8 +442,12 @@ enum @@ -71,7 +71,4 @@ index e217080..dea8dbe 100644 # define isinf(x) \ (__builtin_types_compatible_p (__typeof (x), _Float128) \ ? __isinff128 (x) : __builtin_isinf_sign (x)) --- -2.7.4.GIT - diff --git a/srcpkgs/glibc/patches/glibc-upstream-11.patch b/srcpkgs/glibc/patches/glibc-upstream-11.patch index 41a21d6b602..32010111ee1 100644 --- a/srcpkgs/glibc/patches/glibc-upstream-11.patch +++ b/srcpkgs/glibc/patches/glibc-upstream-11.patch @@ -19,7 +19,7 @@ Tested for powerpc64le. 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog -index 415fa3c..23c00ae 100644 +index 415fa3cc79..23c00aed09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ @@ -34,7 +34,7 @@ index 415fa3c..23c00ae 100644 * math/math.h (isinf): Check if in C or C++ mode before using __builtin_types_compatible_p, since this is a C mode feature. diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h -index 06523bf..0c80821 100644 +index 06523bfe9c..0c808216a4 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -464,17 +464,18 @@ @@ -65,6 +65,4 @@ index 06523bf..0c80821 100644 # define __HAVE_GENERIC_SELECTION 1 #else # define __HAVE_GENERIC_SELECTION 0 --- -2.7.4.GIT diff --git a/srcpkgs/glibc/patches/glibc-upstream-12.patch b/srcpkgs/glibc/patches/glibc-upstream-12.patch new file mode 100644 index 00000000000..3405c118b42 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-12.patch @@ -0,0 +1,215 @@ +From fb9a781e9d62c5d7a1f4196915cdfb7c6db59a0c Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Mon, 21 Aug 2017 16:13:49 +0200 +Subject: [PATCH 12] assert: Support types without operator== (int) [BZ + #21972] + +(cherry picked from commit b5889d25e9bf944a89fdd7bcabf3b6c6f6bb6f7c) +--- + ChangeLog | 11 +++++++ + NEWS | 1 + + assert/Makefile | 11 ++++++- + assert/assert.h | 16 ++++++---- + assert/tst-assert-c++.cc | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ + assert/tst-assert-g++.cc | 19 ++++++++++++ + 6 files changed, 129 insertions(+), 7 deletions(-) + create mode 100644 assert/tst-assert-c++.cc + create mode 100644 assert/tst-assert-g++.cc + +diff --git a/ChangeLog b/ChangeLog +index 23c00aed09..8bc3ad9a46 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,14 @@ ++2017-08-21 Florian Weimer ++ ++ [BZ #21972] ++ * assert/assert.h (assert): Use static_cast (bool) for C++. ++ Use the ternary operator in the warning branch for GNU C. ++ * assert/Makefile (tests): Add tst-assert-c++, tst-assert-g++. ++ (CFLAGS-tst-assert-c++.o): Compile in C++11 mode. ++ (CFLAGS-tst-assert-g++.o): Compile in GnU C++11 mode. ++ (LDLIBS-tst-assert-c++, LDLIBS-tst-assert-g++): Link with libstdc++. ++ * assert/tst-assert-c++.cc, assert/tst-assert-g++.cc: New files. ++ + 2017-08-18 Gabriel F. T. Gomes + + * misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): Define to 0, if +diff --git a/NEWS b/NEWS +index 75b82c899e..1996e5fbef 100644 +--- a/NEWS ++++ b/NEWS +@@ -13,6 +13,7 @@ The following bugs are resolved with this release: + [21885] getaddrinfo: Release resolver context on error in gethosts + [21930] Do not use __builtin_types_compatible_p in C++ mode + [21932] Unpaired __resolv_context_get in generic get*_r implementation ++ [21972] assert macro requires operator== (int) for its argument type + + Version 2.26 + +diff --git a/assert/Makefile b/assert/Makefile +index 1c3be9b01f..9ec1be81a9 100644 +--- a/assert/Makefile ++++ b/assert/Makefile +@@ -25,6 +25,15 @@ include ../Makeconfig + headers := assert.h + + routines := assert assert-perr __assert +-tests := test-assert test-assert-perr ++tests := test-assert test-assert-perr tst-assert-c++ tst-assert-g++ + + include ../Rules ++ ++ifeq ($(have-cxx-thread_local),yes) ++CFLAGS-tst-assert-c++.o = -std=c++11 ++LDLIBS-tst-assert-c++ = -lstdc++ ++CFLAGS-tst-assert-g++.o = -std=gnu++11 ++LDLIBS-tst-assert-g++ = -lstdc++ ++else ++tests-unsupported += tst-assert-c++ tst-assert-g++ ++endif +diff --git a/assert/assert.h b/assert/assert.h +index 6801cfeb10..640c95c063 100644 +--- a/assert/assert.h ++++ b/assert/assert.h +@@ -85,7 +85,12 @@ __END_DECLS + /* When possible, define assert so that it does not add extra + parentheses around EXPR. Otherwise, those added parentheses would + suppress warnings we'd expect to be detected by gcc's -Wparentheses. */ +-# if !defined __GNUC__ || defined __STRICT_ANSI__ ++# if defined __cplusplus ++# define assert(expr) \ ++ (static_cast (expr) \ ++ ? void (0) \ ++ : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION)) ++# elif !defined __GNUC__ || defined __STRICT_ANSI__ + # define assert(expr) \ + ((expr) \ + ? __ASSERT_VOID_CAST (0) \ +@@ -93,12 +98,11 @@ __END_DECLS + # else + /* The first occurrence of EXPR is not evaluated due to the sizeof, + but will trigger any pedantic warnings masked by the __extension__ +- for the second occurrence. The explicit comparison against zero is +- required to support function pointers and bit fields in this +- context, and to suppress the evaluation of variable length +- arrays. */ ++ for the second occurrence. The ternary operator is required to ++ support function pointers and bit fields in this context, and to ++ suppress the evaluation of variable length arrays. */ + # define assert(expr) \ +- ((void) sizeof ((expr) == 0), __extension__ ({ \ ++ ((void) sizeof ((expr) ? 1 : 0), __extension__ ({ \ + if (expr) \ + ; /* empty */ \ + else \ +diff --git a/assert/tst-assert-c++.cc b/assert/tst-assert-c++.cc +new file mode 100644 +index 0000000000..12a5e690cb +--- /dev/null ++++ b/assert/tst-assert-c++.cc +@@ -0,0 +1,78 @@ ++/* Tests for interactions between C++ and assert. ++ Copyright (C) 2017 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 ++ ++/* The C++ standard requires that if the assert argument is a constant ++ subexpression, then the assert itself is one, too. */ ++constexpr int ++check_constexpr () ++{ ++ return (assert (true), 1); ++} ++ ++/* Objects of this class can be contextually converted to bool, but ++ cannot be compared to int. */ ++struct no_int ++{ ++ no_int () = default; ++ no_int (const no_int &) = delete; ++ ++ explicit operator bool () const ++ { ++ return true; ++ } ++ ++ bool operator! () const; /* No definition. */ ++ template bool operator== (T) const; /* No definition. */ ++ template bool operator!= (T) const; /* No definition. */ ++}; ++ ++/* This class tests that operator== is not used by assert. */ ++struct bool_and_int ++{ ++ bool_and_int () = default; ++ bool_and_int (const no_int &) = delete; ++ ++ explicit operator bool () const ++ { ++ return true; ++ } ++ ++ bool operator! () const; /* No definition. */ ++ template bool operator== (T) const; /* No definition. */ ++ template bool operator!= (T) const; /* No definition. */ ++}; ++ ++static int ++do_test () ++{ ++ { ++ no_int value; ++ assert (value); ++ } ++ ++ { ++ bool_and_int value; ++ assert (value); ++ } ++ ++ return 0; ++} ++ ++#include +diff --git a/assert/tst-assert-g++.cc b/assert/tst-assert-g++.cc +new file mode 100644 +index 0000000000..8c06402825 +--- /dev/null ++++ b/assert/tst-assert-g++.cc +@@ -0,0 +1,19 @@ ++/* Tests for interactions between C++ and assert. GNU C++11 version. ++ Copyright (C) 2017 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 + diff --git a/srcpkgs/glibc/patches/glibc-upstream-13.patch b/srcpkgs/glibc/patches/glibc-upstream-13.patch new file mode 100644 index 00000000000..dc98e5c88bd --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-13.patch @@ -0,0 +1,27 @@ +From 3aeab55ee17ca527e4597bc8397c0434c3f8b34e Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Mon, 21 Aug 2017 15:45:57 -0300 +Subject: [PATCH 13] Add missing bug fixes to NEWS + +--- + NEWS | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/NEWS b/NEWS +index 1996e5fbef..0534c5296e 100644 +--- a/NEWS ++++ b/NEWS +@@ -10,9 +10,12 @@ Version 2.26.1 + The following bugs are resolved with this release: + + [21242] assert: Suppress pedantic warning caused by statement expression ++ [21780] posix: Set p{read,write}v2 to return ENOTSUP ++ [21871] x86-64: Use _dl_runtime_resolve_opt only with AVX512F + [21885] getaddrinfo: Release resolver context on error in gethosts + [21930] Do not use __builtin_types_compatible_p in C++ mode + [21932] Unpaired __resolv_context_get in generic get*_r implementation ++ [21941] powerpc: Restrict xssqrtqp operands to Vector Registers + [21972] assert macro requires operator== (int) for its argument type + + Version 2.26 + diff --git a/srcpkgs/glibc/patches/glibc-upstream-14.patch b/srcpkgs/glibc/patches/glibc-upstream-14.patch new file mode 100644 index 00000000000..f5052b97d80 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-14.patch @@ -0,0 +1,62 @@ +From 77db8772bd3f6f2bbad697dcf46861ce310f5b95 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Thu, 10 Aug 2017 16:06:52 +0200 +Subject: [PATCH 14] __inet6_scopeid_pton: Remove attribute_hidden, + internal_function + +The hidden attribute was overridden by libc_hidden_proto on GNU/Linux. +It is incorrect because the function is used from nscd. + +internal_function is not supposed to be used across DSO boundaries, +so this commit removes it (again, due to the use in nscd). + +(cherry picked from commit f87cc2bfba9b844da48a63441c6099342b1551c7) +--- + ChangeLog | 7 +++++++ + inet/inet6_scopeid_pton.c | 2 +- + inet/net-internal.h | 3 +-- + 3 files changed, 9 insertions(+), 3 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 8bc3ad9a46..ad05da8ade 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,10 @@ ++2017-08-10 Florian Weimer ++ ++ * inet/net-internal.h (__inet6_scopeid_pton): Remove ++ attribute_hidden, internal_function. ++ * inet/inet6_scopeid_pton.c (__inet6_scopeid_pton): Remove ++ internal_function. ++ + 2017-08-21 Florian Weimer + + [BZ #21972] +diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c +index e09b1cb34d..cc8803fa10 100644 +--- a/inet/inet6_scopeid_pton.c ++++ b/inet/inet6_scopeid_pton.c +@@ -28,7 +28,7 @@ + + /* Parse SOURCE as a scope ID for ADDRESS. Return 0 on success and -1 + on error. */ +-internal_function int ++int + __inet6_scopeid_pton (const struct in6_addr *address, const char *scope, + uint32_t *result) + { +diff --git a/inet/net-internal.h b/inet/net-internal.h +index 2b2632c7ba..b2135893e8 100644 +--- a/inet/net-internal.h ++++ b/inet/net-internal.h +@@ -25,8 +25,7 @@ + #include + + int __inet6_scopeid_pton (const struct in6_addr *address, +- const char *scope, uint32_t *result) +- internal_function attribute_hidden; ++ const char *scope, uint32_t *result); + libc_hidden_proto (__inet6_scopeid_pton) + + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-15.patch b/srcpkgs/glibc/patches/glibc-upstream-15.patch new file mode 100644 index 00000000000..30580f4c775 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-15.patch @@ -0,0 +1,81 @@ +From 6043d77a47de297b62084c1c261cdada082bf09c Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Mon, 28 Aug 2017 19:49:18 +0200 +Subject: [PATCH 15] ldd: never run file directly + +(cherry picked from commit eedca9772e99c72ab4c3c34e43cc764250aa3e3c) +--- + ChangeLog | 6 ++++++ + NEWS | 9 +++++++++ + elf/ldd.bash.in | 14 +------------- + 3 files changed, 16 insertions(+), 13 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index ad05da8ade..fa27c6f66f 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2017-08-16 Andreas Schwab ++ ++ [BZ #16750] ++ CVE-2009-5064 ++ * elf/ldd.bash.in: Never run file directly. ++ + 2017-08-10 Florian Weimer + + * inet/net-internal.h (__inet6_scopeid_pton): Remove +diff --git a/NEWS b/NEWS +index 0534c5296e..756e849643 100644 +--- a/NEWS ++++ b/NEWS +@@ -7,8 +7,17 @@ using `glibc' in the "product" field. + + Version 2.26.1 + ++Security related changes: ++ ++ CVE-2009-5064: The ldd script would sometimes run the program under ++ examination directly, without preventing code execution through the ++ dynamic linker. (The glibc project disputes that this is a security ++ vulnerability; only trusted binaries must be examined using the ldd ++ script.) ++ + The following bugs are resolved with this release: + ++ [16750] ldd: Never run file directly. + [21242] assert: Suppress pedantic warning caused by statement expression + [21780] posix: Set p{read,write}v2 to return ENOTSUP + [21871] x86-64: Use _dl_runtime_resolve_opt only with AVX512F +diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in +index 7dd1fccf24..686785e235 100644 +--- a/elf/ldd.bash.in ++++ b/elf/ldd.bash.in +@@ -164,18 +164,6 @@ warning: you do not have execution permission for" "\`$file'" >&2 + fi + done + case $ret in +- 0) +- # If the program exits with exit code 5, it means the process has been +- # invoked with __libc_enable_secure. Fall back to running it through +- # the dynamic linker. +- try_trace "$file" +- rc=$? +- if [ $rc = 5 ]; then +- try_trace "$RTLD" "$file" +- rc=$? +- fi +- [ $rc = 0 ] || result=1 +- ;; + 1) + # This can be a non-ELF binary or no binary at all. + nonelf "$file" || { +@@ -183,7 +171,7 @@ warning: you do not have execution permission for" "\`$file'" >&2 + result=1 + } + ;; +- 2) ++ 0|2) + try_trace "$RTLD" "$file" || result=1 + ;; + *) + diff --git a/srcpkgs/glibc/patches/glibc-upstream-16.patch b/srcpkgs/glibc/patches/glibc-upstream-16.patch new file mode 100644 index 00000000000..df031adc539 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-16.patch @@ -0,0 +1,244 @@ +From ef8566d72af5e03c1b82cf02efb794268a347f8c Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Mon, 14 Aug 2017 13:46:15 -0300 +Subject: [PATCH 16] Provide a C++ version of issignaling that does not use + __MATH_TG + +The macro __MATH_TG contains the logic to select between long double and +_Float128, when these types are ABI-distinct. This logic relies on +__builtin_types_compatible_p, which is not available in C++ mode. + +On the other hand, C++ function overloading provides the means to +distinguish between the floating-point types. The overloading +resolution will match the correct parameter regardless of type +qualifiers, i.e.: const and volatile. + +Tested for powerpc64le, s390x, and x86_64. + + * math/math.h [defined __cplusplus] (issignaling): Provide a C++ + definition for issignaling that does not rely on __MATH_TG, + since __MATH_TG uses __builtin_types_compatible_p, which is only + available in C mode. + (CFLAGS-test-math-issignaling.cc): New variable. + * math/Makefile [CXX] (tests): Add test-math-issignaling. + * math/test-math-issignaling.cc: New test for C++ implementation + of type-generic issignaling. + * sysdeps/powerpc/powerpc64le/Makefile [subdir == math] + (CXXFLAGS-test-math-issignaling.cc): Add -mfloat128 to the build + options of test-math-issignaling on powerpc64le. + +(cherry picked from commit a16e8bc08edca84d507715c66d6cddbbc7ed3b62) +--- + ChangeLog | 14 +++++ + math/Makefile | 3 +- + math/math.h | 19 +++++- + math/test-math-issignaling.cc | 113 +++++++++++++++++++++++++++++++++++ + sysdeps/powerpc/powerpc64le/Makefile | 1 + + 5 files changed, 148 insertions(+), 2 deletions(-) + create mode 100644 math/test-math-issignaling.cc + +diff --git a/ChangeLog b/ChangeLog +index fa27c6f66f..527026ba5d 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,17 @@ ++2017-08-22 Gabriel F. T. Gomes ++ ++ * math/math.h [defined __cplusplus] (issignaling): Provide a C++ ++ definition for issignaling that does not rely on __MATH_TG, ++ since __MATH_TG uses __builtin_types_compatible_p, which is only ++ available in C mode. ++ (CFLAGS-test-math-issignaling.cc): New variable. ++ * math/Makefile [CXX] (tests): Add test-math-issignaling. ++ * math/test-math-issignaling.cc: New test for C++ implementation ++ of type-generic issignaling. ++ * sysdeps/powerpc/powerpc64le/Makefile [subdir == math] ++ (CXXFLAGS-test-math-issignaling.cc): Add -mfloat128 to the build ++ options of test-math-issignaling on powerpc64le. ++ + 2017-08-16 Andreas Schwab + + [BZ #16750] +diff --git a/math/Makefile b/math/Makefile +index e09b0c0545..0130fcf38b 100644 +--- a/math/Makefile ++++ b/math/Makefile +@@ -203,7 +203,7 @@ tests-static = test-fpucw-static test-fpucw-ieee-static \ + test-signgam-ullong-static test-signgam-ullong-init-static + + ifneq (,$(CXX)) +-tests += test-math-isinff test-math-iszero ++tests += test-math-isinff test-math-iszero test-math-issignaling + endif + + ifneq (no,$(PERL)) +@@ -350,6 +350,7 @@ CFLAGS-test-signgam-ullong-init-static.c = -std=c99 + + CFLAGS-test-math-isinff.cc = -std=gnu++11 + CFLAGS-test-math-iszero.cc = -std=gnu++11 ++CFLAGS-test-math-issignaling.cc = -std=gnu++11 + + CFLAGS-test-iszero-excess-precision.c = -fexcess-precision=standard + CFLAGS-test-iseqsig-excess-precision.c = -fexcess-precision=standard +diff --git a/math/math.h b/math/math.h +index dea8dbe1ae..add86af724 100644 +--- a/math/math.h ++++ b/math/math.h +@@ -474,7 +474,24 @@ enum + # include + + /* Return nonzero value if X is a signaling NaN. */ +-# define issignaling(x) __MATH_TG ((x), __issignaling, (x)) ++# ifndef __cplusplus ++# define issignaling(x) __MATH_TG ((x), __issignaling, (x)) ++# else ++ /* In C++ mode, __MATH_TG cannot be used, because it relies on ++ __builtin_types_compatible_p, which is a C-only builtin. On the ++ other hand, overloading provides the means to distinguish between ++ the floating-point types. The overloading resolution will match ++ the correct parameter (regardless of type qualifiers (i.e.: const ++ and volatile). */ ++extern "C++" { ++inline int issignaling (float __val) { return __issignalingf (__val); } ++inline int issignaling (double __val) { return __issignaling (__val); } ++inline int issignaling (long double __val) { return __issignalingl (__val); } ++# if __HAVE_DISTINCT_FLOAT128 ++inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } ++# endif ++} /* extern C++ */ ++# endif + + /* Return nonzero value if X is subnormal. */ + # define issubnormal(x) (fpclassify (x) == FP_SUBNORMAL) +diff --git a/math/test-math-issignaling.cc b/math/test-math-issignaling.cc +new file mode 100644 +index 0000000000..22ae9e1bca +--- /dev/null ++++ b/math/test-math-issignaling.cc +@@ -0,0 +1,113 @@ ++/* Test for the C++ implementation of issignaling. ++ Copyright (C) 2017 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 ++ . */ ++ ++#define _GNU_SOURCE 1 ++#include ++#include ++ ++#include ++ ++/* There is no signaling_NaN for _Float128 in std::numeric_limits. ++ Include ieee754_float128.h and use the bitfields in the union ++ ieee854_float128.ieee_nan to build a signaling NaN. */ ++#if __HAVE_DISTINCT_FLOAT128 ++# include ++#endif ++ ++static bool errors; ++ ++static void ++check (int actual, int expected, const char *actual_expr, int line) ++{ ++ if (actual != expected) ++ { ++ errors = true; ++ printf ("%s:%d: error: %s\n", __FILE__, line, actual_expr); ++ printf ("%s:%d: expected: %d\n", __FILE__, line, expected); ++ printf ("%s:%d: actual: %d\n", __FILE__, line, actual); ++ } ++} ++ ++#define CHECK(actual, expected) \ ++ check ((actual), (expected), #actual, __LINE__) ++ ++template ++static void ++check_type () ++{ ++ typedef std::numeric_limits limits; ++ CHECK (issignaling (T{0}), 0); ++ if (limits::has_infinity) ++ { ++ CHECK (issignaling (limits::infinity ()), 0); ++ CHECK (issignaling (-limits::infinity ()), 0); ++ } ++ if (limits::has_quiet_NaN) ++ CHECK (issignaling (limits::quiet_NaN ()), 0); ++ if (limits::has_signaling_NaN) ++ CHECK (issignaling (limits::signaling_NaN ()), 1); ++} ++ ++#if __HAVE_DISTINCT_FLOAT128 ++static void ++check_float128 () ++{ ++ ieee854_float128 q; ++ ++ q.d = 0; ++ CHECK (issignaling (q.d), 0); ++ ++ /* Infinity. */ ++ q.ieee.negative = 0; ++ q.ieee.exponent = 0x7FFF; ++ q.ieee.mantissa0 = 0x0000; ++ q.ieee.mantissa1 = 0x00000000; ++ q.ieee.mantissa2 = 0x00000000; ++ q.ieee.mantissa3 = 0x00000000; ++ CHECK (issignaling (q.d), 0); ++ ++ /* Quiet NaN. */ ++ q.ieee_nan.quiet_nan = 1; ++ q.ieee_nan.mantissa0 = 0x0000; ++ CHECK (issignaling (q.d), 0); ++ ++ /* Still a quiet NaN. */ ++ q.ieee_nan.quiet_nan = 1; ++ q.ieee_nan.mantissa0 = 0x4000; ++ CHECK (issignaling (q.d), 0); ++ ++ /* Signaling NaN. */ ++ q.ieee_nan.quiet_nan = 0; ++ q.ieee_nan.mantissa0 = 0x4000; ++ CHECK (issignaling (q.d), 1); ++} ++#endif ++ ++static int ++do_test (void) ++{ ++ check_type (); ++ check_type (); ++ check_type (); ++#if __HAVE_DISTINCT_FLOAT128 ++ check_float128 (); ++#endif ++ return errors; ++} ++ ++#include +diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile +index 77617b670a..19adbfa1c1 100644 +--- a/sysdeps/powerpc/powerpc64le/Makefile ++++ b/sysdeps/powerpc/powerpc64le/Makefile +@@ -16,6 +16,7 @@ $(foreach suf,$(all-object-suffixes),%f128_r$(suf)): CFLAGS += -mfloat128 + $(foreach suf,$(all-object-suffixes),$(objpfx)test-float128%$(suf)): CFLAGS += -mfloat128 + $(foreach suf,$(all-object-suffixes),$(objpfx)test-ifloat128%$(suf)): CFLAGS += -mfloat128 + CFLAGS-libm-test-support-float128.c += -mfloat128 ++CFLAGS-test-math-issignaling.cc += -mfloat128 + $(objpfx)test-float128% $(objpfx)test-ifloat128%: \ + gnulib-tests += $(f128-loader-link) + endif + diff --git a/srcpkgs/glibc/patches/glibc-upstream-17.patch b/srcpkgs/glibc/patches/glibc-upstream-17.patch new file mode 100644 index 00000000000..db039425ad0 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-17.patch @@ -0,0 +1,58 @@ +From 35dded99a89db873b06270ca7f21245a0faf712a Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Wed, 23 Aug 2017 10:16:54 -0300 +Subject: [PATCH 17] Fix the C++ version of issignaling when + __NO_LONG_DOUBLE_MATH is defined + +When __NO_LONG_DOUBLE_MATH is defined, __issignalingl is not available, +thus issignaling with long double argument should call __issignaling, +instead. + +Tested for powerpc64le. + + * math/math.h [defined __cplusplus] (issignaling): In the long + double case, call __issignalingl only if __NO_LONG_DOUBLE_MATH + is not defined. Call __issignaling, otherwise. + +(cherry picked from commit 3d7b66f66cb223e899a7ebc0f4c20f13e711c9e0) +--- + ChangeLog | 6 ++++++ + math/math.h | 10 +++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 527026ba5d..04b56b555c 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2017-08-24 Gabriel F. T. Gomes ++ ++ * math/math.h [defined __cplusplus] (issignaling): In the long ++ double case, call __issignalingl only if __NO_LONG_DOUBLE_MATH ++ is not defined. Call __issignaling, otherwise. ++ + 2017-08-22 Gabriel F. T. Gomes + + * math/math.h [defined __cplusplus] (issignaling): Provide a C++ +diff --git a/math/math.h b/math/math.h +index add86af724..60dfa31592 100644 +--- a/math/math.h ++++ b/math/math.h +@@ -486,7 +486,15 @@ enum + extern "C++" { + inline int issignaling (float __val) { return __issignalingf (__val); } + inline int issignaling (double __val) { return __issignaling (__val); } +-inline int issignaling (long double __val) { return __issignalingl (__val); } ++inline int ++issignaling (long double __val) ++{ ++# ifdef __NO_LONG_DOUBLE_MATH ++ return __issignaling (__val); ++# else ++ return __issignalingl (__val); ++# endif ++} + # if __HAVE_DISTINCT_FLOAT128 + inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } + # endif + diff --git a/srcpkgs/glibc/patches/glibc-upstream-18.patch b/srcpkgs/glibc/patches/glibc-upstream-18.patch new file mode 100644 index 00000000000..6808c0f512f --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-18.patch @@ -0,0 +1,232 @@ +From 58270c0049404ef2f878fdd45df55f17f0b8c1f7 Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Tue, 22 Aug 2017 16:34:42 -0300 +Subject: [PATCH 18] Provide a C++ version of iszero that does not use + __MATH_TG (bug 21930) + +When signaling nans are enabled (with -fsignaling-nans), the C++ version +of iszero uses the fpclassify macro, which is defined with __MATH_TG. +However, when support for float128 is available, __MATH_TG uses the +builtin __builtin_types_compatible_p, which is only available in C mode. + +This patch refactors the C++ version of iszero so that it uses function +overloading to select between the floating-point types, instead of +relying on fpclassify and __MATH_TG. + +Tested for powerpc64le, s390x, x86_64, and with build-many-glibcs.py. + + [BZ #21930] + * math/math.h [defined __cplusplus && defined __SUPPORT_SNAN__] + (iszero): New C++ implementation that does not use + fpclassify/__MATH_TG/__builtin_types_compatible_p, when + signaling nans are enabled, since __builtin_types_compatible_p + is a C-only feature. + * math/test-math-iszero.cc: When __HAVE_DISTINCT_FLOAT128 is + defined, include ieee754_float128.h for access to the union and + member ieee854_float128.ieee. + [__HAVE_DISTINCT_FLOAT128] (do_test): Call check_float128. + [__HAVE_DISTINCT_FLOAT128] (check_float128): New function. + * sysdeps/powerpc/powerpc64le/Makefile [subdir == math] + (CXXFLAGS-test-math-iszero.cc): Add -mfloat128 to the build + options of test-math-zero on powerpc64le. + +(cherry picked from commit 42496114ec0eb7d6d039d05d4262e109951c600c) +--- + ChangeLog | 17 ++++++++ + math/math.h | 33 +++++++++++++-- + math/test-math-iszero.cc | 79 ++++++++++++++++++++++++++++++++++++ + sysdeps/powerpc/powerpc64le/Makefile | 3 +- + 4 files changed, 127 insertions(+), 5 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 04b56b555c..23ded7f03d 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,20 @@ ++2017-08-28 Gabriel F. T. Gomes ++ ++ [BZ #21930] ++ * math/math.h [defined __cplusplus && defined __SUPPORT_SNAN__] ++ (iszero): New C++ implementation that does not use ++ fpclassify/__MATH_TG/__builtin_types_compatible_p, when ++ signaling nans are enabled, since __builtin_types_compatible_p ++ is a C-only feature. ++ * math/test-math-iszero.cc: When __HAVE_DISTINCT_FLOAT128 is ++ defined, include ieee754_float128.h for access to the union and ++ member ieee854_float128.ieee. ++ [__HAVE_DISTINCT_FLOAT128] (do_test): Call check_float128. ++ [__HAVE_DISTINCT_FLOAT128] (check_float128): New function. ++ * sysdeps/powerpc/powerpc64le/Makefile [subdir == math] ++ (CXXFLAGS-test-math-iszero.cc): Add -mfloat128 to the build ++ options of test-math-zero on powerpc64le. ++ + 2017-08-24 Gabriel F. T. Gomes + + * math/math.h [defined __cplusplus] (issignaling): In the long +diff --git a/math/math.h b/math/math.h +index 60dfa31592..7c0fc6dbb3 100644 +--- a/math/math.h ++++ b/math/math.h +@@ -513,15 +513,40 @@ inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } + # endif + # else /* __cplusplus */ + extern "C++" { ++# ifdef __SUPPORT_SNAN__ ++inline int ++iszero (float __val) ++{ ++ return __fpclassifyf (__val) == FP_ZERO; ++} ++inline int ++iszero (double __val) ++{ ++ return __fpclassify (__val) == FP_ZERO; ++} ++inline int ++iszero (long double __val) ++{ ++# ifdef __NO_LONG_DOUBLE_MATH ++ return __fpclassify (__val) == FP_ZERO; ++# else ++ return __fpclassifyl (__val) == FP_ZERO; ++# endif ++} ++# if __HAVE_DISTINCT_FLOAT128 ++inline int ++iszero (_Float128 __val) ++{ ++ return __fpclassifyf128 (__val) == FP_ZERO; ++} ++# endif ++# else + template inline bool + iszero (__T __val) + { +-# ifdef __SUPPORT_SNAN__ +- return fpclassify (__val) == FP_ZERO; +-# else + return __val == 0; +-# endif + } ++# endif + } /* extern C++ */ + # endif /* __cplusplus */ + #endif /* Use IEC_60559_BFP_EXT. */ +diff --git a/math/test-math-iszero.cc b/math/test-math-iszero.cc +index 027e972654..5c07261626 100644 +--- a/math/test-math-iszero.cc ++++ b/math/test-math-iszero.cc +@@ -22,6 +22,13 @@ + + #include + ++/* Support for _Float128 in std::numeric_limits is limited. ++ Include ieee754_float128.h and use the bitfields in the union ++ ieee854_float128.ieee_nan to build corner-case inputs. */ ++#if __HAVE_DISTINCT_FLOAT128 ++# include ++#endif ++ + static bool errors; + + static void +@@ -72,12 +79,84 @@ check_type () + std::numeric_limits::has_denorm == std::denorm_absent); + } + ++#if __HAVE_DISTINCT_FLOAT128 ++static void ++check_float128 () ++{ ++ ieee854_float128 q; ++ ++ q.d = 0.0Q; ++ CHECK (iszero (q.d), 1); ++ q.d = -0.0Q; ++ CHECK (iszero (q.d), 1); ++ q.d = 1.0Q; ++ CHECK (iszero (q.d), 0); ++ q.d = -1.0Q; ++ CHECK (iszero (q.d), 0); ++ ++ /* Normal min. */ ++ q.ieee.negative = 0; ++ q.ieee.exponent = 0x0001; ++ q.ieee.mantissa0 = 0x0000; ++ q.ieee.mantissa1 = 0x00000000; ++ q.ieee.mantissa2 = 0x00000000; ++ q.ieee.mantissa3 = 0x00000000; ++ CHECK (iszero (q.d), 0); ++ q.ieee.negative = 1; ++ CHECK (iszero (q.d), 0); ++ ++ /* Normal max. */ ++ q.ieee.negative = 0; ++ q.ieee.exponent = 0x7FFE; ++ q.ieee.mantissa0 = 0xFFFF; ++ q.ieee.mantissa1 = 0xFFFFFFFF; ++ q.ieee.mantissa2 = 0xFFFFFFFF; ++ q.ieee.mantissa3 = 0xFFFFFFFF; ++ CHECK (iszero (q.d), 0); ++ q.ieee.negative = 1; ++ CHECK (iszero (q.d), 0); ++ ++ /* Infinity. */ ++ q.ieee.negative = 0; ++ q.ieee.exponent = 0x7FFF; ++ q.ieee.mantissa0 = 0x0000; ++ q.ieee.mantissa1 = 0x00000000; ++ q.ieee.mantissa2 = 0x00000000; ++ q.ieee.mantissa3 = 0x00000000; ++ CHECK (iszero (q.d), 0); ++ ++ /* Quiet NaN. */ ++ q.ieee_nan.quiet_nan = 1; ++ q.ieee_nan.mantissa0 = 0x0000; ++ CHECK (iszero (q.d), 0); ++ ++ /* Signaling NaN. */ ++ q.ieee_nan.quiet_nan = 0; ++ q.ieee_nan.mantissa0 = 0x4000; ++ CHECK (iszero (q.d), 0); ++ ++ /* Denormal min. */ ++ q.ieee.negative = 0; ++ q.ieee.exponent = 0x0000; ++ q.ieee.mantissa0 = 0x0000; ++ q.ieee.mantissa1 = 0x00000000; ++ q.ieee.mantissa2 = 0x00000000; ++ q.ieee.mantissa3 = 0x00000001; ++ CHECK (iszero (q.d), 0); ++ q.ieee.negative = 1; ++ CHECK (iszero (q.d), 0); ++} ++#endif ++ + static int + do_test (void) + { + check_type (); + check_type (); + check_type (); ++#if __HAVE_DISTINCT_FLOAT128 ++ check_float128 (); ++#endif + return errors; + } + +diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile +index 19adbfa1c1..dea2290736 100644 +--- a/sysdeps/powerpc/powerpc64le/Makefile ++++ b/sysdeps/powerpc/powerpc64le/Makefile +@@ -17,7 +17,8 @@ $(foreach suf,$(all-object-suffixes),$(objpfx)test-float128%$(suf)): CFLAGS += - + $(foreach suf,$(all-object-suffixes),$(objpfx)test-ifloat128%$(suf)): CFLAGS += -mfloat128 + CFLAGS-libm-test-support-float128.c += -mfloat128 + CFLAGS-test-math-issignaling.cc += -mfloat128 +-$(objpfx)test-float128% $(objpfx)test-ifloat128%: \ ++CFLAGS-test-math-iszero.cc += -mfloat128 ++$(objpfx)test-float128% $(objpfx)test-ifloat128% $(objpfx)test-math-iszero: \ + gnulib-tests += $(f128-loader-link) + endif + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-19.patch b/srcpkgs/glibc/patches/glibc-upstream-19.patch new file mode 100644 index 00000000000..9689b977f2a --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-19.patch @@ -0,0 +1,61 @@ +From 947e2e0a9410c18eb44144456c7fe8e7c0e2a999 Mon Sep 17 00:00:00 2001 +From: Joseph Myers +Date: Tue, 22 Aug 2017 00:30:51 +0000 +Subject: [PATCH 19] Fix position of tests-unsupported definition in + assert/Makefile. + +tests-unsupported has to be defined before the inclusion of Rules in a +subdirectory Makefile; otherwise it is ineffective. This patch fixes +the ordering in assert/Makefile, where a recent test addition put +tests-unsupported too late (resulting in build failures when the C++ +compiler was missing or broken, and thereby showing up the unrelated +bug 21987). + +Incidentally, I don't see why these tests depend on +$(have-cxx-thread_local) rather than just a working C++ compiler. + +Tested in such a configuration (broken compiler/libstdc++) with +build-many-glibcs.py. + + * assert/Makefile [$(have-cxx-thread_local)]: Move conditional + variable definitions above inclusion of ../Rules. + +(cherry picked from commit 75dfe623df945db7dd3c12a206d743c45c16b5ed) +--- + ChangeLog | 5 +++++ + assert/Makefile | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 23ded7f03d..87fa54c57b 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++2017-08-22 Joseph Myers ++ ++ * assert/Makefile [$(have-cxx-thread_local)]: Move conditional ++ variable definitions above inclusion of ../Rules. ++ + 2017-08-28 Gabriel F. T. Gomes + + [BZ #21930] +diff --git a/assert/Makefile b/assert/Makefile +index 9ec1be81a9..222ab516f0 100644 +--- a/assert/Makefile ++++ b/assert/Makefile +@@ -27,8 +27,6 @@ headers := assert.h + routines := assert assert-perr __assert + tests := test-assert test-assert-perr tst-assert-c++ tst-assert-g++ + +-include ../Rules +- + ifeq ($(have-cxx-thread_local),yes) + CFLAGS-tst-assert-c++.o = -std=c++11 + LDLIBS-tst-assert-c++ = -lstdc++ +@@ -37,3 +35,5 @@ LDLIBS-tst-assert-g++ = -lstdc++ + else + tests-unsupported += tst-assert-c++ tst-assert-g++ + endif ++ ++include ../Rules + diff --git a/srcpkgs/glibc/patches/glibc-upstream-20.patch b/srcpkgs/glibc/patches/glibc-upstream-20.patch new file mode 100644 index 00000000000..b55d3448778 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-20.patch @@ -0,0 +1,47 @@ +From 4fdd75e4463801b9d8f329769df1a26145560656 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Tue, 8 Aug 2017 18:48:05 +0200 +Subject: [PATCH 20] getaddrinfo: Remove unreachable return statement from + gaih_inet + +(cherry picked from commit 0df595b23a829c9169ec418a19eef9006b4ae801) +--- + ChangeLog | 5 +++++ + sysdeps/posix/getaddrinfo.c | 10 +++------- + 2 files changed, 8 insertions(+), 7 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 87fa54c57b..591c753fcc 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++2017-08-08 Florian Weimer ++ ++ * sysdeps/posix/getaddrinfo.c (gaih_inet): Remove unreachable ++ return statement. ++ + 2017-08-22 Joseph Myers + + * assert/Makefile [$(have-cxx-thread_local)]: Move conditional +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 699411cc92..09f85fc472 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -420,13 +420,9 @@ gaih_inet (const char *name, const struct gaih_service *service, + alloca_account (sizeof (struct gaih_servtuple), + alloca_used); + +- if ((rc = gaih_inet_serv (service->name, +- tp, req, newp, tmpbuf))) +- { +- if (rc) +- continue; +- return rc; +- } ++ if (gaih_inet_serv (service->name, ++ tp, req, newp, tmpbuf) != 0) ++ continue; + + *pst = newp; + pst = &(newp->next); + diff --git a/srcpkgs/glibc/patches/glibc-upstream-21.patch b/srcpkgs/glibc/patches/glibc-upstream-21.patch new file mode 100644 index 00000000000..54baffe3635 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-21.patch @@ -0,0 +1,99 @@ +From 5253749232749adb535d9b2bf7d43173b191ebef Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Mon, 4 Sep 2017 11:44:10 +0200 +Subject: [PATCH 21] Synchronize support/ infrastructure with master + +This commit updates the support/ subdirectory to +commit 65329bd233db9d1b8b94e90734a564705b619260 +on the master branch. +--- + support/namespace.h | 11 ++++++++--- + support/support_chroot.c | 32 +++++++++++++++++++++++--------- + 2 files changed, 31 insertions(+), 12 deletions(-) + +diff --git a/support/namespace.h b/support/namespace.h +index 859c2fda3f..9eddb1a0e9 100644 +--- a/support/namespace.h ++++ b/support/namespace.h +@@ -66,7 +66,9 @@ struct support_chroot_configuration + { + /* File contents. The files are not created if the field is + NULL. */ +- const char *resolv_conf; ++ const char *resolv_conf; /* /etc/resolv.conf. */ ++ const char *hosts; /* /etc/hosts. */ ++ const char *host_conf; /* /etc/host.conf. */ + }; + + /* The result of the creation of a chroot. */ +@@ -78,8 +80,11 @@ struct support_chroot + /* Path to the chroot directory. */ + char *path_chroot; + +- /* Path to the /etc/resolv.conf file. */ +- char *path_resolv_conf; ++ /* Paths to files in the chroot. These are absolute and outside of ++ the chroot. */ ++ char *path_resolv_conf; /* /etc/resolv.conf. */ ++ char *path_hosts; /* /etc/hosts. */ ++ char *path_host_conf; /* /etc/host.conf. */ + }; + + /* Create a chroot environment. The returned data should be freed +diff --git a/support/support_chroot.c b/support/support_chroot.c +index c0807b313a..f3ef551b05 100644 +--- a/support/support_chroot.c ++++ b/support/support_chroot.c +@@ -24,6 +24,23 @@ + #include + #include + ++/* If CONTENTS is not NULL, write it to the file at DIRECTORY/RELPATH, ++ and store the name in *ABSPATH. If CONTENTS is NULL, store NULL in ++ *ABSPATH. */ ++static void ++write_file (const char *directory, const char *relpath, const char *contents, ++ char **abspath) ++{ ++ if (contents != NULL) ++ { ++ *abspath = xasprintf ("%s/%s", directory, relpath); ++ add_temp_file (*abspath); ++ support_write_file_string (*abspath, contents); ++ } ++ else ++ *abspath = NULL; ++} ++ + struct support_chroot * + support_chroot_create (struct support_chroot_configuration conf) + { +@@ -39,15 +56,10 @@ support_chroot_create (struct support_chroot_configuration conf) + xmkdir (path_etc, 0777); + add_temp_file (path_etc); + +- if (conf.resolv_conf != NULL) +- { +- /* Create an empty resolv.conf file. */ +- chroot->path_resolv_conf = xasprintf ("%s/resolv.conf", path_etc); +- add_temp_file (chroot->path_resolv_conf); +- support_write_file_string (chroot->path_resolv_conf, conf.resolv_conf); +- } +- else +- chroot->path_resolv_conf = NULL; ++ write_file (path_etc, "resolv.conf", conf.resolv_conf, ++ &chroot->path_resolv_conf); ++ write_file (path_etc, "hosts", conf.hosts, &chroot->path_hosts); ++ write_file (path_etc, "host.conf", conf.host_conf, &chroot->path_host_conf); + + free (path_etc); + +@@ -67,5 +79,7 @@ support_chroot_free (struct support_chroot *chroot) + { + free (chroot->path_chroot); + free (chroot->path_resolv_conf); ++ free (chroot->path_hosts); ++ free (chroot->path_host_conf); + free (chroot); + } + diff --git a/srcpkgs/glibc/patches/glibc-upstream-22.patch b/srcpkgs/glibc/patches/glibc-upstream-22.patch new file mode 100644 index 00000000000..d7d77db1d8d --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-22.patch @@ -0,0 +1,117 @@ +From bdd8422cfb1fe04cb20617495156fb232b00d23c Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Fri, 1 Sep 2017 08:56:46 +0200 +Subject: [PATCH 22] getaddrinfo: Use &errno has the errno pointer + +Similar code in nss/getXXbyYY_r.c is already using &errno as the +argument. + +(cherry picked from commit 924b121c5978689001ae28cf1c8497371dad4f71) +--- + ChangeLog | 6 ++++++ + sysdeps/posix/getaddrinfo.c | 23 ++++++++++------------- + 2 files changed, 16 insertions(+), 13 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 591c753fcc..04304bb929 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2017-09-01 Florian Weimer ++ ++ * sysdeps/posix/getaddrinfo.c (gethosts): Use errno directly. ++ (getcanonname): Likewise. ++ (gaih_inet): Likewise. ++ + 2017-08-08 Florian Weimer + + * sysdeps/posix/getaddrinfo.c (gaih_inet): Remove unreachable +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 09f85fc472..1a16820b7e 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -247,11 +247,10 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + char *localcanon = NULL; \ + no_data = 0; \ + while (1) { \ +- rc = 0; \ + status = DL_CALL_FCT (fct, (name, _family, &th, \ + tmpbuf->data, tmpbuf->length, \ +- &rc, &herrno, NULL, &localcanon)); \ +- if (rc != ERANGE || herrno != NETDB_INTERNAL) \ ++ &errno, &herrno, NULL, &localcanon)); \ ++ if (errno != ERANGE || herrno != NETDB_INTERNAL) \ + break; \ + if (!scratch_buffer_grow (tmpbuf)) \ + { \ +@@ -261,11 +260,11 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + goto free_and_return; \ + } \ + } \ +- if (status == NSS_STATUS_SUCCESS && rc == 0) \ ++ if (status == NSS_STATUS_SUCCESS && errno == 0) \ + h = &th; \ + else \ + h = NULL; \ +- if (rc != 0) \ ++ if (errno != 0) \ + { \ + if (herrno == NETDB_INTERNAL) \ + { \ +@@ -335,9 +334,8 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) + { + char buf[256]; + int herrno; +- int rc; + if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), +- &s, &rc, &herrno)) != NSS_STATUS_SUCCESS) ++ &s, &errno, &herrno)) != NSS_STATUS_SUCCESS) + /* If the canonical name cannot be determined, use the passed + string. */ + s = (char *) name; +@@ -353,7 +351,6 @@ gaih_inet (const char *name, const struct gaih_service *service, + const struct gaih_typeproto *tp = gaih_inet_typeproto; + struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv; + struct gaih_addrtuple *at = NULL; +- int rc; + bool got_ipv6 = false; + const char *canon = NULL; + const char *orig_name = name; +@@ -395,7 +392,8 @@ gaih_inet (const char *name, const struct gaih_service *service, + st = (struct gaih_servtuple *) + alloca_account (sizeof (struct gaih_servtuple), alloca_used); + +- if ((rc = gaih_inet_serv (service->name, tp, req, st, tmpbuf))) ++ int rc = gaih_inet_serv (service->name, tp, req, st, tmpbuf); ++ if (__glibc_unlikely (rc != 0)) + return rc; + } + else +@@ -495,7 +493,7 @@ gaih_inet (const char *name, const struct gaih_service *service, + idn_flags |= IDNA_USE_STD3_ASCII_RULES; + + char *p = NULL; +- rc = __idna_to_ascii_lz (name, &p, idn_flags); ++ int rc = __idna_to_ascii_lz (name, &p, idn_flags); + if (rc != IDNA_SUCCESS) + { + /* No need to jump to free_and_return here. */ +@@ -793,15 +791,14 @@ gaih_inet (const char *name, const struct gaih_service *service, + + while (1) + { +- rc = 0; + status = DL_CALL_FCT (fct4, (name, pat, + tmpbuf->data, tmpbuf->length, +- &rc, &herrno, ++ &errno, &herrno, + NULL)); + if (status == NSS_STATUS_SUCCESS) + break; + if (status != NSS_STATUS_TRYAGAIN +- || rc != ERANGE || herrno != NETDB_INTERNAL) ++ || errno != ERANGE || herrno != NETDB_INTERNAL) + { + if (herrno == TRY_AGAIN) + no_data = EAI_AGAIN; + diff --git a/srcpkgs/glibc/patches/glibc-upstream-23.patch b/srcpkgs/glibc/patches/glibc-upstream-23.patch new file mode 100644 index 00000000000..ad63bf88682 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-23.patch @@ -0,0 +1,171 @@ +From 701f7873da013fb19d9120317322cd78333e63c2 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Fri, 1 Sep 2017 08:57:07 +0200 +Subject: [PATCH 23] getaddrinfo: Use &h_errno has the h_errno pointer + +This simplifies the code because it is not necessary to propagate the +temporary h_errno value to the thread-local variable. It also increases +compatibility with NSS modules which update only one of the two places. + +(cherry picked from commit 53250a21b81474ef4e78090a4a9a63d8471e1091) +--- + ChangeLog | 6 ++++++ + sysdeps/posix/getaddrinfo.c | 46 ++++++++++++++++++--------------------------- + 2 files changed, 24 insertions(+), 28 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 04304bb929..d53c8fe083 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,11 @@ + 2017-09-01 Florian Weimer + ++ * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly. ++ (getcanonname): Likewise. ++ (gaih_inet): Likewise. ++ ++2017-09-01 Florian Weimer ++ + * sysdeps/posix/getaddrinfo.c (gethosts): Use errno directly. + (getcanonname): Likewise. + (gaih_inet): Likewise. +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 1a16820b7e..076e1fa62b 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -241,7 +241,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + + #define gethosts(_family, _type) \ + { \ +- int herrno; \ + struct hostent th; \ + struct hostent *h; \ + char *localcanon = NULL; \ +@@ -249,8 +248,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + while (1) { \ + status = DL_CALL_FCT (fct, (name, _family, &th, \ + tmpbuf->data, tmpbuf->length, \ +- &errno, &herrno, NULL, &localcanon)); \ +- if (errno != ERANGE || herrno != NETDB_INTERNAL) \ ++ &errno, &h_errno, NULL, &localcanon)); \ ++ if (errno != ERANGE || h_errno != NETDB_INTERNAL) \ + break; \ + if (!scratch_buffer_grow (tmpbuf)) \ + { \ +@@ -266,18 +265,17 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + h = NULL; \ + if (errno != 0) \ + { \ +- if (herrno == NETDB_INTERNAL) \ ++ if (h_errno == NETDB_INTERNAL) \ + { \ +- __set_h_errno (herrno); \ + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ + __resolv_context_put (res_ctx); \ + result = -EAI_SYSTEM; \ + goto free_and_return; \ + } \ +- if (herrno == TRY_AGAIN) \ ++ if (h_errno == TRY_AGAIN) \ + no_data = EAI_AGAIN; \ + else \ +- no_data = herrno == NO_DATA; \ ++ no_data = h_errno == NO_DATA; \ + } \ + else if (h != NULL) \ + { \ +@@ -333,9 +331,8 @@ getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name) + if (cfct != NULL) + { + char buf[256]; +- int herrno; + if (DL_CALL_FCT (cfct, (at->name ?: name, buf, sizeof (buf), +- &s, &errno, &herrno)) != NSS_STATUS_SUCCESS) ++ &s, &errno, &h_errno)) != NSS_STATUS_SUCCESS) + /* If the canonical name cannot be determined, use the passed + string. */ + s = (char *) name; +@@ -594,14 +591,13 @@ gaih_inet (const char *name, const struct gaih_service *service, + int rc; + struct hostent th; + struct hostent *h; +- int herrno; + + while (1) + { + rc = __gethostbyname2_r (name, AF_INET, &th, + tmpbuf->data, tmpbuf->length, +- &h, &herrno); +- if (rc != ERANGE || herrno != NETDB_INTERNAL) ++ &h, &h_errno); ++ if (rc != ERANGE || h_errno != NETDB_INTERNAL) + break; + if (!scratch_buffer_grow (tmpbuf)) + { +@@ -626,12 +622,9 @@ gaih_inet (const char *name, const struct gaih_service *service, + } + else + { +- if (herrno == NETDB_INTERNAL) +- { +- __set_h_errno (herrno); +- result = -EAI_SYSTEM; +- } +- else if (herrno == TRY_AGAIN) ++ if (h_errno == NETDB_INTERNAL) ++ result = -EAI_SYSTEM; ++ else if (h_errno == TRY_AGAIN) + result = -EAI_AGAIN; + else + /* We made requests but they turned out no data. +@@ -654,8 +647,7 @@ gaih_inet (const char *name, const struct gaih_service *service, + { + /* Try to use nscd. */ + struct nscd_ai_result *air = NULL; +- int herrno; +- int err = __nscd_getai (name, &air, &herrno); ++ int err = __nscd_getai (name, &air, &h_errno); + if (air != NULL) + { + /* Transform into gaih_addrtuple list. */ +@@ -746,9 +738,9 @@ gaih_inet (const char *name, const struct gaih_service *service, + goto free_and_return; + else if (__nss_not_use_nscd_hosts == 0) + { +- if (herrno == NETDB_INTERNAL && errno == ENOMEM) ++ if (h_errno == NETDB_INTERNAL && errno == ENOMEM) + result = -EAI_MEMORY; +- else if (herrno == TRY_AGAIN) ++ else if (h_errno == TRY_AGAIN) + result = -EAI_AGAIN; + else + result = -EAI_SYSTEM; +@@ -787,23 +779,21 @@ gaih_inet (const char *name, const struct gaih_service *service, + + if (fct4 != NULL) + { +- int herrno; +- + while (1) + { + status = DL_CALL_FCT (fct4, (name, pat, + tmpbuf->data, tmpbuf->length, +- &errno, &herrno, ++ &errno, &h_errno, + NULL)); + if (status == NSS_STATUS_SUCCESS) + break; + if (status != NSS_STATUS_TRYAGAIN +- || errno != ERANGE || herrno != NETDB_INTERNAL) ++ || errno != ERANGE || h_errno != NETDB_INTERNAL) + { +- if (herrno == TRY_AGAIN) ++ if (h_errno == TRY_AGAIN) + no_data = EAI_AGAIN; + else +- no_data = herrno == NO_DATA; ++ no_data = h_errno == NO_DATA; + break; + } + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-24.patch b/srcpkgs/glibc/patches/glibc-upstream-24.patch new file mode 100644 index 00000000000..45ab37f87e6 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-24.patch @@ -0,0 +1,56 @@ +From 8f46c6052408a23a77ecf46aa378120c1a4afe37 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Fri, 1 Sep 2017 08:57:28 +0200 +Subject: [PATCH 24] getaddrinfo: Properly set errno for NSS function lookup + failure + +(cherry picked from commit ad816a5e00ce891a2cea8187638fa0e00f83aaf6) +--- + ChangeLog | 5 +++++ + sysdeps/posix/getaddrinfo.c | 16 ++++++++++------ + 2 files changed, 15 insertions(+), 6 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index d53c8fe083..2f959d4c36 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,10 @@ + 2017-09-01 Florian Weimer + ++ * sysdeps/posix/getaddrinfo.c (gaih_inet): Make reporting of NSS ++ function lookup failures more reliable. ++ ++2017-09-01 Florian Weimer ++ + * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly. + (getcanonname): Likewise. + (gaih_inet): Likewise. +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 076e1fa62b..eaf8bafcf4 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -923,13 +923,17 @@ gaih_inet (const char *name, const struct gaih_service *service, + } + else + { ++ /* Could not locate any of the lookup functions. ++ The NSS lookup code does not consistently set ++ errno, so we need to supply our own error ++ code here. The root cause could either be a ++ resource allocation failure, or a missing ++ service function in the DSO (so it should not ++ be listed in /etc/nsswitch.conf). Assume the ++ former, and return EBUSY. */ + status = NSS_STATUS_UNAVAIL; +- /* Could not load any of the lookup functions. Indicate +- an internal error if the failure was due to a system +- error other than the file not being found. We use the +- errno from the last failed callback. */ +- if (errno != 0 && errno != ENOENT) +- __set_h_errno (NETDB_INTERNAL); ++ __set_h_errno (NETDB_INTERNAL); ++ __set_errno (EBUSY); + } + } + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-25.patch b/srcpkgs/glibc/patches/glibc-upstream-25.patch new file mode 100644 index 00000000000..20ae088f504 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-25.patch @@ -0,0 +1,47 @@ +From 7ab87bccb657b02cac5a3360b11c67aff901de2e Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Fri, 1 Sep 2017 08:57:52 +0200 +Subject: [PATCH 25] getaddrinfo: In gaih_inet, use h_errno for certain + status values only + +h_errno is not set for NSS_STATUS_SUCCESS, so its value might not be +accurate at this point. + +(cherry picked from commit a2881ef01450295782b065f2f850f340d5c12c14) +--- + ChangeLog | 5 +++++ + sysdeps/posix/getaddrinfo.c | 5 ++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 2f959d4c36..c58cd5ccd0 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,10 @@ + 2017-09-01 Florian Weimer + ++ * sysdeps/posix/getaddrinfo.c (gaih_inet): Only use h_errno if ++ status indicates it is set. ++ ++2017-09-01 Florian Weimer ++ + * sysdeps/posix/getaddrinfo.c (gaih_inet): Make reporting of NSS + function lookup failures more reliable. + +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index eaf8bafcf4..9d9e7e2bf2 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -949,7 +949,10 @@ gaih_inet (const char *name, const struct gaih_service *service, + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); + __resolv_context_put (res_ctx); + +- if (h_errno == NETDB_INTERNAL) ++ /* If we have a failure which sets errno, report it using ++ EAI_SYSTEM. */ ++ if ((status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) ++ && h_errno == NETDB_INTERNAL) + { + result = -EAI_SYSTEM; + goto free_and_return; + diff --git a/srcpkgs/glibc/patches/glibc-upstream-26.patch b/srcpkgs/glibc/patches/glibc-upstream-26.patch new file mode 100644 index 00000000000..cd525009f69 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-26.patch @@ -0,0 +1,61 @@ +From 7966331555df43bb7e2a55ce5a17a330e57f487f Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Mon, 4 Sep 2017 11:25:34 +0200 +Subject: [PATCH 26] getaddrinfo: Return EAI_NODATA if gethostbyname2_r + reports NO_DATA [BZ #21922] + +(cherry picked from commit 5f8340f583fe3d4f5734bd2371c5a45ecff2db0d) +--- + ChangeLog | 6 ++++++ + NEWS | 1 + + sysdeps/posix/getaddrinfo.c | 8 ++++++++ + 3 files changed, 15 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index c58cd5ccd0..f46bbb7c0d 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,11 @@ + 2017-09-01 Florian Weimer + ++ [BZ #21922] ++ * sysdeps/posix/getaddrinfo.c (gaih_inet): Report EAI_NODATA error ++ coming from gethostbyname2_r. ++ ++2017-09-01 Florian Weimer ++ + * sysdeps/posix/getaddrinfo.c (gaih_inet): Only use h_errno if + status indicates it is set. + +diff --git a/NEWS b/NEWS +index 756e849643..97eb21e868 100644 +--- a/NEWS ++++ b/NEWS +@@ -22,6 +22,7 @@ The following bugs are resolved with this release: + [21780] posix: Set p{read,write}v2 to return ENOTSUP + [21871] x86-64: Use _dl_runtime_resolve_opt only with AVX512F + [21885] getaddrinfo: Release resolver context on error in gethosts ++ [21922] getaddrinfo with AF_INET(6) returns EAI_NONAME, not EAI_NODATA + [21930] Do not use __builtin_types_compatible_p in C++ mode + [21932] Unpaired __resolv_context_get in generic get*_r implementation + [21941] powerpc: Restrict xssqrtqp operands to Vector Registers +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 9d9e7e2bf2..0cf87c224d 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -619,6 +619,14 @@ gaih_inet (const char *name, const struct gaih_service *service, + } + *pat = addrmem; + } ++ else ++ { ++ if (h_errno == NO_DATA) ++ result = -EAI_NODATA; ++ else ++ result = -EAI_NONAME; ++ goto free_and_return; ++ } + } + else + { + diff --git a/srcpkgs/glibc/patches/glibc-upstream-27.patch b/srcpkgs/glibc/patches/glibc-upstream-27.patch new file mode 100644 index 00000000000..43db6c7a342 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-27.patch @@ -0,0 +1,376 @@ +From a71a3374cd8cf53776c33994f69ec184c26f2129 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Mon, 4 Sep 2017 11:27:24 +0200 +Subject: [PATCH 27] getaddrinfo: Fix error handling in gethosts [BZ #21915] + [BZ #21922] + +The old code uses errno as the primary indicator for success or +failure. This is wrong because errno is only set for specific +combinations of the status return value and the h_errno variable. + +(cherry picked from commit f4a6be2582b8dfe8adfa68da3dd8decf566b3983) +--- + ChangeLog | 14 +++++ + NEWS | 1 + + nss/Makefile | 7 +++ + nss/tst-nss-files-hosts-erange.c | 109 +++++++++++++++++++++++++++++++++++++++ + resolv/tst-resolv-basic.c | 78 +++++++++++++++++++--------- + sysdeps/posix/getaddrinfo.c | 42 +++++++-------- + 6 files changed, 206 insertions(+), 45 deletions(-) + create mode 100644 nss/tst-nss-files-hosts-erange.c + +diff --git a/ChangeLog b/ChangeLog +index f46bbb7c0d..3e32d14dbf 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,19 @@ + 2017-09-01 Florian Weimer + ++ [BZ #21915] ++ [BZ #21922] ++ * sysdeps/posix/getaddrinfo.c (gethosts): Look at NSS function ++ result to determine success or failure, not the errno value. ++ * nss/Makefile (tests): Add tst-nss-files-hosts-erange. ++ (tst-nss-files-hosts-erange): Link with -ldl. ++ * nss/tst-nss-files-hosts-erange.c: New file. ++ * nss/tst-resolv-basic.c (response): Handle nodata.example. ++ (do_test): Add NO_DATA tests. ++ * resolv/tst-resolv-basic.c (test_nodata_nxdomain): New function. ++ (do_test): Call it. ++ ++2017-09-01 Florian Weimer ++ + [BZ #21922] + * sysdeps/posix/getaddrinfo.c (gaih_inet): Report EAI_NODATA error + coming from gethostbyname2_r. +diff --git a/NEWS b/NEWS +index 97eb21e868..8fbf4241d1 100644 +--- a/NEWS ++++ b/NEWS +@@ -22,6 +22,7 @@ The following bugs are resolved with this release: + [21780] posix: Set p{read,write}v2 to return ENOTSUP + [21871] x86-64: Use _dl_runtime_resolve_opt only with AVX512F + [21885] getaddrinfo: Release resolver context on error in gethosts ++ [21915] getaddrinfo: incorrect result handling for NSS service modules + [21922] getaddrinfo with AF_INET(6) returns EAI_NONAME, not EAI_NODATA + [21930] Do not use __builtin_types_compatible_p in C++ mode + [21932] Unpaired __resolv_context_get in generic get*_r implementation +diff --git a/nss/Makefile b/nss/Makefile +index d9f6d41181..91b1c21567 100644 +--- a/nss/Makefile ++++ b/nss/Makefile +@@ -58,6 +58,11 @@ tests = test-netdb test-digits-dots tst-nss-getpwent bug17079 \ + tst-nss-test5 + xtests = bug-erange + ++# Tests which need libdl ++ifeq (yes,$(build-shared)) ++tests += tst-nss-files-hosts-erange ++endif ++ + # If we have a thread library then we can test cancellation against + # some routines like getpwuid_r. + ifeq (yes,$(have-thread-library)) +@@ -154,3 +159,5 @@ $(patsubst %,$(objpfx)%.out,$(tests)) : \ + ifeq (yes,$(have-thread-library)) + $(objpfx)tst-cancel-getpwuid_r: $(shared-thread-library) + endif ++ ++$(objpfx)tst-nss-files-hosts-erange: $(libdl) +diff --git a/nss/tst-nss-files-hosts-erange.c b/nss/tst-nss-files-hosts-erange.c +new file mode 100644 +index 0000000000..beb7aa9fa0 +--- /dev/null ++++ b/nss/tst-nss-files-hosts-erange.c +@@ -0,0 +1,109 @@ ++/* Parse /etc/hosts in multi mode with a trailing long line (bug 21915). ++ Copyright (C) 2017 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct support_chroot *chroot_env; ++ ++#define X10 "XXXXXXXXXX" ++#define X100 X10 X10 X10 X10 X10 X10 X10 X10 X10 X10 ++#define X1000 X100 X100 X100 X100 X100 X100 X100 X100 X100 X100 ++ ++static void ++prepare (int argc, char **argv) ++{ ++ chroot_env = support_chroot_create ++ ((struct support_chroot_configuration) ++ { ++ .resolv_conf = "", ++ .hosts = ++ "127.0.0.1 localhost localhost.localdomain\n" ++ "::1 localhost localhost.localdomain\n" ++ "192.0.2.1 example.com\n" ++ "#" X1000 X100 "\n", ++ .host_conf = "multi on\n", ++ }); ++} ++ ++static int ++do_test (void) ++{ ++ support_become_root (); ++ if (!support_can_chroot ()) ++ return EXIT_UNSUPPORTED; ++ ++ __nss_configure_lookup ("hosts", "files"); ++ if (dlopen (LIBNSS_FILES_SO, RTLD_LAZY) == NULL) ++ FAIL_EXIT1 ("could not load " LIBNSS_DNS_SO ": %s", dlerror ()); ++ ++ xchroot (chroot_env->path_chroot); ++ ++ errno = ERANGE; ++ h_errno = NETDB_INTERNAL; ++ check_hostent ("gethostbyname example.com", ++ gethostbyname ("example.com"), ++ "name: example.com\n" ++ "address: 192.0.2.1\n"); ++ errno = ERANGE; ++ h_errno = NETDB_INTERNAL; ++ check_hostent ("gethostbyname2 AF_INET example.com", ++ gethostbyname2 ("example.com", AF_INET), ++ "name: example.com\n" ++ "address: 192.0.2.1\n"); ++ { ++ struct addrinfo hints = ++ { ++ .ai_family = AF_UNSPEC, ++ .ai_socktype = SOCK_STREAM, ++ .ai_protocol = IPPROTO_TCP, ++ }; ++ errno = ERANGE; ++ h_errno = NETDB_INTERNAL; ++ struct addrinfo *ai; ++ int ret = getaddrinfo ("example.com", "80", &hints, &ai); ++ check_addrinfo ("example.com AF_UNSPEC", ai, ret, ++ "address: STREAM/TCP 192.0.2.1 80\n"); ++ if (ret == 0) ++ freeaddrinfo (ai); ++ ++ hints.ai_family = AF_INET; ++ errno = ERANGE; ++ h_errno = NETDB_INTERNAL; ++ ret = getaddrinfo ("example.com", "80", &hints, &ai); ++ check_addrinfo ("example.com AF_INET", ai, ret, ++ "address: STREAM/TCP 192.0.2.1 80\n"); ++ if (ret == 0) ++ freeaddrinfo (ai); ++ } ++ ++ support_chroot_free (chroot_env); ++ return 0; ++} ++ ++#define PREPARE prepare ++#include +diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c +index 64eedbbd81..66a0e8a165 100644 +--- a/resolv/tst-resolv-basic.c ++++ b/resolv/tst-resolv-basic.c +@@ -50,7 +50,7 @@ response (const struct resolv_response_context *ctx, + qname_compare = qname + 2; + else + qname_compare = qname; +- enum {www, alias, nxdomain, long_name} requested_qname; ++ enum {www, alias, nxdomain, long_name, nodata} requested_qname; + if (strcmp (qname_compare, "www.example") == 0) + requested_qname = www; + else if (strcmp (qname_compare, "alias.example") == 0) +@@ -59,6 +59,8 @@ response (const struct resolv_response_context *ctx, + requested_qname = nxdomain; + else if (strcmp (qname_compare, LONG_NAME) == 0) + requested_qname = long_name; ++ else if (strcmp (qname_compare, "nodata.example") == 0) ++ requested_qname = nodata; + else + { + support_record_failure (); +@@ -87,6 +89,8 @@ response (const struct resolv_response_context *ctx, + resolv_response_close_record (b); + resolv_response_open_record (b, "www.example", qclass, qtype, 0); + break; ++ case nodata: ++ return; + case nxdomain: + FAIL_EXIT1 ("unreachable"); + } +@@ -267,6 +271,55 @@ test_bug_21295 (void) + } + } + ++/* Run tests which do not expect any data. */ ++static void ++test_nodata_nxdomain (void) ++{ ++ /* Iterate through different address families. */ ++ int families[] = { AF_UNSPEC, AF_INET, AF_INET6, -1 }; ++ for (int i = 0; families[i] >= 0; ++i) ++ /* If do_tcp, prepend "t." to the name to trigger TCP ++ fallback. */ ++ for (int do_tcp = 0; do_tcp < 2; ++do_tcp) ++ /* If do_nxdomain, trigger an NXDOMAIN error (DNS failure), ++ otherwise use a NODATA response (empty but successful ++ answer). */ ++ for (int do_nxdomain = 0; do_nxdomain < 2; ++do_nxdomain) ++ { ++ int family = families[i]; ++ char *name = xasprintf ("%s%s.example", ++ do_tcp ? "t." : "", ++ do_nxdomain ? "nxdomain" : "nodata"); ++ ++ if (family != AF_UNSPEC) ++ { ++ if (do_nxdomain) ++ check_h (name, family, "error: HOST_NOT_FOUND\n"); ++ else ++ check_h (name, family, "error: NO_ADDRESS\n"); ++ } ++ ++ const char *expected; ++ if (do_nxdomain) ++ expected = "error: Name or service not known\n"; ++ else ++ expected = "error: No address associated with hostname\n"; ++ ++ check_ai (name, "80", family, expected); ++ ++ struct addrinfo hints = ++ { ++ .ai_family = family, ++ .ai_flags = AI_V4MAPPED | AI_ALL, ++ }; ++ check_ai_hints (name, "80", hints, expected); ++ hints.ai_flags |= AI_CANONNAME; ++ check_ai_hints (name, "80", hints, expected); ++ ++ free (name); ++ } ++} ++ + static int + do_test (void) + { +@@ -439,29 +492,8 @@ do_test (void) + "address: DGRAM/UDP 2001:db8::4 80\n" + "address: RAW/IP 2001:db8::4 80\n"); + +- check_h ("nxdomain.example", AF_INET, +- "error: HOST_NOT_FOUND\n"); +- check_h ("nxdomain.example", AF_INET6, +- "error: HOST_NOT_FOUND\n"); +- check_ai ("nxdomain.example", "80", AF_UNSPEC, +- "error: Name or service not known\n"); +- check_ai ("nxdomain.example", "80", AF_INET, +- "error: Name or service not known\n"); +- check_ai ("nxdomain.example", "80", AF_INET6, +- "error: Name or service not known\n"); +- +- check_h ("t.nxdomain.example", AF_INET, +- "error: HOST_NOT_FOUND\n"); +- check_h ("t.nxdomain.example", AF_INET6, +- "error: HOST_NOT_FOUND\n"); +- check_ai ("t.nxdomain.example", "80", AF_UNSPEC, +- "error: Name or service not known\n"); +- check_ai ("t.nxdomain.example", "80", AF_INET, +- "error: Name or service not known\n"); +- check_ai ("t.nxdomain.example", "80", AF_INET6, +- "error: Name or service not known\n"); +- + test_bug_21295 (); ++ test_nodata_nxdomain (); + + resolv_test_end (aux); + +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index 0cf87c224d..2c4b6d6793 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -242,28 +242,26 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + #define gethosts(_family, _type) \ + { \ + struct hostent th; \ +- struct hostent *h; \ + char *localcanon = NULL; \ + no_data = 0; \ +- while (1) { \ +- status = DL_CALL_FCT (fct, (name, _family, &th, \ +- tmpbuf->data, tmpbuf->length, \ +- &errno, &h_errno, NULL, &localcanon)); \ +- if (errno != ERANGE || h_errno != NETDB_INTERNAL) \ +- break; \ +- if (!scratch_buffer_grow (tmpbuf)) \ +- { \ +- __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ +- __resolv_context_put (res_ctx); \ +- result = -EAI_MEMORY; \ +- goto free_and_return; \ +- } \ +- } \ +- if (status == NSS_STATUS_SUCCESS && errno == 0) \ +- h = &th; \ +- else \ +- h = NULL; \ +- if (errno != 0) \ ++ while (1) \ ++ { \ ++ status = DL_CALL_FCT (fct, (name, _family, &th, \ ++ tmpbuf->data, tmpbuf->length, \ ++ &errno, &h_errno, NULL, &localcanon)); \ ++ if (status != NSS_STATUS_TRYAGAIN || h_errno != NETDB_INTERNAL \ ++ || errno != ERANGE) \ ++ break; \ ++ if (!scratch_buffer_grow (tmpbuf)) \ ++ { \ ++ __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ ++ __resolv_context_put (res_ctx); \ ++ result = -EAI_MEMORY; \ ++ goto free_and_return; \ ++ } \ ++ } \ ++ if (status == NSS_STATUS_NOTFOUND \ ++ || status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) \ + { \ + if (h_errno == NETDB_INTERNAL) \ + { \ +@@ -277,9 +275,9 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, + else \ + no_data = h_errno == NO_DATA; \ + } \ +- else if (h != NULL) \ ++ else if (status == NSS_STATUS_SUCCESS) \ + { \ +- if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \ ++ if (!convert_hostent_to_gaih_addrtuple (req, _family, &th, &addrmem)) \ + { \ + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ + __resolv_context_put (res_ctx); \ + diff --git a/srcpkgs/glibc/patches/glibc-upstream-28.patch b/srcpkgs/glibc/patches/glibc-upstream-28.patch new file mode 100644 index 00000000000..4fd42d34372 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-28.patch @@ -0,0 +1,346 @@ +From 85cfe508568530eed2d9cfd34110c21721d1f99e Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 6 Sep 2017 13:43:01 +0200 +Subject: [PATCH 28] tst-res_use_inet6: Enhance test to cover IPv4-to-IPv6 + address mapping + +This requires more control over the response data, so it is now +determined by flags embedded in the query name. + +(cherry picked from commit 5e9c4d17feb9910f489ad2915d0b6e00597a0f11) +--- + ChangeLog | 12 +++ + resolv/tst-res_use_inet6.c | 231 ++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 198 insertions(+), 45 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 3e32d14dbf..dd71f6c427 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,15 @@ ++2017-09-06 Florian Weimer ++ ++ Enhance tst-res_use_inet6 to test IPv4-to-IPv6 address mapping. ++ * resolv/tst-res_use_inet6.c (response): Process flags embedded in ++ the QNAME. ++ (test_gai): Adjust query names. Add additional tests. ++ (test_get2_any, test_get2_no_inet6, test_get2_inet6): Split from ++ test_get2. Adjust query names. Add additional tests. ++ (test_no_inet6): New function, extracted from threadfunc. ++ (threadfunc): Call test_get2_any, test_get2_inet6, test_no_inet6. ++ Add additional tests. ++ + 2017-09-01 Florian Weimer + + [BZ #21915] +diff --git a/resolv/tst-res_use_inet6.c b/resolv/tst-res_use_inet6.c +index 6f3db08892..1522d5c5f5 100644 +--- a/resolv/tst-res_use_inet6.c ++++ b/resolv/tst-res_use_inet6.c +@@ -19,18 +19,44 @@ + #include + #include + #include ++#include + #include + #include + #include + ++/* Produce a response based on QNAME: Certain characters in the first ++ label of QNAME trigger the inclusion of resource records: ++ ++ 'a' A record (IPv4 address) ++ 'q' AAAA record (quad A record, IPv6 address) ++ 'm' record type must match QTYPE (no additional records) ++ ++ QTYPE is ignored for record type selection if 'm' is not ++ specified. */ + static void + response (const struct resolv_response_context *ctx, + struct resolv_response_builder *b, + const char *qname, uint16_t qclass, uint16_t qtype) + { +- bool include_both = strcmp (qname, "both.example") == 0; +- bool include_a = qtype == T_A || include_both; +- bool include_aaaa = qtype == T_AAAA || include_both; ++ bool include_a = false; ++ bool include_aaaa = false; ++ bool include_match = false; ++ for (const char *p = qname; *p != '.' && *p != '\0'; ++p) ++ { ++ if (*p == 'a') ++ include_a = true; ++ else if (*p == 'q') ++ include_aaaa = true; ++ else if (*p == 'm') ++ include_match = true; ++ } ++ if (include_match) ++ { ++ if (qtype == T_A) ++ include_aaaa = false; ++ else if (qtype == T_AAAA) ++ include_a = false; ++ } + + resolv_response_init (b, (struct resolv_response_flags) {}); + resolv_response_add_question (b, qname, qclass, qtype); +@@ -64,16 +90,21 @@ test_gai (void) + .ai_protocol = IPPROTO_TCP, + }; + struct addrinfo *ai; +- int ret = getaddrinfo ("www1.example", "80", &hints, &ai); +- check_addrinfo ("getaddrinfo AF_UNSPEC www1.example", ai, ret, ++ int ret = getaddrinfo ("qam.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_UNSPEC qam.example", ai, ret, + "address: STREAM/TCP 192.0.2.17 80\n" + "address: STREAM/TCP 2001:db8::1 80\n"); + if (ret == 0) + freeaddrinfo (ai); +- ret = getaddrinfo ("both.example", "80", &hints, &ai); ++ ret = getaddrinfo ("am.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_UNSPEC am.example", ai, ret, ++ "address: STREAM/TCP 192.0.2.17 80\n"); ++ if (ret == 0) ++ freeaddrinfo (ai); ++ ret = getaddrinfo ("qa.example", "80", &hints, &ai); + /* Combined A/AAAA responses currently result in address + duplication. */ +- check_addrinfo ("getaddrinfo AF_UNSPEC both.example", ai, ret, ++ check_addrinfo ("getaddrinfo AF_UNSPEC qa.example", ai, ret, + "address: STREAM/TCP 192.0.2.17 80\n" + "address: STREAM/TCP 192.0.2.17 80\n" + "address: STREAM/TCP 2001:db8::1 80\n" +@@ -89,13 +120,18 @@ test_gai (void) + .ai_protocol = IPPROTO_TCP, + }; + struct addrinfo *ai; +- int ret = getaddrinfo ("www1.example", "80", &hints, &ai); +- check_addrinfo ("getaddrinfo AF_INET www1.example", ai, ret, ++ int ret = getaddrinfo ("qam.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_INET qam.example", ai, ret, ++ "address: STREAM/TCP 192.0.2.17 80\n"); ++ if (ret == 0) ++ freeaddrinfo (ai); ++ ret = getaddrinfo ("am.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_INET am.example", ai, ret, + "address: STREAM/TCP 192.0.2.17 80\n"); + if (ret == 0) + freeaddrinfo (ai); +- ret = getaddrinfo ("both.example", "80", &hints, &ai); +- check_addrinfo ("getaddrinfo AF_INET both.example", ai, ret, ++ ret = getaddrinfo ("qa.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_INET qa.example", ai, ret, + "address: STREAM/TCP 192.0.2.17 80\n"); + if (ret == 0) + freeaddrinfo (ai); +@@ -108,40 +144,131 @@ test_gai (void) + .ai_protocol = IPPROTO_TCP, + }; + struct addrinfo *ai; +- int ret = getaddrinfo ("www1.example", "80", &hints, &ai); ++ int ret = getaddrinfo ("qa.example", "80", &hints, &ai); + check_addrinfo ("getaddrinfo (AF_INET6)", ai, ret, + "address: STREAM/TCP 2001:db8::1 80\n"); + if (ret == 0) + freeaddrinfo (ai); +- ret = getaddrinfo ("both.example", "80", &hints, &ai); +- check_addrinfo ("getaddrinfo AF_INET6 both.example", ai, ret, ++ ret = getaddrinfo ("am.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_INET6 am.example", ai, ret, ++ "error: No address associated with hostname\n"); ++ if (ret == 0) ++ freeaddrinfo (ai); ++ ret = getaddrinfo ("qam.example", "80", &hints, &ai); ++ check_addrinfo ("getaddrinfo AF_INET6 qam.example", ai, ret, + "address: STREAM/TCP 2001:db8::1 80\n"); + if (ret == 0) + freeaddrinfo (ai); + } + } + +-/* Test that gethostbyname2 is not influenced by RES_USE_INET6. */ ++/* Test that gethostbyname2 is mostly not influenced by ++ RES_USE_INET6. */ + static void +-test_get2 (void) ++test_get2_any (void) + { +- check_hostent ("gethostbyname2 AF_INET www1.example", +- gethostbyname2 ("www1.example", AF_INET), +- "name: www1.example\n" ++ check_hostent ("gethostbyname2 AF_INET am.example", ++ gethostbyname2 ("am.example", AF_INET), ++ "name: am.example\n" + "address: 192.0.2.17\n"); +- check_hostent ("gethostbyname2 AF_INET both.example", +- gethostbyname2 ("both.example", AF_INET), +- "name: both.example\n" ++ check_hostent ("gethostbyname2 AF_INET a.example", ++ gethostbyname2 ("a.example", AF_INET), ++ "name: a.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname2 AF_INET qm.example", ++ gethostbyname2 ("qm.example", AF_INET), ++ "error: NO_ADDRESS\n"); ++ check_hostent ("gethostbyname2 AF_INET q.example", ++ gethostbyname2 ("q.example", AF_INET), ++ "error: NO_RECOVERY\n"); ++ check_hostent ("gethostbyname2 AF_INET qam.example", ++ gethostbyname2 ("qam.example", AF_INET), ++ "name: qam.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname2 AF_INET qa.example", ++ gethostbyname2 ("qa.example", AF_INET), ++ "name: qa.example\n" + "address: 192.0.2.17\n"); + +- check_hostent ("gethostbyname2 AF_INET6 www1.example", +- gethostbyname2 ("www1.example", AF_INET6), +- "name: www1.example\n" ++ check_hostent ("gethostbyname2 AF_INET6 qm.example", ++ gethostbyname2 ("qm.example", AF_INET6), ++ "name: qm.example\n" ++ "address: 2001:db8::1\n"); ++ check_hostent ("gethostbyname2 AF_INET6 q.example", ++ gethostbyname2 ("q.example", AF_INET6), ++ "name: q.example\n" + "address: 2001:db8::1\n"); +- check_hostent ("gethostbyname2 AF_INET6 both.example", +- gethostbyname2 ("both.example", AF_INET6), +- "name: both.example\n" ++ check_hostent ("gethostbyname2 AF_INET6 qam.example", ++ gethostbyname2 ("qam.example", AF_INET6), ++ "name: qam.example\n" + "address: 2001:db8::1\n"); ++ check_hostent ("gethostbyname2 AF_INET6 qa.example", ++ gethostbyname2 ("qa.example", AF_INET6), ++ "name: qa.example\n" ++ "address: 2001:db8::1\n"); ++ /* Additional AF_INET6 tests depend on RES_USE_INET6; see below. */ ++} ++ ++/* gethostbyname2 tests with RES_USE_INET6 disabled. */ ++static void ++test_get2_no_inet6 (void) ++{ ++ test_get2_any (); ++ ++ check_hostent ("gethostbyname2 AF_INET6 am.example", ++ gethostbyname2 ("am.example", AF_INET6), ++ "error: NO_ADDRESS\n"); ++ check_hostent ("gethostbyname2 AF_INET6 a.example", ++ gethostbyname2 ("a.example", AF_INET6), ++ "error: NO_RECOVERY\n"); ++} ++ ++/* gethostbyname2 tests with RES_USE_INET6 enabled. */ ++static void ++test_get2_inet6 (void) ++{ ++ test_get2_any (); ++ ++ check_hostent ("gethostbyname2 AF_INET6 am.example", ++ gethostbyname2 ("am.example", AF_INET6), ++ "name: am.example\n" ++ "address: ::ffff:192.0.2.17\n"); ++ check_hostent ("gethostbyname2 AF_INET6 a.example", ++ gethostbyname2 ("a.example", AF_INET6), ++ "error: NO_RECOVERY\n"); ++} ++ ++/* Collection of tests which assume no RES_USE_INET6 flag. */ ++static void ++test_no_inet6 (void) ++{ ++ check_hostent ("gethostbyname (\"a.example\")", ++ gethostbyname ("a.example"), ++ "name: a.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"qa.example\")", ++ gethostbyname ("qa.example"), ++ "name: qa.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"am.example\")", ++ gethostbyname ("am.example"), ++ "name: am.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"qam.example\")", ++ gethostbyname ("qam.example"), ++ "name: qam.example\n" ++ "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"q.example\")", ++ gethostbyname ("q.example"), ++ "error: NO_RECOVERY\n"); ++ check_hostent ("gethostbyname (\"qm.example\")", ++ gethostbyname ("qm.example"), ++ "error: NO_ADDRESS\n"); ++ test_get2_no_inet6 (); ++ test_get2_no_inet6 (); ++ test_gai (); ++ test_get2_no_inet6 (); ++ test_get2_no_inet6 (); + } + + static void * +@@ -153,28 +280,42 @@ threadfunc (void *ignored) + .response_callback = response + }); + +- check_hostent ("gethostbyname (\"www1.example\")", +- gethostbyname ("www1.example"), +- "name: www1.example\n" +- "address: 192.0.2.17\n"); +- check_hostent ("gethostbyname (\"both.example\")", +- gethostbyname ("both.example"), +- "name: both.example\n" +- "address: 192.0.2.17\n"); +- test_get2 (); +- test_gai (); ++ TEST_VERIFY ((_res.options & RES_USE_INET6) == 0); ++ test_no_inet6 (); + + _res.options |= RES_USE_INET6; +- check_hostent ("gethostbyname (\"www1.example\")", +- gethostbyname ("www1.example"), +- "name: www1.example\n" ++ check_hostent ("gethostbyname (\"a.inet6.example\")", ++ gethostbyname ("a.inet6.example"), ++ "error: NO_RECOVERY\n"); ++ check_hostent ("gethostbyname (\"am.inet6.example\")", ++ gethostbyname ("am.inet6.example"), ++ "name: am.inet6.example\n" ++ "address: ::ffff:192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"qa.inet6.example\")", ++ gethostbyname ("qa.inet6.example"), ++ "name: qa.inet6.example\n" ++ "address: 2001:db8::1\n"); ++ check_hostent ("gethostbyname (\"qam.inet6.example\")", ++ gethostbyname ("qam.inet6.example"), ++ "name: qam.inet6.example\n" + "address: 2001:db8::1\n"); +- check_hostent ("gethostbyname (\"both.example\")", +- gethostbyname ("both.example"), +- "name: both.example\n" ++ check_hostent ("gethostbyname (\"q.inet6.example\")", ++ gethostbyname ("q.inet6.example"), ++ "name: q.inet6.example\n" + "address: 2001:db8::1\n"); +- test_get2 (); ++ check_hostent ("gethostbyname (\"qm.inet6.example\")", ++ gethostbyname ("qm.inet6.example"), ++ "name: qm.inet6.example\n" ++ "address: 2001:db8::1\n"); ++ test_get2_inet6 (); ++ test_get2_inet6 (); + test_gai (); ++ test_get2_inet6 (); ++ test_get2_inet6 (); ++ ++ TEST_VERIFY (_res.options & RES_USE_INET6); ++ _res.options &= ~RES_USE_INET6; ++ test_no_inet6 (); + + resolv_test_end (obj); + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-29.patch b/srcpkgs/glibc/patches/glibc-upstream-29.patch new file mode 100644 index 00000000000..96dc5d350de --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-29.patch @@ -0,0 +1,316 @@ +From 3005466abe8fb80ad4ff51865f1e28dd81c43347 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 6 Sep 2017 15:11:44 +0200 +Subject: [PATCH 29] nss_dns: Remove dead PTR IPv4-to-IPv6 mapping code + +(cherry picked from commit c77eb96925b719001237ca7c9e3cef40d795d66b) +--- + ChangeLog | 12 +++ + resolv/nss_dns/dns-host.c | 13 ---- + resolv/tst-res_use_inet6.c | 181 +++++++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 186 insertions(+), 20 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index dd71f6c427..fa215c2729 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,17 @@ + 2017-09-06 Florian Weimer + ++ Remove dead PTR IPv4-to-IPv6 mapping code from nss_dns. ++ * resolv/nss_dns/dns-host.c (getanswer_r): Remove dead code. ++ * resolv/tst-res_use_inet6.c (response_ptr_v4, response_ptr_v6): ++ New functions. ++ (response): Call them. Add 'p', '6' flag processing. ++ (test_reverse): New function. ++ (test_get2_any): Call it. ++ (test_no_inet6): Add 'p' test. ++ (test_inet6): Likewise. ++ ++2017-09-06 Florian Weimer ++ + Enhance tst-res_use_inet6 to test IPv4-to-IPv6 address mapping. + * resolv/tst-res_use_inet6.c (response): Process flags embedded in + the QNAME. +diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c +index 7cd54ab504..1e85e4f08f 100644 +--- a/resolv/nss_dns/dns-host.c ++++ b/resolv/nss_dns/dns-host.c +@@ -889,19 +889,6 @@ getanswer_r (struct resolv_context *ctx, + /* bind would put multiple PTR records as aliases, but we don't do + that. */ + result->h_name = bp; +- if (have_to_map) +- { +- n = strlen (bp) + 1; /* for the \0 */ +- if (__glibc_unlikely (n >= MAXHOSTNAMELEN)) +- { +- ++had_error; +- break; +- } +- bp += n; +- linebuflen -= n; +- if (map_v4v6_hostent (result, &bp, &linebuflen)) +- goto too_small; +- } + *h_errnop = NETDB_SUCCESS; + return NSS_STATUS_SUCCESS; + case T_A: +diff --git a/resolv/tst-res_use_inet6.c b/resolv/tst-res_use_inet6.c +index 1522d5c5f5..d819f921d6 100644 +--- a/resolv/tst-res_use_inet6.c ++++ b/resolv/tst-res_use_inet6.c +@@ -16,31 +16,101 @@ + License along with the GNU C Library; if not, see + . */ + ++#include + #include + #include ++#include ++#include + #include + #include + #include + #include ++#include + #include + ++/* Handle IPv4 reverse lookup responses. Product a PTR record ++ A-B-C-D.v4.example. */ ++static void ++response_ptr_v4 (const struct resolv_response_context *ctx, ++ struct resolv_response_builder *b, ++ const char *qname, uint16_t qclass, uint16_t qtype) ++{ ++ int bytes[4]; ++ int offset = -1; ++ TEST_VERIFY (sscanf (qname, "%d.%d.%d.%d.in-addr.arpa%n", ++ bytes + 0, bytes + 1, bytes + 2, bytes + 3, ++ &offset) == 4); ++ TEST_VERIFY (offset == strlen (qname)); ++ resolv_response_init (b, (struct resolv_response_flags) {}); ++ resolv_response_add_question (b, qname, qclass, qtype); ++ resolv_response_section (b, ns_s_an); ++ resolv_response_open_record (b, qname, qclass, T_PTR, 0); ++ char *name = xasprintf ("%d-%d-%d-%d.v4.example", ++ bytes[3], bytes[2], bytes[1], bytes[0]); ++ resolv_response_add_name (b, name); ++ free (name); ++ resolv_response_close_record (b); ++} ++ ++/* Handle IPv6 reverse lookup responses. Produce a PTR record ++ <32 hex digits>.v6.example. */ ++static void ++response_ptr_v6 (const struct resolv_response_context *ctx, ++ struct resolv_response_builder *b, ++ const char *qname, uint16_t qclass, uint16_t qtype) ++{ ++ ++ TEST_VERIFY_EXIT (strlen (qname) > 64); ++ ++ char bytes[33]; ++ for (int i = 0; i < 64; ++i) ++ if ((i % 2) == 0) ++ { ++ TEST_VERIFY (isxdigit ((unsigned char) qname[i])); ++ bytes[31 - i / 2] = qname[i]; ++ } ++ else ++ TEST_VERIFY_EXIT (qname[i] == '.'); ++ bytes[32] = '\0'; ++ ++ resolv_response_init (b, (struct resolv_response_flags) {}); ++ resolv_response_add_question (b, qname, qclass, qtype); ++ resolv_response_section (b, ns_s_an); ++ resolv_response_open_record (b, qname, qclass, T_PTR, 0); ++ char *name = xasprintf ("%s.v6.example", bytes); ++ resolv_response_add_name (b, name); ++ free (name); ++ resolv_response_close_record (b); ++} ++ + /* Produce a response based on QNAME: Certain characters in the first + label of QNAME trigger the inclusion of resource records: + + 'a' A record (IPv4 address) + 'q' AAAA record (quad A record, IPv6 address) ++ 'p' PTR record + 'm' record type must match QTYPE (no additional records) ++ '6' stop flag processing if QTYPE == AAAA ++ ++ For 'a' and 'q', QTYPE is ignored for record type selection if 'm' ++ is not specified. + +- QTYPE is ignored for record type selection if 'm' is not +- specified. */ ++ in-addr.arpa and ip6.arpa queries are handled separately in ++ response_ptr_v4 and response_ptr_v6. */ + static void + response (const struct resolv_response_context *ctx, + struct resolv_response_builder *b, + const char *qname, uint16_t qclass, uint16_t qtype) + { ++ if (strstr (qname, ".in-addr.arpa") != NULL) ++ return response_ptr_v4 (ctx, b, qname, qclass, qtype); ++ else if (strstr (qname, ".ip6.arpa") != NULL) ++ return response_ptr_v6 (ctx, b, qname, qclass, qtype); ++ + bool include_a = false; + bool include_aaaa = false; + bool include_match = false; ++ bool include_ptr = false; + for (const char *p = qname; *p != '.' && *p != '\0'; ++p) + { + if (*p == 'a') +@@ -49,6 +119,10 @@ response (const struct resolv_response_context *ctx, + include_aaaa = true; + else if (*p == 'm') + include_match = true; ++ else if (*p == 'p') ++ include_ptr = true; ++ else if (*p == '6' && qtype == T_AAAA) ++ break; + } + if (include_match) + { +@@ -70,11 +144,17 @@ response (const struct resolv_response_context *ctx, + } + if (include_aaaa) + { +- char ipv6[16] +- = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; +- resolv_response_open_record (b, qname, qclass, T_AAAA, 0); +- resolv_response_add_data (b, &ipv6, sizeof (ipv6)); +- resolv_response_close_record (b); ++ char ipv6[16] ++ = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; ++ resolv_response_open_record (b, qname, qclass, T_AAAA, 0); ++ resolv_response_add_data (b, &ipv6, sizeof (ipv6)); ++ resolv_response_close_record (b); ++ } ++ if (include_ptr) ++ { ++ resolv_response_open_record (b, qname, qclass, T_PTR, 0); ++ resolv_response_add_name (b, "ptr-target.example"); ++ resolv_response_close_record (b); + } + } + +@@ -162,6 +242,65 @@ test_gai (void) + } + } + ++/* Test gethostbyaddr and getnameinfo. The results are independent of ++ RES_USE_INET6. */ ++static void ++test_reverse (void) ++{ ++ { ++ char ipv4[4] = { 192, 0, 2, 17 }; ++ check_hostent ("gethostbyaddr AF_INET", ++ gethostbyaddr (ipv4, sizeof (ipv4), AF_INET), ++ "name: 192-0-2-17.v4.example\n" ++ "address: 192.0.2.17\n"); ++ } ++ { ++ char ipv6[16] ++ = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; ++ check_hostent ("gethostbyaddr AF_INET", ++ gethostbyaddr (ipv6, sizeof (ipv6), AF_INET6), ++ "name: 20010db8000000000000000000000001.v6.example\n" ++ "address: 2001:db8::1\n"); ++ } ++ ++ { ++ struct sockaddr_in addr = ++ { ++ .sin_family = AF_INET, ++ .sin_addr = { .s_addr = htonl (0xc0000211) }, ++ .sin_port = htons (80) ++ }; ++ char host[NI_MAXHOST]; ++ char service[NI_MAXSERV]; ++ int ret = getnameinfo ((struct sockaddr *) &addr, sizeof (addr), ++ host, sizeof (host), service, sizeof (service), ++ NI_NUMERICSERV); ++ TEST_VERIFY (ret == 0); ++ TEST_VERIFY (strcmp (host, "192-0-2-17.v4.example") == 0); ++ TEST_VERIFY (strcmp (service, "80") == 0); ++ } ++ { ++ char ipv6[16] ++ = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; ++ struct sockaddr_in6 addr = ++ { ++ .sin6_family = AF_INET6, ++ .sin6_port = htons (80), ++ }; ++ TEST_VERIFY (sizeof (ipv6) == sizeof (addr.sin6_addr)); ++ memcpy (&addr.sin6_addr, ipv6, sizeof (addr.sin6_addr)); ++ char host[NI_MAXHOST]; ++ char service[NI_MAXSERV]; ++ int ret = getnameinfo ((struct sockaddr *) &addr, sizeof (addr), ++ host, sizeof (host), service, sizeof (service), ++ NI_NUMERICSERV); ++ TEST_VERIFY (ret == 0); ++ TEST_VERIFY ++ (strcmp (host, "20010db8000000000000000000000001.v6.example") == 0); ++ TEST_VERIFY (strcmp (service, "80") == 0); ++ } ++} ++ + /* Test that gethostbyname2 is mostly not influenced by + RES_USE_INET6. */ + static void +@@ -207,6 +346,8 @@ test_get2_any (void) + "name: qa.example\n" + "address: 2001:db8::1\n"); + /* Additional AF_INET6 tests depend on RES_USE_INET6; see below. */ ++ ++ test_reverse (); + } + + /* gethostbyname2 tests with RES_USE_INET6 disabled. */ +@@ -254,6 +395,10 @@ test_no_inet6 (void) + gethostbyname ("am.example"), + "name: am.example\n" + "address: 192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"amp.example\")", ++ gethostbyname ("amp.example"), ++ "name: amp.example\n" ++ "address: 192.0.2.17\n"); + check_hostent ("gethostbyname (\"qam.example\")", + gethostbyname ("qam.example"), + "name: qam.example\n" +@@ -307,6 +452,28 @@ threadfunc (void *ignored) + gethostbyname ("qm.inet6.example"), + "name: qm.inet6.example\n" + "address: 2001:db8::1\n"); ++ check_hostent ("gethostbyname (\"amp.inet6.example\")", ++ gethostbyname ("amp.inet6.example"), ++ "error: NO_RECOVERY\n"); ++ check_hostent ("gethostbyname (\"qmp.inet6.example\")", ++ gethostbyname ("qmp.inet6.example"), ++ "name: qmp.inet6.example\n" ++ "address: 2001:db8::1\n"); ++ check_hostent ("gethostbyname (\"ap.inet6.example\")", ++ gethostbyname ("ap.inet6.example"), ++ "error: NO_RECOVERY\n"); ++ check_hostent ("gethostbyname (\"6ap.inet6.example\")", ++ gethostbyname ("6ap.inet6.example"), ++ "name: 6ap.inet6.example\n" ++ "address: ::ffff:192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"am6p.inet6.example\")", ++ gethostbyname ("am6p.inet6.example"), ++ "name: am6p.inet6.example\n" ++ "address: ::ffff:192.0.2.17\n"); ++ check_hostent ("gethostbyname (\"qp.inet6.example\")", ++ gethostbyname ("qp.inet6.example"), ++ "name: qp.inet6.example\n" ++ "address: 2001:db8::1\n"); + test_get2_inet6 (); + test_get2_inet6 (); + test_gai (); + diff --git a/srcpkgs/glibc/patches/glibc-upstream-30.patch b/srcpkgs/glibc/patches/glibc-upstream-30.patch new file mode 100644 index 00000000000..6fccbe6079d --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-30.patch @@ -0,0 +1,58 @@ +From 905a6129147e7ee80e8918e23efe212433b8cce7 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 6 Sep 2017 15:46:54 +0200 +Subject: [PATCH 30] resolv: Fix memory leak with OOM during resolv.conf + parsing [BZ #22095] + +(cherry picked from commit 5670c4ab256114e869b1df4b05653aa5f909182c) +--- + ChangeLog | 6 ++++++ + NEWS | 1 + + resolv/res_init.c | 5 +++++ + 3 files changed, 12 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index fa215c2729..ef2041b9e5 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,11 @@ + 2017-09-06 Florian Weimer + ++ [BZ #22095] ++ * resolv/res_init.c (res_vinit_1): Avoid memory leak in case of ++ dynarray allocation failure. ++ ++2017-09-06 Florian Weimer ++ + Remove dead PTR IPv4-to-IPv6 mapping code from nss_dns. + * resolv/nss_dns/dns-host.c (getanswer_r): Remove dead code. + * resolv/tst-res_use_inet6.c (response_ptr_v4, response_ptr_v6): +diff --git a/NEWS b/NEWS +index 8fbf4241d1..62959274b3 100644 +--- a/NEWS ++++ b/NEWS +@@ -28,6 +28,7 @@ The following bugs are resolved with this release: + [21932] Unpaired __resolv_context_get in generic get*_r implementation + [21941] powerpc: Restrict xssqrtqp operands to Vector Registers + [21972] assert macro requires operator== (int) for its argument type ++ [22095] resolv: Fix memory leak with OOM during resolv.conf parsing + + Version 2.26 + +diff --git a/resolv/res_init.c b/resolv/res_init.c +index fa46ce7813..4e1f9fe8de 100644 +--- a/resolv/res_init.c ++++ b/resolv/res_init.c +@@ -446,6 +446,11 @@ res_vinit_1 (FILE *fp, struct resolv_conf_parser *parser) + (&parser->nameserver_list); + if (p != NULL) + *p = sa; ++ else ++ { ++ free (sa); ++ return false; ++ } + } + continue; + } + diff --git a/srcpkgs/glibc/patches/glibc-upstream-31.patch b/srcpkgs/glibc/patches/glibc-upstream-31.patch new file mode 100644 index 00000000000..e8a6041e79e --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-31.patch @@ -0,0 +1,58 @@ +From 27233446a62ca35ce0b54566279a99a6774d4210 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 6 Sep 2017 15:47:27 +0200 +Subject: [PATCH 31] resolv: __resolv_conf_attach must not free passed conf + object [BZ #22096] + +(cherry picked from commit a83047308196e3e54716a39dd85c0a08b198d6bd) +--- + ChangeLog | 6 ++++++ + NEWS | 1 + + resolv/resolv_conf.c | 5 +---- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index ef2041b9e5..e98a4bbf3c 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,11 @@ + 2017-09-06 Florian Weimer + ++ [BZ #22096] ++ * resolv/resolv_conf.c (__resolv_conf_attach): Do not free conf in ++ case of failure to obtain the global conf object. ++ ++2017-09-06 Florian Weimer ++ + [BZ #22095] + * resolv/res_init.c (res_vinit_1): Avoid memory leak in case of + dynarray allocation failure. +diff --git a/NEWS b/NEWS +index 62959274b3..9bcb176171 100644 +--- a/NEWS ++++ b/NEWS +@@ -29,6 +29,7 @@ The following bugs are resolved with this release: + [21941] powerpc: Restrict xssqrtqp operands to Vector Registers + [21972] assert macro requires operator== (int) for its argument type + [22095] resolv: Fix memory leak with OOM during resolv.conf parsing ++ [22096] resolv: __resolv_conf_attach must not free passed conf object + + Version 2.26 + +diff --git a/resolv/resolv_conf.c b/resolv/resolv_conf.c +index f391d30c27..e0f296d02e 100644 +--- a/resolv/resolv_conf.c ++++ b/resolv/resolv_conf.c +@@ -600,10 +600,7 @@ __resolv_conf_attach (struct __res_state *resp, struct resolv_conf *conf) + + struct resolv_conf_global *global_copy = get_locked_global (); + if (global_copy == NULL) +- { +- free (conf); +- return false; +- } ++ return false; + + /* Try to find an unused index in the array. */ + size_t index; + diff --git a/srcpkgs/glibc/patches/glibc-upstream-32.patch b/srcpkgs/glibc/patches/glibc-upstream-32.patch new file mode 100644 index 00000000000..7d9e71bf6da --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-32.patch @@ -0,0 +1,41 @@ +From d265b6129184dd94da600187b67cef9125bc58c7 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 6 Sep 2017 11:25:14 +0200 +Subject: [PATCH 32] __libc_dynarray_emplace_enlarge: Add missing else + +Before, arrays of small elements received a starting allocation size of +8, not 16. +--- + ChangeLog | 5 +++++ + malloc/dynarray_emplace_enlarge.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index e98a4bbf3c..f82fd1f97d 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,10 @@ + 2017-09-06 Florian Weimer + ++ * malloc/dynarray_emplace_enlarge.c ++ (__libc_dynarray_emplace_enlarge): Add missing else. ++ ++2017-09-06 Florian Weimer ++ + [BZ #22096] + * resolv/resolv_conf.c (__resolv_conf_attach): Do not free conf in + case of failure to obtain the global conf object. +diff --git a/malloc/dynarray_emplace_enlarge.c b/malloc/dynarray_emplace_enlarge.c +index dfc70017ce..09cd09268b 100644 +--- a/malloc/dynarray_emplace_enlarge.c ++++ b/malloc/dynarray_emplace_enlarge.c +@@ -32,7 +32,7 @@ __libc_dynarray_emplace_enlarge (struct dynarray_header *list, + size. */ + if (element_size < 4) + new_allocated = 16; +- if (element_size < 8) ++ else if (element_size < 8) + new_allocated = 8; + else + new_allocated = 4; + diff --git a/srcpkgs/glibc/patches/glibc-upstream-33.patch b/srcpkgs/glibc/patches/glibc-upstream-33.patch new file mode 100644 index 00000000000..04af4e54f43 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-33.patch @@ -0,0 +1,139 @@ +From 8a1adb593969e099604537804f594efe01e04f6f Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 30 Aug 2017 20:10:56 +0200 +Subject: [PATCH 33] dynarray: Set errno on overflow-induced allocation + failure + +This allows the caller to return directly on such an error, with an +appropriate errno value. + +(cherry picked from commit 5898f4548efdcd7c0fd437a74eeb80facc51a117) +--- + ChangeLog | 8 ++++++++ + malloc/dynarray_emplace_enlarge.c | 8 ++++++-- + malloc/dynarray_resize.c | 7 ++++++- + malloc/tst-dynarray.c | 29 +++++++++++++++++++++++++++++ + 4 files changed, 49 insertions(+), 3 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index f82fd1f97d..87cc2f4865 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,11 @@ ++2017-08-30 Florian Weimer ++ ++ * malloc/dynarray_emplace_enlarge.c ++ (__libc_dynarray_emplace_enlarge): Set errno on overflow. ++ * malloc/dynarray_resize.c (__libc_dynarray_resize): Likewise. ++ * malloc/tst-dynarray.c (test_long_overflow): New function. ++ (do_test): Call it. ++ + 2017-09-06 Florian Weimer + + * malloc/dynarray_emplace_enlarge.c +diff --git a/malloc/dynarray_emplace_enlarge.c b/malloc/dynarray_emplace_enlarge.c +index 09cd09268b..a15245f4cb 100644 +--- a/malloc/dynarray_emplace_enlarge.c ++++ b/malloc/dynarray_emplace_enlarge.c +@@ -17,6 +17,7 @@ + . */ + + #include ++#include + #include + #include + #include +@@ -43,8 +44,11 @@ __libc_dynarray_emplace_enlarge (struct dynarray_header *list, + { + new_allocated = list->allocated + list->allocated / 2 + 1; + if (new_allocated <= list->allocated) +- /* Overflow. */ +- return false; ++ { ++ /* Overflow. */ ++ __set_errno (ENOMEM); ++ return false; ++ } + } + + size_t new_size; +diff --git a/malloc/dynarray_resize.c b/malloc/dynarray_resize.c +index e6dc9fbc68..63c981bf61 100644 +--- a/malloc/dynarray_resize.c ++++ b/malloc/dynarray_resize.c +@@ -17,6 +17,7 @@ + . */ + + #include ++#include + #include + #include + #include +@@ -38,7 +39,11 @@ __libc_dynarray_resize (struct dynarray_header *list, size_t size, + + size_t new_size_bytes; + if (check_mul_overflow_size_t (size, element_size, &new_size_bytes)) +- return false; ++ { ++ /* Overflow. */ ++ __set_errno (ENOMEM); ++ return false; ++ } + void *new_array; + if (list->array == scratch) + { +diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c +index 2206d75e31..d11f7bb8a3 100644 +--- a/malloc/tst-dynarray.c ++++ b/malloc/tst-dynarray.c +@@ -18,6 +18,9 @@ + + #include "tst-dynarray-shared.h" + ++#include ++#include ++ + #define DYNARRAY_STRUCT dynarray_long + #define DYNARRAY_ELEMENT long + #define DYNARRAY_PREFIX dynarray_long_ +@@ -463,6 +466,31 @@ test_long_init (void) + } + } + ++/* Test overflow in resize. */ ++static void ++test_long_overflow (void) ++{ ++ { ++ struct dynarray_long dyn; ++ dynarray_long_init (&dyn); ++ errno = EINVAL; ++ TEST_VERIFY (!dynarray_long_resize ++ (&dyn, (SIZE_MAX / sizeof (long)) + 1)); ++ TEST_VERIFY (errno == ENOMEM); ++ TEST_VERIFY (dynarray_long_has_failed (&dyn)); ++ } ++ ++ { ++ struct dynarray_long_noscratch dyn; ++ dynarray_long_noscratch_init (&dyn); ++ errno = EINVAL; ++ TEST_VERIFY (!dynarray_long_noscratch_resize ++ (&dyn, (SIZE_MAX / sizeof (long)) + 1)); ++ TEST_VERIFY (errno == ENOMEM); ++ TEST_VERIFY (dynarray_long_noscratch_has_failed (&dyn)); ++ } ++} ++ + /* Test NUL-terminated string construction with the add function and + the simple finalize function. */ + static void +@@ -538,6 +566,7 @@ do_test (void) + test_int (); + test_str (); + test_long_init (); ++ test_long_overflow (); + test_zstr (); + return 0; + } + diff --git a/srcpkgs/glibc/patches/glibc-upstream-34.patch b/srcpkgs/glibc/patches/glibc-upstream-34.patch new file mode 100644 index 00000000000..fa8bd627aa8 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-34.patch @@ -0,0 +1,59 @@ +From dca8b177f6bb521638f4d8a845b4cb10348137c9 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Thu, 31 Aug 2017 06:28:31 -0700 +Subject: [PATCH 34] Place $(elf-objpfx)sofini.os last [BZ #22051] + +Since sofini.os terminates .eh_frame section, it should be placed last. + + [BZ #22051] + * Makerules (build-module-helper-objlist): Filter out + $(elf-objpfx)sofini.os. + (build-shlib-objlist): Append $(elf-objpfx)sofini.os if it is + needed. + +(cherry picked from commit ecd0747df388f3925d4839740b0abcf43d0a9fb2) +--- + ChangeLog | 8 ++++++++ + Makerules | 5 ++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 87cc2f4865..f9e423dbb3 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,11 @@ ++2017-08-31 H.J. Lu ++ ++ [BZ #22051] ++ * Makerules (build-module-helper-objlist): Filter out ++ $(elf-objpfx)sofini.os. ++ (build-shlib-objlist): Append $(elf-objpfx)sofini.os if it is ++ needed. ++ + 2017-08-30 Florian Weimer + + * malloc/dynarray_emplace_enlarge.c +diff --git a/Makerules b/Makerules +index 9bb707c168..828a445f24 100644 +--- a/Makerules ++++ b/Makerules +@@ -686,14 +686,17 @@ $(build-module-helper) -o $@ $(shlib-lds-flags) \ + $(call after-link,$@) + endef + ++# sofini.os must be placed last since it terminates .eh_frame section. + build-module-helper-objlist = \ + $(patsubst %_pic.a,$(whole-archive) %_pic.a $(no-whole-archive),\ + $(filter-out %.lds $(map-file) $(+preinit) $(+postinit) \ ++ $(elf-objpfx)sofini.os \ + $(link-libc-deps),$^)) + + build-module-objlist = $(build-module-helper-objlist) $(LDLIBS-$(@F:%.so=%).so) + build-shlib-objlist = $(build-module-helper-objlist) \ +- $(LDLIBS-$(@F:lib%.so=%).so) ++ $(LDLIBS-$(@F:lib%.so=%).so) \ ++ $(filter $(elf-objpfx)sofini.os,$^) + + # Don't try to use -lc when making libc.so itself. + # Also omits crti.o and crtn.o, which we do not want + diff --git a/srcpkgs/glibc/patches/glibc-upstream-35.patch b/srcpkgs/glibc/patches/glibc-upstream-35.patch new file mode 100644 index 00000000000..2709a43be84 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-35.patch @@ -0,0 +1,41 @@ +From 86553be84d071aee8464b2c2fa03858d12118852 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Thu, 7 Sep 2017 13:56:58 -0700 +Subject: [PATCH 35] Use "static const char domain[] =" + + * resolv/tst-resolv-qtypes.c (domain): Changed to + "const char domain[] =". + +(cherry picked from commit 78bfa877b36e8f33c99cbe9a16eb73f5a2adc0c8) +--- + ChangeLog | 5 +++++ + resolv/tst-resolv-qtypes.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index f9e423dbb3..96c461c441 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++2017-09-07 H.J. Lu ++ ++ * resolv/tst-resolv-qtypes.c (domain): Changed to ++ "const char domain[] =". ++ + 2017-08-31 H.J. Lu + + [BZ #22051] +diff --git a/resolv/tst-resolv-qtypes.c b/resolv/tst-resolv-qtypes.c +index 06ea3dbd14..da3325f80c 100644 +--- a/resolv/tst-resolv-qtypes.c ++++ b/resolv/tst-resolv-qtypes.c +@@ -50,7 +50,7 @@ response (const struct resolv_response_context *ctx, + resolv_response_close_record (b); + } + +-static const char * const domain = "www.example.com"; ++static const char domain[] = "www.example.com"; + + static int + wrap_res_query (int type, unsigned char *answer, int answer_length) + diff --git a/srcpkgs/glibc/patches/glibc-upstream-36.patch b/srcpkgs/glibc/patches/glibc-upstream-36.patch new file mode 100644 index 00000000000..675a9c9818b --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-36.patch @@ -0,0 +1,43 @@ +From 5f5532caf820f47f714d09766082f1e070c12cfb Mon Sep 17 00:00:00 2001 +From: Markus Trippelsdorf +Date: Fri, 8 Sep 2017 19:57:12 +0000 +Subject: [PATCH 36] Update x86_64 ulps for AMD Ryzen. + + * sysdeps/x86_64/fpu/libm-test-ulps: Update for AMD Ryzen. + +(cherry picked from commit 4c03a696800e3bb4b433626a65c4fef465dcc98b) +--- + ChangeLog | 4 ++++ + sysdeps/x86_64/fpu/libm-test-ulps | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 96c461c441..c180f8dbca 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,7 @@ ++2017-09-08 Markus Trippelsdorf ++ ++ * sysdeps/x86_64/fpu/libm-test-ulps: Update for AMD Ryzen. ++ + 2017-09-07 H.J. Lu + + * resolv/tst-resolv-qtypes.c (domain): Changed to +diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps +index c347642044..1e28aaa9f1 100644 +--- a/sysdeps/x86_64/fpu/libm-test-ulps ++++ b/sysdeps/x86_64/fpu/libm-test-ulps +@@ -1733,10 +1733,10 @@ ldouble: 3 + + Function: Imaginary part of "ctan_upward": + double: 2 +-float: 1 ++float: 2 + float128: 5 + idouble: 2 +-ifloat: 1 ++ifloat: 2 + ifloat128: 5 + ildouble: 3 + ldouble: 3 + diff --git a/srcpkgs/glibc/patches/glibc-upstream-37.patch b/srcpkgs/glibc/patches/glibc-upstream-37.patch new file mode 100644 index 00000000000..55c7b7ac63e --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-37.patch @@ -0,0 +1,654 @@ +From 56ce01906ecb0a3e04411f8ceb60b27f4877f070 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Wed, 23 Aug 2017 08:22:52 -0700 +Subject: [PATCH 37] string/stratcliff.c: Replace int with size_t [BZ + #21982] +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fix GCC 7 errors when string/stratcliff.c is compiled with -O3: + +stratcliff.c: In function ‘do_test’: +cc1: error: assuming signed overflow does not occur when assuming that (X - c) <= X is always true [-Werror=strict-overflow] + + [BZ #21982] + * string/stratcliff.c (do_test): Declare size, nchars, inner, + middle and outer with size_t instead of int. Repleace %d and + %Zd with %zu in printf. Update "MAX (0, nchars - 128)" and + "MAX (outer, nchars - 64)" to support unsigned outer and + nchars. Also exit loop when outer == 0. + +(cherry picked from commit 376b40a27a6783ea7f73ae577be320df66aeb36d) +--- + ChangeLog | 9 ++ + string/stratcliff.c | 276 +++++++++++++++++++++++++++++++--------------------- + 2 files changed, 176 insertions(+), 109 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index c180f8dbca..84721f6265 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,12 @@ ++2017-09-11 H.J. Lu ++ ++ [BZ #21982] ++ * string/stratcliff.c (do_test): Declare size, nchars, inner, ++ middle and outer with size_t instead of int. Repleace %d and ++ %Zd with %zu in printf. Update "MAX (0, nchars - 128)" and ++ "MAX (outer, nchars - 64)" to support unsigned outer and ++ nchars. Also exit loop when outer == 0. ++ + 2017-09-08 Markus Trippelsdorf + + * sysdeps/x86_64/fpu/libm-test-ulps: Update for AMD Ryzen. +diff --git a/string/stratcliff.c b/string/stratcliff.c +index e28b0c5058..4320336c9a 100644 +--- a/string/stratcliff.c ++++ b/string/stratcliff.c +@@ -58,8 +58,8 @@ + int + do_test (void) + { +- int size = sysconf (_SC_PAGESIZE); +- int nchars = size / sizeof (CHAR); ++ size_t size = sysconf (_SC_PAGESIZE); ++ size_t nchars = size / sizeof (CHAR); + CHAR *adr; + CHAR *dest; + int result = 0; +@@ -80,7 +80,17 @@ do_test (void) + } + else + { +- int inner, middle, outer; ++ size_t inner, middle, outer, nchars64, max128; ++ ++ if (nchars > 64) ++ nchars64 = nchars - 64; ++ else ++ nchars64 = 0; ++ ++ if (nchars > 128) ++ max128 = nchars - 128; ++ else ++ max128 = 0; + + mprotect (adr, size, PROT_NONE); + mprotect (adr + 2 * nchars, size, PROT_NONE); +@@ -93,59 +103,65 @@ do_test (void) + MEMSET (adr, L('T'), nchars); + + /* strlen/wcslen test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner < nchars; ++inner) + { + adr[inner] = L('\0'); + + if (STRLEN (&adr[outer]) != (size_t) (inner - outer)) + { +- printf ("%s flunked for outer = %d, inner = %d\n", ++ printf ("%s flunked for outer = %zu, inner = %zu\n", + STRINGIFY (STRLEN), outer, inner); + result = 1; + } + + adr[inner] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* strnlen/wcsnlen test */ +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner < nchars; ++inner) + { + adr[inner] = L('\0'); + + if (STRNLEN (&adr[outer], inner - outer + 1) + != (size_t) (inner - outer)) + { +- printf ("%s flunked for outer = %d, inner = %d\n", ++ printf ("%s flunked for outer = %zu, inner = %zu\n", + STRINGIFY (STRNLEN), outer, inner); + result = 1; + } + + adr[inner] = L('T'); + } ++ if (outer == 0) ++ break; + } +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner <= nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner <= nchars; ++inner) + { + if (STRNLEN (&adr[outer], inner - outer) + != (size_t) (inner - outer)) + { +- printf ("%s flunked bounded for outer = %d, inner = %d\n", ++ printf ("%s flunked bounded for outer = %zu, inner = %zu\n", + STRINGIFY (STRNLEN), outer, inner); + result = 1; + } + } ++ if (outer == 0) ++ break; + } + + /* strchr/wcschr test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + for (inner = middle; inner < nchars; ++inner) + { +@@ -158,8 +174,8 @@ do_test (void) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { +- printf ("%s flunked for outer = %d, middle = %d, " +- "inner = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu, " ++ "inner = %zu\n", + STRINGIFY (STRCHR), outer, middle, inner); + result = 1; + } +@@ -168,6 +184,8 @@ do_test (void) + adr[middle] = L('T'); + } + } ++ if (outer == 0) ++ break; + } + + /* Special test. */ +@@ -180,9 +198,9 @@ do_test (void) + } + + /* strrchr/wcsrchr test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + for (inner = middle; inner < nchars; ++inner) + { +@@ -195,8 +213,8 @@ do_test (void) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { +- printf ("%s flunked for outer = %d, middle = %d, " +- "inner = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu, " ++ "inner = %zu\n", + STRINGIFY (STRRCHR), outer, middle, inner); + result = 1; + } +@@ -205,12 +223,14 @@ do_test (void) + adr[middle] = L('T'); + } + } ++ if (outer == 0) ++ break; + } + + /* memchr test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + adr[middle] = L('V'); + +@@ -218,32 +238,36 @@ do_test (void) + + if (cp - &adr[outer] != middle - outer) + { +- printf ("%s flunked for outer = %d, middle = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu\n", + STRINGIFY (MEMCHR), outer, middle); + result = 1; + } + + adr[middle] = L('T'); + } ++ if (outer == 0) ++ break; + } +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { + CHAR *cp = MEMCHR (&adr[outer], L('V'), nchars - outer); + + if (cp != NULL) + { +- printf ("%s flunked for outer = %d\n", ++ printf ("%s flunked for outer = %zu\n", + STRINGIFY (MEMCHR), outer); + result = 1; + } ++ if (outer == 0) ++ break; + } + + /* These functions only exist for single-byte characters. */ + #ifndef WCSTEST + /* rawmemchr test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + adr[middle] = L('V'); + +@@ -251,19 +275,21 @@ do_test (void) + + if (cp - &adr[outer] != middle - outer) + { +- printf ("%s flunked for outer = %d, middle = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu\n", + STRINGIFY (rawmemchr), outer, middle); + result = 1; + } + + adr[middle] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* memrchr test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + adr[middle] = L('V'); + +@@ -271,44 +297,50 @@ do_test (void) + + if (cp - &adr[outer] != middle - outer) + { +- printf ("%s flunked for outer = %d, middle = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu\n", + STRINGIFY (memrchr), outer, middle); + result = 1; + } + + adr[middle] = L('T'); + } ++ if (outer == 0) ++ break; + } +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { + CHAR *cp = memrchr (&adr[outer], L('V'), nchars - outer); + + if (cp != NULL) + { +- printf ("%s flunked for outer = %d\n", ++ printf ("%s flunked for outer = %zu\n", + STRINGIFY (memrchr), outer); + result = 1; + } ++ if (outer == 0) ++ break; + } + #endif + + /* strcpy/wcscpy test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner < nchars; ++inner) + { + adr[inner] = L('\0'); + + if (STRCPY (dest, &adr[outer]) != dest + || STRLEN (dest) != (size_t) (inner - outer)) + { +- printf ("%s flunked for outer = %d, inner = %d\n", ++ printf ("%s flunked for outer = %zu, inner = %zu\n", + STRINGIFY (STRCPY), outer, inner); + result = 1; + } + + adr[inner] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* strcmp/wcscmp tests */ +@@ -322,14 +354,14 @@ do_test (void) + + if (STRCMP (adr + middle, dest + nchars - outer) <= 0) + { +- printf ("%s 1 flunked for outer = %d, middle = %d\n", ++ printf ("%s 1 flunked for outer = %zu, middle = %zu\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } + + if (STRCMP (dest + nchars - outer, adr + middle) >= 0) + { +- printf ("%s 2 flunked for outer = %d, middle = %d\n", ++ printf ("%s 2 flunked for outer = %zu, middle = %zu\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } +@@ -348,16 +380,16 @@ do_test (void) + { + if (STRNCMP (adr + middle, dest + nchars - outer, inner) != 0) + { +- printf ("%s 1 flunked for outer = %d, middle = %d, " +- "inner = %d\n", ++ printf ("%s 1 flunked for outer = %zu, middle = %zu, " ++ "inner = %zu\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, inner) != 0) + { +- printf ("%s 2 flunked for outer = %d, middle = %d, " +- "inner = %d\n", ++ printf ("%s 2 flunked for outer = %zu, middle = %zu, " ++ "inner = %zu\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } +@@ -365,14 +397,14 @@ do_test (void) + + if (STRNCMP (adr + middle, dest + nchars - outer, outer) >= 0) + { +- printf ("%s 1 flunked for outer = %d, middle = %d, full\n", ++ printf ("%s 1 flunked for outer = %zu, middle = %zu, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, outer) <= 0) + { +- printf ("%s 2 flunked for outer = %d, middle = %d, full\n", ++ printf ("%s 2 flunked for outer = %zu, middle = %zu, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } +@@ -380,7 +412,7 @@ do_test (void) + + /* strncpy/wcsncpy tests */ + adr[nchars - 1] = L('T'); +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { + size_t len; + +@@ -389,17 +421,19 @@ do_test (void) + if (STRNCPY (dest, &adr[outer], len) != dest + || MEMCMP (dest, &adr[outer], len) != 0) + { +- printf ("outer %s flunked for outer = %d, len = %Zd\n", ++ printf ("outer %s flunked for outer = %zu, len = %zu\n", + STRINGIFY (STRNCPY), outer, len); + result = 1; + } + } ++ if (outer == 0) ++ break; + } + adr[nchars - 1] = L('\0'); + +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner < nchars; ++inner) + { + size_t len; + +@@ -413,8 +447,8 @@ do_test (void) + || (inner - outer < len + && STRLEN (dest) != (inner - outer))) + { +- printf ("%s flunked for outer = %d, inner = %d, " +- "len = %Zd\n", ++ printf ("%s flunked for outer = %zu, inner = %zu, " ++ "len = %zu\n", + STRINGIFY (STRNCPY), outer, inner, len); + result = 1; + } +@@ -424,8 +458,8 @@ do_test (void) + || (inner - outer < len + && STRLEN (dest + 1) != (inner - outer))) + { +- printf ("%s+1 flunked for outer = %d, inner = %d, " +- "len = %Zd\n", ++ printf ("%s+1 flunked for outer = %zu, inner = %zu, " ++ "len = %zu\n", + STRINGIFY (STRNCPY), outer, inner, len); + result = 1; + } +@@ -433,29 +467,33 @@ do_test (void) + + adr[inner] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* stpcpy/wcpcpy test */ +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) ++ for (inner = MAX (outer, nchars64); inner < nchars; ++inner) + { + adr[inner] = L('\0'); + + if ((STPCPY (dest, &adr[outer]) - dest) != inner - outer) + { +- printf ("%s flunked for outer = %d, inner = %d\n", ++ printf ("%s flunked for outer = %zu, inner = %zu\n", + STRINGIFY (STPCPY), outer, inner); + result = 1; + } + + adr[inner] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* stpncpy/wcpncpy test */ + adr[nchars - 1] = L('T'); +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars; outer >= max128; --outer) + { + size_t len; + +@@ -464,17 +502,19 @@ do_test (void) + if (STPNCPY (dest, &adr[outer], len) != dest + len + || MEMCMP (dest, &adr[outer], len) != 0) + { +- printf ("outer %s flunked for outer = %d, len = %Zd\n", ++ printf ("outer %s flunked for outer = %zu, len = %zu\n", + STRINGIFY (STPNCPY), outer, len); + result = 1; + } + } ++ if (outer == 0) ++ break; + } + adr[nchars - 1] = L('\0'); + +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) ++ for (outer = nchars - 1; outer >= max128; --outer) + { +- for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) ++ for (middle = MAX (outer, nchars64); middle < nchars; ++middle) + { + adr[middle] = L('\0'); + +@@ -483,8 +523,8 @@ do_test (void) + if ((STPNCPY (dest, &adr[outer], inner) - dest) + != MIN (inner, middle - outer)) + { +- printf ("%s flunked for outer = %d, middle = %d, " +- "inner = %d\n", ++ printf ("%s flunked for outer = %zu, middle = %zu, " ++ "inner = %zu\n", + STRINGIFY (STPNCPY), outer, middle, inner); + result = 1; + } +@@ -492,66 +532,84 @@ do_test (void) + + adr[middle] = L('T'); + } ++ if (outer == 0) ++ break; + } + + /* memcpy/wmemcpy test */ +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) +- for (inner = 0; inner < nchars - outer; ++inner) +- if (MEMCPY (dest, &adr[outer], inner) != dest) +- { +- printf ("%s flunked for outer = %d, inner = %d\n", +- STRINGIFY (MEMCPY), outer, inner); +- result = 1; +- } ++ for (outer = nchars; outer >= max128; --outer) ++ { ++ for (inner = 0; inner < nchars - outer; ++inner) ++ if (MEMCPY (dest, &adr[outer], inner) != dest) ++ { ++ printf ("%s flunked for outer = %zu, inner = %zu\n", ++ STRINGIFY (MEMCPY), outer, inner); ++ result = 1; ++ } ++ if (outer == 0) ++ break; ++ } + + /* mempcpy/wmempcpy test */ +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) +- for (inner = 0; inner < nchars - outer; ++inner) +- if (MEMPCPY (dest, &adr[outer], inner) != dest + inner) +- { +- printf ("%s flunked for outer = %d, inner = %d\n", +- STRINGIFY (MEMPCPY), outer, inner); +- result = 1; +- } ++ for (outer = nchars; outer >= max128; --outer) ++ { ++ for (inner = 0; inner < nchars - outer; ++inner) ++ if (MEMPCPY (dest, &adr[outer], inner) != dest + inner) ++ { ++ printf ("%s flunked for outer = %zu, inner = %zu\n", ++ STRINGIFY (MEMPCPY), outer, inner); ++ result = 1; ++ } ++ if (outer == 0) ++ break; ++ } + + /* This function only exists for single-byte characters. */ + #ifndef WCSTEST + /* memccpy test */ + memset (adr, '\0', nchars); +- for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) +- for (inner = 0; inner < nchars - outer; ++inner) +- if (memccpy (dest, &adr[outer], L('\1'), inner) != NULL) +- { +- printf ("memccpy flunked full copy for outer = %d, inner = %d\n", +- outer, inner); +- result = 1; +- } +- for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) +- for (middle = 0; middle < nchars - outer; ++middle) +- { +- memset (dest, L('\2'), middle + 1); +- for (inner = 0; inner < middle; ++inner) ++ for (outer = nchars; outer >= max128; --outer) ++ { ++ for (inner = 0; inner < nchars - outer; ++inner) ++ if (memccpy (dest, &adr[outer], L('\1'), inner) != NULL) + { +- adr[outer + inner] = L('\1'); +- +- if (memccpy (dest, &adr[outer], '\1', middle + 128) +- != dest + inner + 1) +- { +- printf ("\ +-memccpy flunked partial copy for outer = %d, middle = %d, inner = %d\n", +- outer, middle, inner); +- result = 1; +- } +- else if (dest[inner + 1] != L('\2')) +- { +- printf ("\ +-memccpy copied too much for outer = %d, middle = %d, inner = %d\n", +- outer, middle, inner); +- result = 1; +- } +- adr[outer + inner] = L('\0'); ++ printf ("memccpy flunked full copy for outer = %zu, inner = %zu\n", ++ outer, inner); ++ result = 1; + } +- } ++ if (outer == 0) ++ break; ++ } ++ for (outer = nchars - 1; outer >= max128; --outer) ++ { ++ for (middle = 0; middle < nchars - outer; ++middle) ++ { ++ memset (dest, L('\2'), middle + 1); ++ for (inner = 0; inner < middle; ++inner) ++ { ++ adr[outer + inner] = L('\1'); ++ ++ if (memccpy (dest, &adr[outer], '\1', middle + 128) ++ != dest + inner + 1) ++ { ++ printf ("\ ++ memccpy flunked partial copy for outer = %zu, middle = %zu, inner = %zu\n", ++ outer, middle, inner); ++ result = 1; ++ } ++ else if (dest[inner + 1] != L('\2')) ++ { ++ printf ("\ ++ memccpy copied too much for outer = %zu, middle = %zu, inner = %zu\n", ++ outer, middle, inner); ++ result = 1; ++ } ++ adr[outer + inner] = L('\0'); ++ } ++ } ++ if (outer == 0) ++ break; ++ } + #endif + } + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-38.patch b/srcpkgs/glibc/patches/glibc-upstream-38.patch new file mode 100644 index 00000000000..6f418d08c1f --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-38.patch @@ -0,0 +1,223 @@ +From 2422c6032fd5e95b1c29df5b8671455ead51314e Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Thu, 3 Aug 2017 15:39:21 +0930 +Subject: [PATCH 38] tst-tlsopt-powerpc as a shared lib + +This makes the __tls_get_addr_opt test run as a shared library, and so +actually test that DTPMOD64/DTPREL64 pairs are processed by ld.so to +support the __tls_get_adfr_opt call stub fast return. After a +2017-01-24 patch (binutils f0158f4416) ld.bfd no longer emitted +unnecessary dynamic relocations against local thread variables, +instead setting up the __tls_index GOT entries for the call stub fast +return. This meant tst-tlsopt-powerpc passed but did not check ld.so +relocation support. After a 2017-07-16 patch (binutils 676ee2b5fa) +ld.bfd no longer set up the __tls_index GOT entries for the call stub +fast return, and tst-tlsopt-powerpc failed. + +Compiling mod-tlsopt-powerpc.c with -DSHARED exposed a bug in +powerpc64/tls-macros.h, which defines a __TLS_GET_ADDR macro that +clashes with one defined in dl-tls.h. The tls-macros.h version is +only used in that file, so delete it and expand. + + * sysdeps/powerpc/mod-tlsopt-powerpc.c: Extract from + tst-tlsopt-powerpc.c with function name change and no test harness. + * sysdeps/powerpc/tst-tlsopt-powerpc.c: Remove body of test. + Call tls_get_addr_opt_test. + * sysdeps/powerpc/Makefile (LDFLAGS-tst-tlsopt-powerpc): Don't define. + (modules-names): Add mod-tlsopt-powerpc. + (mod-tlsopt-powerpc.so-no-z-defs): Define. + (tst-tlsopt-powerpc): Depend on .so. + * sysdeps/powerpc/powerpc64/tls-macros.h (__TLS_GET_ADDR): Don't + define. Expand use in TLS_GD and TLS_LD. + +(cherry picked from commit e98c925fa4f6486447eb20676755dbf9eb36a110) +--- + ChangeLog | 13 +++++++++ + sysdeps/powerpc/Makefile | 6 +++-- + sysdeps/powerpc/mod-tlsopt-powerpc.c | 49 ++++++++++++++++++++++++++++++++++ + sysdeps/powerpc/powerpc64/tls-macros.h | 6 ++--- + sysdeps/powerpc/tst-tlsopt-powerpc.c | 44 ++---------------------------- + 5 files changed, 70 insertions(+), 48 deletions(-) + create mode 100644 sysdeps/powerpc/mod-tlsopt-powerpc.c + +diff --git a/ChangeLog b/ChangeLog +index 84721f6265..b53d8830a2 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,16 @@ ++2017-08-03 Alan Modra ++ ++ * sysdeps/powerpc/mod-tlsopt-powerpc.c: Extract from ++ tst-tlsopt-powerpc.c with function name change and no test harness. ++ * sysdeps/powerpc/tst-tlsopt-powerpc.c: Remove body of test. ++ Call tls_get_addr_opt_test. ++ * sysdeps/powerpc/Makefile (LDFLAGS-tst-tlsopt-powerpc): Don't define. ++ (modules-names): Add mod-tlsopt-powerpc. ++ (mod-tlsopt-powerpc.so-no-z-defs): Define. ++ (tst-tlsopt-powerpc): Depend on .so. ++ * sysdeps/powerpc/powerpc64/tls-macros.h (__TLS_GET_ADDR): Don't ++ define. Expand use in TLS_GD and TLS_LD. ++ + 2017-09-11 H.J. Lu + + [BZ #21982] +diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile +index 0d9206bec4..6aa683b03f 100644 +--- a/sysdeps/powerpc/Makefile ++++ b/sysdeps/powerpc/Makefile +@@ -8,9 +8,11 @@ sysdep-dl-routines += dl-machine hwcapinfo + sysdep_routines += dl-machine hwcapinfo + # extra shared linker files to link only into dl-allobjs.so + sysdep-rtld-routines += dl-machine hwcapinfo +-# Don't optimize GD tls sequence to LE. +-LDFLAGS-tst-tlsopt-powerpc += -Wl,--no-tls-optimize ++ ++modules-names += mod-tlsopt-powerpc ++mod-tlsopt-powerpc.so-no-z-defs = yes + tests += tst-tlsopt-powerpc ++$(objpfx)tst-tlsopt-powerpc: $(objpfx)mod-tlsopt-powerpc.so + + ifneq (no,$(multi-arch)) + tests-static += tst-tlsifunc-static +diff --git a/sysdeps/powerpc/mod-tlsopt-powerpc.c b/sysdeps/powerpc/mod-tlsopt-powerpc.c +new file mode 100644 +index 0000000000..ee0db12a73 +--- /dev/null ++++ b/sysdeps/powerpc/mod-tlsopt-powerpc.c +@@ -0,0 +1,49 @@ ++/* shared library to test for __tls_get_addr optimization. */ ++#include ++ ++#include "../../elf/tls-macros.h" ++#include "dl-tls.h" ++ ++/* common 'int' variable in TLS. */ ++COMMON_INT_DEF(foo); ++ ++ ++int ++tls_get_addr_opt_test (void) ++{ ++ int result = 0; ++ ++ /* Get variable using general dynamic model. */ ++ int *ap = TLS_GD (foo); ++ if (*ap != 0) ++ { ++ printf ("foo = %d\n", *ap); ++ result = 1; ++ } ++ ++ tls_index *tls_arg; ++#ifdef __powerpc64__ ++ register unsigned long thread_pointer __asm__ ("r13"); ++ asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg)); ++#else ++ register unsigned long thread_pointer __asm__ ("r2"); ++ asm ("bcl 20,31,1f\n1:\t" ++ "mflr %0\n\t" ++ "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" ++ "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" ++ "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg)); ++#endif ++ ++ if (tls_arg->ti_module != 0) ++ { ++ printf ("tls_index not optimized, binutils too old?\n"); ++ result = 1; ++ } ++ else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap) ++ { ++ printf ("tls_index->ti_offset wrong value\n"); ++ result = 1; ++ } ++ ++ return result; ++} +diff --git a/sysdeps/powerpc/powerpc64/tls-macros.h b/sysdeps/powerpc/powerpc64/tls-macros.h +index 42a95ec5c1..79a0b2579c 100644 +--- a/sysdeps/powerpc/powerpc64/tls-macros.h ++++ b/sysdeps/powerpc/powerpc64/tls-macros.h +@@ -18,13 +18,11 @@ + __result; \ + }) + +-#define __TLS_GET_ADDR "__tls_get_addr" +- + /* PowerPC64 Local Dynamic TLS access. */ + #define TLS_LD(x) \ + ({ int * __result; \ + asm ("addi 3,2," #x "@got@tlsld\n\t" \ +- "bl " __TLS_GET_ADDR "\n\t" \ ++ "bl __tls_get_addr\n\t" \ + "nop \n\t" \ + "addis %0,3," #x "@dtprel@ha\n\t" \ + "addi %0,%0," #x "@dtprel@l" \ +@@ -36,7 +34,7 @@ + #define TLS_GD(x) \ + ({ register int *__result __asm__ ("r3"); \ + asm ("addi 3,2," #x "@got@tlsgd\n\t" \ +- "bl " __TLS_GET_ADDR "\n\t" \ ++ "bl __tls_get_addr\n\t" \ + "nop " \ + : "=r" (__result) : \ + : __TLS_CALL_CLOBBERS); \ +diff --git a/sysdeps/powerpc/tst-tlsopt-powerpc.c b/sysdeps/powerpc/tst-tlsopt-powerpc.c +index 8ae928a3f4..cc682b2ed0 100644 +--- a/sysdeps/powerpc/tst-tlsopt-powerpc.c ++++ b/sysdeps/powerpc/tst-tlsopt-powerpc.c +@@ -1,51 +1,11 @@ + /* glibc test for __tls_get_addr optimization. */ +-#include +- +-#include "../../elf/tls-macros.h" +-#include "dl-tls.h" +- +-/* common 'int' variable in TLS. */ +-COMMON_INT_DEF(foo); +- + + static int + do_test (void) + { +- int result = 0; +- +- /* Get variable using general dynamic model. */ +- int *ap = TLS_GD (foo); +- if (*ap != 0) +- { +- printf ("foo = %d\n", *ap); +- result = 1; +- } +- +- tls_index *tls_arg; +-#ifdef __powerpc64__ +- register unsigned long thread_pointer __asm__ ("r13"); +- asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg)); +-#else +- register unsigned long thread_pointer __asm__ ("r2"); +- asm ("bcl 20,31,1f\n1:\t" +- "mflr %0\n\t" +- "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" +- "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" +- "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg)); +-#endif +- +- if (tls_arg->ti_module != 0) +- { +- printf ("tls_index not optimized, binutils too old?\n"); +- result = 1; +- } +- else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap) +- { +- printf ("tls_index->ti_offset wrong value\n"); +- result = 1; +- } ++ extern int tls_get_addr_opt_test (void); + +- return result; ++ return tls_get_addr_opt_test (); + } + + #include + diff --git a/srcpkgs/glibc/patches/glibc-upstream-39.patch b/srcpkgs/glibc/patches/glibc-upstream-39.patch new file mode 100644 index 00000000000..d1cd4dd25a5 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-39.patch @@ -0,0 +1,41 @@ +From ac6113cb0146494af7ecacbbdc6957ce501a40ec Mon Sep 17 00:00:00 2001 +From: Martin Sebor +Date: Tue, 22 Aug 2017 09:35:23 -0600 +Subject: [PATCH 39] Declare ifunc resolver to return a pointer to the same + type as the target function to help GCC detect incompatibilities between the + two when it's enhanced to do so. + +(cherry picked from commit ee4e992ebe5f9712faedeefe8958b67d61eaa0f2) +--- + ChangeLog | 5 +++++ + include/libc-symbols.h | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index b53d8830a2..ec9b9f5edb 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++2017-08-22 Martin Sebor ++ ++ * include/libc-symbols.h (__ifunc_resolver): Declare resolver ++ to return a pointer to the same type as the target function. ++ + 2017-08-03 Alan Modra + + * sysdeps/powerpc/mod-tlsopt-powerpc.c: Extract from +diff --git a/include/libc-symbols.h b/include/libc-symbols.h +index 3310e3a678..c50f9adec2 100644 +--- a/include/libc-symbols.h ++++ b/include/libc-symbols.h +@@ -782,7 +782,8 @@ for linking") + + /* Helper / base macros for indirect function symbols. */ + #define __ifunc_resolver(type_name, name, expr, arg, init, classifier) \ +- classifier inhibit_stack_protector void *name##_ifunc (arg) \ ++ classifier inhibit_stack_protector \ ++ __typeof (type_name) *name##_ifunc (arg) \ + { \ + init (); \ + __typeof (type_name) *res = expr; \ + diff --git a/srcpkgs/glibc/patches/glibc-upstream-40.patch b/srcpkgs/glibc/patches/glibc-upstream-40.patch new file mode 100644 index 00000000000..4a082b48216 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-40.patch @@ -0,0 +1,76 @@ +From 37d4262a7a35886cf8ac856457bbad8c0498c8d6 Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Tue, 22 Aug 2017 14:01:07 -0300 +Subject: [PATCH 40] Fix remaining return type of ifunc resolver declaration + +Since Martin Sebor's commit + +commit ee4e992ebe5f9712faedeefe8958b67d61eaa0f2 +Author: Martin Sebor +Date: Tue Aug 22 09:35:23 2017 -0600 + + Declare ifunc resolver to return a pointer to the same type as the target + function to help GCC detect incompatibilities between the two when it's + enhanced to do so. + +builds for powerpc64le fail in the declaration of some ifunc resolvers, +because the ifunc is declared with unmatching return types. One of the +declarations comes from the __ifunc_resolver macro, which was patched by +the aforementioned commit: + + /* Helper / base macros for indirect function symbols. */ + #define __ifunc_resolver(type_name, name, expr, arg, init, classifier) \ + classifier inhibit_stack_protector \ + __typeof (type_name) *name##_ifunc (arg) \ + +whereas the other comes from the unpatched __ifunc macro when +HAVE_GCC_IFUNC is not defined: + + # define __ifunc(type_name, name, expr, arg, init) \ + extern __typeof (type_name) name; \ + void *name##_ifunc (arg) __asm__ (#name); \ + +This patch changes the return type of the ifunc resolver in the __ifunc +macro, so that it matches the return type of the target function, +similarly to what the aforementioned commit does. + +Tested for powerpc64le and s390x with unpatched GCC. + + * include/libc-symbols.h: [!defined HAVE_GCC_IFUNC] (__ifunc): + Change the return type of the ifunc resolver to match the return + type of the target function. + +(cherry picked from commit b513da7e80febbbfb8e58282075018652b6f7273) +--- + ChangeLog | 6 ++++++ + include/libc-symbols.h | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index ec9b9f5edb..6b09c61d5a 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2017-08-22 Gabriel F. T. Gomes ++ ++ * include/libc-symbols.h: [!defined HAVE_GCC_IFUNC] (__ifunc): ++ Change the return type of the ifunc resolver to match the return ++ type of the target function. ++ + 2017-08-22 Martin Sebor + + * include/libc-symbols.h (__ifunc_resolver): Declare resolver +diff --git a/include/libc-symbols.h b/include/libc-symbols.h +index c50f9adec2..5bf57703a9 100644 +--- a/include/libc-symbols.h ++++ b/include/libc-symbols.h +@@ -810,7 +810,7 @@ for linking") + + # define __ifunc(type_name, name, expr, arg, init) \ + extern __typeof (type_name) name; \ +- void *name##_ifunc (arg) __asm__ (#name); \ ++ __typeof (type_name) *name##_ifunc (arg) __asm__ (#name); \ + __ifunc_resolver (type_name, name, expr, arg, init,) \ + __asm__ (".type " #name ", %gnu_indirect_function"); + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-41.patch b/srcpkgs/glibc/patches/glibc-upstream-41.patch new file mode 100644 index 00000000000..d92bae52d12 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-41.patch @@ -0,0 +1,86 @@ +From d37c951fde57e8acb320a9a7d437ba50a1fc3c8a Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Wed, 20 Sep 2017 15:10:26 -0300 +Subject: [PATCH 41] Let fpclassify use the builtin when optimizing for size + in C++ mode (bug 22146) + +When optimization for size is on (-Os), fpclassify does not use the +type-generic __builtin_fpclassify builtin, instead it uses __MATH_TG. +However, when library support for float128 is available, __MATH_TG uses +__builtin_types_compatible_p, which is not available in C++ mode. + +On the other hand, libstdc++ undefines (in cmath) many macros from +math.h, including fpclassify, so that it can provide its own functions. +However, during its configure tests, libstdc++ just tests for the +availability of the macros (it does not undefine them, nor does it +provide its own functions). + +Finally, when libstdc++ is configured with optimization for size +enabled, its configure tests include math.h and get the definition of +fpclassify that uses __MATH_TG (and __builtin_types_compatible_p). +Since libstdc++ does not undefine the macros during its configure tests, +they fail. + +This patch lets fpclassify use the builtin in C++ mode, even when +optimization for size is on. This allows the configure test in +libstdc++ to work. + +Tested for powerpc64le and x86_64. + + [BZ #22146] + math/math.h: Let fpclassify use the builtin in C++ mode, even + when optimazing for size. + +(cherry picked from commit c5c4a626098ec884b8527356abdf2a4bb7b6bf27) +--- + ChangeLog | 6 ++++++ + NEWS | 1 + + math/math.h | 8 +++++++- + 3 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 6b09c61d5a..382674d5a3 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2017-09-22 Gabriel F. T. Gomes ++ ++ [BZ #22146] ++ math/math.h: Let fpclassify use the builtin in C++ mode, even ++ when optimazing for size. ++ + 2017-08-22 Gabriel F. T. Gomes + + * include/libc-symbols.h: [!defined HAVE_GCC_IFUNC] (__ifunc): +diff --git a/NEWS b/NEWS +index 9bcb176171..48e2064380 100644 +--- a/NEWS ++++ b/NEWS +@@ -30,6 +30,7 @@ The following bugs are resolved with this release: + [21972] assert macro requires operator== (int) for its argument type + [22095] resolv: Fix memory leak with OOM during resolv.conf parsing + [22096] resolv: __resolv_conf_attach must not free passed conf object ++ [22146] Let fpclassify use the builtin when optimizing for size in C++ mode + + Version 2.26 + +diff --git a/math/math.h b/math/math.h +index 7c0fc6dbb3..f9348ec3ea 100644 +--- a/math/math.h ++++ b/math/math.h +@@ -402,7 +402,13 @@ enum + + /* Return number of classification appropriate for X. */ + # if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__ \ +- && !defined __OPTIMIZE_SIZE__ ++ && (!defined __OPTIMIZE_SIZE__ || defined __cplusplus) ++ /* The check for __cplusplus allows the use of the builtin, even ++ when optimization for size is on. This is provided for ++ libstdc++, only to let its configure test work when it is built ++ with -Os. No further use of this definition of fpclassify is ++ expected in C++ mode, since libstdc++ provides its own version ++ of fpclassify in cmath (which undefines fpclassify). */ + # define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE, \ + FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x) + # else + diff --git a/srcpkgs/glibc/patches/glibc-upstream-42.patch b/srcpkgs/glibc/patches/glibc-upstream-42.patch new file mode 100644 index 00000000000..5f913f82150 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-42.patch @@ -0,0 +1,165 @@ +From 548cc83c38a91852b1e44045ead3d20ccd5db4cf Mon Sep 17 00:00:00 2001 +From: Joseph Myers +Date: Thu, 28 Sep 2017 01:59:02 +0000 +Subject: [PATCH 42] Fix nearbyint arithmetic moved before feholdexcept (bug + 22225). + +In I +remarked on the possibility of arithmetic in various nearbyint +implementations being scheduled before feholdexcept calls, resulting +in spurious "inexact" exceptions. + +I'm now actually observing this occurring in glibc built for ARM with +GCC 7 (in fact, both copies of the same addition/subtraction sequence +being combined and moved out before the conditionals and +feholdexcept/fesetenv pairs), resulting in test failures. + +This patch makes the nearbyint implementations with this particular +feholdexcept / arithmetic / fesetenv pattern consistently use +math_opt_barrier on the function argument when first used in +arithmetic, and also consistently use math_force_eval before fesetenv +(the latter was generally already done, but the dbl-64/wordsize-64 +implementation used math_opt_barrier instead, and as +math_opt_barrier's intended effect is through its output value being +used, such a use that doesn't use the return value is suspect). + +Tested for x86_64 (--disable-multi-arch so more of these +implementations get used), and for ARM in a configuration where I saw +the problem scheduling. + + [BZ #22225] + * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Use + math_opt_barrier on argument when doing arithmetic on it. + * sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c (__nearbyint): + Likewise. Use math_force_eval not math_opt_barrier after + arithmetic. + * sysdeps/ieee754/flt-32/s_nearbyintf.c (__nearbyintf): Use + math_opt_barrier on argument when doing arithmetic on it. + * sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl): + Likewise. + +(cherry picked from commit f124cb381116b5809de198327690ad0bd8d1478e) +--- + ChangeLog | 13 +++++++++++++ + sysdeps/ieee754/dbl-64/s_nearbyint.c | 4 ++-- + sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c | 8 ++++---- + sysdeps/ieee754/flt-32/s_nearbyintf.c | 4 ++-- + sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 4 ++-- + 5 files changed, 23 insertions(+), 10 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 382674d5a3..992722acdb 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,16 @@ ++2017-09-28 Joseph Myers ++ ++ [BZ #22225] ++ * sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Use ++ math_opt_barrier on argument when doing arithmetic on it. ++ * sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c (__nearbyint): ++ Likewise. Use math_force_eval not math_opt_barrier after ++ arithmetic. ++ * sysdeps/ieee754/flt-32/s_nearbyintf.c (__nearbyintf): Use ++ math_opt_barrier on argument when doing arithmetic on it. ++ * sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl): ++ Likewise. ++ + 2017-09-22 Gabriel F. T. Gomes + + [BZ #22146] +diff --git a/sysdeps/ieee754/dbl-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/s_nearbyint.c +index dec0c5d6ee..6e3f8316b1 100644 +--- a/sysdeps/ieee754/dbl-64/s_nearbyint.c ++++ b/sysdeps/ieee754/dbl-64/s_nearbyint.c +@@ -48,7 +48,7 @@ __nearbyint (double x) + if (j0 < 0) + { + libc_feholdexcept (&env); +- w = TWO52[sx] + x; ++ w = TWO52[sx] + math_opt_barrier (x); + t = w - TWO52[sx]; + math_force_eval (t); + libc_fesetenv (&env); +@@ -65,7 +65,7 @@ __nearbyint (double x) + return x; /* x is integral */ + } + libc_feholdexcept (&env); +- w = TWO52[sx] + x; ++ w = TWO52[sx] + math_opt_barrier (x); + t = w - TWO52[sx]; + math_force_eval (t); + libc_fesetenv (&env); +diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c +index 8293819981..7d135b54e4 100644 +--- a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c ++++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c +@@ -42,9 +42,9 @@ __nearbyint(double x) + if(__builtin_expect(j0<52, 1)) { + if(j0<0) { + libc_feholdexcept (&env); +- double w = TWO52[sx]+x; ++ double w = TWO52[sx] + math_opt_barrier (x); + double t = w-TWO52[sx]; +- math_opt_barrier(t); ++ math_force_eval (t); + libc_fesetenv (&env); + return __copysign (t, x); + } +@@ -53,9 +53,9 @@ __nearbyint(double x) + else return x; /* x is integral */ + } + libc_feholdexcept (&env); +- double w = TWO52[sx]+x; ++ double w = TWO52[sx] + math_opt_barrier (x); + double t = w-TWO52[sx]; +- math_opt_barrier (t); ++ math_force_eval (t); + libc_fesetenv (&env); + return t; + } +diff --git a/sysdeps/ieee754/flt-32/s_nearbyintf.c b/sysdeps/ieee754/flt-32/s_nearbyintf.c +index 5aebefafcf..b06df6b3c8 100644 +--- a/sysdeps/ieee754/flt-32/s_nearbyintf.c ++++ b/sysdeps/ieee754/flt-32/s_nearbyintf.c +@@ -37,7 +37,7 @@ __nearbyintf(float x) + if(j0<23) { + if(j0<0) { + libc_feholdexceptf (&env); +- w = TWO23[sx]+x; ++ w = TWO23[sx] + math_opt_barrier (x); + t = w-TWO23[sx]; + math_force_eval (t); + libc_fesetenvf (&env); +@@ -50,7 +50,7 @@ __nearbyintf(float x) + else return x; /* x is integral */ + } + libc_feholdexceptf (&env); +- w = TWO23[sx]+x; ++ w = TWO23[sx] + math_opt_barrier (x); + t = w-TWO23[sx]; + math_force_eval (t); + libc_fesetenvf (&env); +diff --git a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c +index 1565a8183f..98a33d24a7 100644 +--- a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c ++++ b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c +@@ -45,7 +45,7 @@ _Float128 __nearbyintl(_Float128 x) + if(j0<112) { + if(j0<0) { + feholdexcept (&env); +- w = TWO112[sx]+x; ++ w = TWO112[sx] + math_opt_barrier (x); + t = w-TWO112[sx]; + math_force_eval (t); + fesetenv (&env); +@@ -58,7 +58,7 @@ _Float128 __nearbyintl(_Float128 x) + else return x; /* x is integral */ + } + feholdexcept (&env); +- w = TWO112[sx]+x; ++ w = TWO112[sx] + math_opt_barrier (x); + t = w-TWO112[sx]; + math_force_eval (t); + fesetenv (&env); + diff --git a/srcpkgs/glibc/patches/glibc-upstream-43.patch b/srcpkgs/glibc/patches/glibc-upstream-43.patch new file mode 100644 index 00000000000..bac0a8617a5 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-43.patch @@ -0,0 +1,28 @@ +From fdf58ebc60ce0eb459fd616241b52872b3571ac1 Mon Sep 17 00:00:00 2001 +From: Joseph Myers +Date: Sat, 30 Sep 2017 00:48:07 +0000 +Subject: [PATCH 43] Add missing bug fixes to list in NEWS file. + +--- + NEWS | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/NEWS b/NEWS +index 48e2064380..8e468c0369 100644 +--- a/NEWS ++++ b/NEWS +@@ -28,9 +28,13 @@ The following bugs are resolved with this release: + [21932] Unpaired __resolv_context_get in generic get*_r implementation + [21941] powerpc: Restrict xssqrtqp operands to Vector Registers + [21972] assert macro requires operator== (int) for its argument type ++ [21982] string: stratcliff.c: error: assuming signed overflow does not ++ occur with -O3 ++ [22051] libc: zero terminator in the middle of glibc's .eh_frame + [22095] resolv: Fix memory leak with OOM during resolv.conf parsing + [22096] resolv: __resolv_conf_attach must not free passed conf object + [22146] Let fpclassify use the builtin when optimizing for size in C++ mode ++ [22225] math: nearbyint arithmetic moved before feholdexcept + + Version 2.26 + + diff --git a/srcpkgs/glibc/patches/glibc-upstream-44.patch b/srcpkgs/glibc/patches/glibc-upstream-44.patch new file mode 100644 index 00000000000..1e17b2709b5 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-44.patch @@ -0,0 +1,104 @@ +From 3f68c5c9b61600f0f85c75bac15b1520d5059359 Mon Sep 17 00:00:00 2001 +From: Joseph Myers +Date: Tue, 22 Aug 2017 00:59:43 +0000 +Subject: [PATCH 44] Fix sparc32 bits/long-double.h (bug 21987). + +My refactoring of long double information + +commit 0acb8a2a855395c25b1feef2470f4d7ca4bed589 +Author: Joseph Myers +Date: Wed Dec 14 18:27:56 2016 +0000 + + Refactor long double information into bits/long-double.h. + +resulted in sparc32 configurations installing the ldbl-opt version of +bits/long-double.h instead of the intended +sysdeps/unix/sysv/linux/sparc version. + +For sparc32 by itself, this is not a problem, since the ldbl-opt +version is correct for sparc32. However, both sparc32 and sparc64 are +supposed to install sets of headers that work for both of them, so +that a single sysroot, whichever order the libraries are built and +installed in, works for both. The effect of having the wrong version +installed is that you end up with a miscompiled sparc64 libstdc++ +which fails glibc's configure tests for the C++ compiler. + +This patch moves the header from sysdeps/unix/sysv/linux/sparc to +separate copies of the same file for sparc32 and sparc64, to ensure it +comes before ldbl-opt in the sysdeps directory ordering. + +Tested with build-many-glibcs.py for sparc64-linux-gnu and +sparcv9-linux-gnu. + + [BZ #21987] + * sysdeps/unix/sysv/linux/sparc/bits/long-double.h: Remove file + and copy to ... + * sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h: + ... here. + * sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h: + ... and here. + +(cherry picked from commit 80f91666fed71fa3dd5eb5618739147cc731bc89) +--- + ChangeLog | 10 +++++++++ + .../linux/sparc/{ => sparc32}/bits/long-double.h | 0 + .../sysv/linux/sparc/sparc64/bits/long-double.h | 26 ++++++++++++++++++++++ + 3 files changed, 36 insertions(+) + rename sysdeps/unix/sysv/linux/sparc/{ => sparc32}/bits/long-double.h (100%) + create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h + +diff --git a/ChangeLog b/ChangeLog +index 992722acdb..cc763ac065 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,13 @@ ++2017-08-22 Joseph Myers ++ ++ [BZ #21987] ++ * sysdeps/unix/sysv/linux/sparc/bits/long-double.h: Remove file ++ and copy to ... ++ * sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h: ++ ... here. ++ * sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h: ++ ... and here. ++ + 2017-09-28 Joseph Myers + + [BZ #22225] +diff --git a/sysdeps/unix/sysv/linux/sparc/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h +similarity index 100% +rename from sysdeps/unix/sysv/linux/sparc/bits/long-double.h +rename to sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h +diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h +new file mode 100644 +index 0000000000..094e05124b +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h +@@ -0,0 +1,26 @@ ++/* Properties of long double type. SPARC version. ++ Copyright (C) 2016-2017 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 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 ++ ++#if !defined __NO_LONG_DOUBLE_MATH && __WORDSIZE == 32 ++# define __LONG_DOUBLE_MATH_OPTIONAL 1 ++# ifndef __LONG_DOUBLE_128__ ++# define __NO_LONG_DOUBLE_MATH 1 ++# endif ++#endif + diff --git a/srcpkgs/glibc/patches/glibc-upstream-45.patch b/srcpkgs/glibc/patches/glibc-upstream-45.patch new file mode 100644 index 00000000000..a0761537036 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-45.patch @@ -0,0 +1,250 @@ +From 3b10c5d2abb0392d5ecfd865e2eb911ac109e36f Mon Sep 17 00:00:00 2001 +From: "Gabriel F. T. Gomes" +Date: Mon, 2 Oct 2017 14:46:35 -0300 +Subject: [PATCH 45] Add C++ versions of iscanonical for ldbl-96 and + ldbl-128ibm (bug 22235) + +All representations of floating-point numbers in types with IEC 60559 +binary exchange format are canonical. On the other hand, types with IEC +60559 extended formats, such as those implemented under ldbl-96 and +ldbl-128ibm, contain representations that are not canonical. + +TS 18661-1 introduced the type-generic macro iscanonical, which returns +whether a floating-point value is canonical or not. In Glibc, this +type-generic macro is implemented using the macro __MATH_TG, which, when +support for float128 is enabled, relies on __builtin_types_compatible_p +to select between floating-point types. However, this use of +iscanonical breaks C++ applications, because the builtin is only +available in C mode. + +This patch provides a C++ implementation of iscanonical that relies on +function overloading, rather than builtins, to select between +floating-point types. + +Unlike the C++ implementations for iszero and issignaling, this +implementation ignores __NO_LONG_DOUBLE_MATH. The double type always +matches IEC 60559 double format, which is always canonical. Thus, when +double and long double are the same (__NO_LONG_DOUBLE_MATH), iscanonical +always returns 1 and is not implemented with __MATH_TG. + +Tested for powerpc64, powerpc64le and x86_64. + + [BZ #22235] + * math/math.h: Trivial fix for unbalanced parentheses in comment. + * math/Makefile [CXX] (tests): Add test-math-iscanonical.cc. + (CFLAGS-test-math-iscanonical.cc): New variable. + * math/test-math-iscanonical.cc: New file. + * sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical): + Provide a C++ implementation based on function overloading, + rather than using __MATH_TG, which uses C-only builtins. + * sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical): + Likewise. + * sysdeps/powerpc/powerpc64le/Makefile + (CFLAGS-test-math-iscanonical.cc): New variable. + +(cherry picked from commit aa0235dfdebffe9b338deba51f3ba563ee9b433d) +--- + ChangeLog | 15 ++++++++ + NEWS | 1 + + math/Makefile | 4 ++- + math/math.h | 2 +- + math/test-math-iscanonical.cc | 48 ++++++++++++++++++++++++++ + sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h | 21 +++++++++-- + sysdeps/ieee754/ldbl-96/bits/iscanonical.h | 19 +++++++++- + sysdeps/powerpc/powerpc64le/Makefile | 1 + + 8 files changed, 106 insertions(+), 5 deletions(-) + create mode 100644 math/test-math-iscanonical.cc + +diff --git a/ChangeLog b/ChangeLog +index cc763ac065..fea4fd0cd6 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,18 @@ ++2017-10-03 Gabriel F. T. Gomes ++ ++ [BZ #22235] ++ * math/math.h: Trivial fix for unbalanced parentheses in comment. ++ * math/Makefile [CXX] (tests): Add test-math-iscanonical.cc. ++ (CFLAGS-test-math-iscanonical.cc): New variable. ++ * math/test-math-iscanonical.cc: New file. ++ * sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical): ++ Provide a C++ implementation based on function overloading, ++ rather than using __MATH_TG, which uses C-only builtins. ++ * sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical): ++ Likewise. ++ * sysdeps/powerpc/powerpc64le/Makefile ++ (CFLAGS-test-math-iscanonical.cc): New variable. ++ + 2017-08-22 Joseph Myers + + [BZ #21987] +diff --git a/NEWS b/NEWS +index 8e468c0369..5b05edeb4f 100644 +--- a/NEWS ++++ b/NEWS +@@ -35,6 +35,7 @@ The following bugs are resolved with this release: + [22096] resolv: __resolv_conf_attach must not free passed conf object + [22146] Let fpclassify use the builtin when optimizing for size in C++ mode + [22225] math: nearbyint arithmetic moved before feholdexcept ++ [22235] Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm + + Version 2.26 + +diff --git a/math/Makefile b/math/Makefile +index 0130fcf38b..2c17c68eda 100644 +--- a/math/Makefile ++++ b/math/Makefile +@@ -203,7 +203,8 @@ tests-static = test-fpucw-static test-fpucw-ieee-static \ + test-signgam-ullong-static test-signgam-ullong-init-static + + ifneq (,$(CXX)) +-tests += test-math-isinff test-math-iszero test-math-issignaling ++tests += test-math-isinff test-math-iszero test-math-issignaling \ ++ test-math-iscanonical + endif + + ifneq (no,$(PERL)) +@@ -351,6 +352,7 @@ CFLAGS-test-signgam-ullong-init-static.c = -std=c99 + CFLAGS-test-math-isinff.cc = -std=gnu++11 + CFLAGS-test-math-iszero.cc = -std=gnu++11 + CFLAGS-test-math-issignaling.cc = -std=gnu++11 ++CFLAGS-test-math-iscanonical.cc = -std=gnu++11 + + CFLAGS-test-iszero-excess-precision.c = -fexcess-precision=standard + CFLAGS-test-iseqsig-excess-precision.c = -fexcess-precision=standard +diff --git a/math/math.h b/math/math.h +index f9348ec3ea..2b216c6da1 100644 +--- a/math/math.h ++++ b/math/math.h +@@ -488,7 +488,7 @@ enum + other hand, overloading provides the means to distinguish between + the floating-point types. The overloading resolution will match + the correct parameter (regardless of type qualifiers (i.e.: const +- and volatile). */ ++ and volatile)). */ + extern "C++" { + inline int issignaling (float __val) { return __issignalingf (__val); } + inline int issignaling (double __val) { return __issignaling (__val); } +diff --git a/math/test-math-iscanonical.cc b/math/test-math-iscanonical.cc +new file mode 100644 +index 0000000000..aba68acb4f +--- /dev/null ++++ b/math/test-math-iscanonical.cc +@@ -0,0 +1,48 @@ ++/* Test for the C++ implementation of iscanonical. ++ Copyright (C) 2017 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 ++ . */ ++ ++#define _GNU_SOURCE 1 ++#include ++#include ++ ++static bool errors; ++ ++template ++static void ++check_type () ++{ ++ T val = 0; ++ ++ /* Check if iscanonical is available in C++ mode (bug 22235). */ ++ if (iscanonical (val) == 0) ++ errors++; ++} ++ ++static int ++do_test (void) ++{ ++ check_type (); ++ check_type (); ++ check_type (); ++#if __HAVE_DISTINCT_FLOAT128 ++ check_type<_Float128> (); ++#endif ++ return errors; ++} ++ ++#include +diff --git a/sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h b/sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h +index 7ddb368d26..f756857c03 100644 +--- a/sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h ++++ b/sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h +@@ -37,5 +37,22 @@ extern int __iscanonicall (long double __x) + conversion, before being discarded; in IBM long double, there are + encodings that are not consistently handled as corresponding to any + particular value of the type, and we return 0 for those. */ +-# define iscanonical(x) __MATH_TG ((x), __iscanonical, (x)) +-#endif ++# ifndef __cplusplus ++# define iscanonical(x) __MATH_TG ((x), __iscanonical, (x)) ++# else ++/* In C++ mode, __MATH_TG cannot be used, because it relies on ++ __builtin_types_compatible_p, which is a C-only builtin. On the ++ other hand, overloading provides the means to distinguish between ++ the floating-point types. The overloading resolution will match ++ the correct parameter (regardless of type qualifiers (i.e.: const ++ and volatile)). */ ++extern "C++" { ++inline int iscanonical (float __val) { return __iscanonicalf (__val); } ++inline int iscanonical (double __val) { return __iscanonical (__val); } ++inline int iscanonical (long double __val) { return __iscanonicall (__val); } ++# if __HAVE_DISTINCT_FLOAT128 ++inline int iscanonical (_Float128 __val) { return __iscanonicalf128 (__val); } ++# endif ++} ++# endif /* __cplusplus */ ++#endif /* __NO_LONG_DOUBLE_MATH */ +diff --git a/sysdeps/ieee754/ldbl-96/bits/iscanonical.h b/sysdeps/ieee754/ldbl-96/bits/iscanonical.h +index 4a4f4ad024..cfa36a0c2a 100644 +--- a/sysdeps/ieee754/ldbl-96/bits/iscanonical.h ++++ b/sysdeps/ieee754/ldbl-96/bits/iscanonical.h +@@ -34,4 +34,21 @@ extern int __iscanonicall (long double __x) + conversion, before being discarded; in extended precision, there + are encodings that are not consistently handled as corresponding to + any particular value of the type, and we return 0 for those. */ +-#define iscanonical(x) __MATH_TG ((x), __iscanonical, (x)) ++#ifndef __cplusplus ++# define iscanonical(x) __MATH_TG ((x), __iscanonical, (x)) ++#else ++/* In C++ mode, __MATH_TG cannot be used, because it relies on ++ __builtin_types_compatible_p, which is a C-only builtin. On the ++ other hand, overloading provides the means to distinguish between ++ the floating-point types. The overloading resolution will match ++ the correct parameter (regardless of type qualifiers (i.e.: const ++ and volatile)). */ ++extern "C++" { ++inline int iscanonical (float __val) { return __iscanonicalf (__val); } ++inline int iscanonical (double __val) { return __iscanonical (__val); } ++inline int iscanonical (long double __val) { return __iscanonicall (__val); } ++# if __HAVE_DISTINCT_FLOAT128 ++inline int iscanonical (_Float128 __val) { return __iscanonicalf128 (__val); } ++# endif ++} ++#endif /* __cplusplus */ +diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile +index dea2290736..cf2dbfb673 100644 +--- a/sysdeps/powerpc/powerpc64le/Makefile ++++ b/sysdeps/powerpc/powerpc64le/Makefile +@@ -16,6 +16,7 @@ $(foreach suf,$(all-object-suffixes),%f128_r$(suf)): CFLAGS += -mfloat128 + $(foreach suf,$(all-object-suffixes),$(objpfx)test-float128%$(suf)): CFLAGS += -mfloat128 + $(foreach suf,$(all-object-suffixes),$(objpfx)test-ifloat128%$(suf)): CFLAGS += -mfloat128 + CFLAGS-libm-test-support-float128.c += -mfloat128 ++CFLAGS-test-math-iscanonical.cc += -mfloat128 + CFLAGS-test-math-issignaling.cc += -mfloat128 + CFLAGS-test-math-iszero.cc += -mfloat128 + $(objpfx)test-float128% $(objpfx)test-ifloat128% $(objpfx)test-math-iszero: \ + diff --git a/srcpkgs/glibc/patches/glibc-upstream-46.patch b/srcpkgs/glibc/patches/glibc-upstream-46.patch new file mode 100644 index 00000000000..85a1ff352fb --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-46.patch @@ -0,0 +1,64 @@ +From dd3a7239fddff81ac31373d69978d7aa1902c65f Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Tue, 3 Oct 2017 17:41:32 -0700 +Subject: [PATCH 46] test-math-iscanonical.cc: Replace bool with int +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Fix GCC 7 compilation error: + +test-math-iscanonical.cc: In function ‘void check_type()’: +test-math-iscanonical.cc:33:11: error: use of an operand of type ‘bool’ in ‘operator++’ is deprecated [-Werror=deprecated] + errors++; + ^~ + +Since not all non-zero error counts are errors, return errors != 0 +instead. + + * math/test-math-iscanonical.cc (error): Replace bool with int. + (do_test): Return errors != 0. + +(cherry picked from commit cdd4155d6c527c00a89606385859984e35bd2910 and + commit 758f1bfa2a1bccb52f1b3e97444a367d35aceaee) +--- + ChangeLog | 5 +++++ + math/test-math-iscanonical.cc | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index fea4fd0cd6..d7a185e99d 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,8 @@ ++2017-10-04 H.J. Lu ++ ++ * math/test-math-iscanonical.cc (error): Replace bool with int. ++ (do_test): Return errors != 0. ++ + 2017-10-03 Gabriel F. T. Gomes + + [BZ #22235] +diff --git a/math/test-math-iscanonical.cc b/math/test-math-iscanonical.cc +index aba68acb4f..4cfb1c5055 100644 +--- a/math/test-math-iscanonical.cc ++++ b/math/test-math-iscanonical.cc +@@ -20,7 +20,7 @@ + #include + #include + +-static bool errors; ++static int errors; + + template + static void +@@ -42,7 +42,7 @@ do_test (void) + #if __HAVE_DISTINCT_FLOAT128 + check_type<_Float128> (); + #endif +- return errors; ++ return errors != 0; + } + + #include + diff --git a/srcpkgs/glibc/patches/glibc-upstream-47.patch b/srcpkgs/glibc/patches/glibc-upstream-47.patch new file mode 100644 index 00000000000..800676ee91b --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-47.patch @@ -0,0 +1,217 @@ +From 6e1ea21501eac981204c3cc8212d45998f74983c Mon Sep 17 00:00:00 2001 +From: Carlos O'Donell +Date: Thu, 28 Sep 2017 11:05:18 -0600 +Subject: [PATCH 47] malloc: Fix tcache leak after thread destruction [BZ + #22111] + +The malloc tcache added in 2.26 will leak all of the elements remaining +in the cache and the cache structure itself when a thread exits. The +defect is that we do not set tcache_shutting_down early enough, and the +thread simply recreates the tcache and places the elements back onto a +new tcache which is subsequently lost as the thread exits (unfreed +memory). The fix is relatively simple, move the setting of +tcache_shutting_down earlier in tcache_thread_freeres. We add a test +case which uses mallinfo and some heuristics to look for unaccounted for +memory usage between the start and end of a thread start/join loop. It +is very reliable at detecting that there is a leak given the number of +iterations. Without the fix the test will consume 122MiB of leaked +memory. + +(cherry picked from commit 1e26d35193efbb29239c710a4c46a64708643320) +--- + ChangeLog | 9 ++++ + malloc/Makefile | 3 ++ + malloc/malloc.c | 8 +-- + malloc/tst-malloc-tcache-leak.c | 112 ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 129 insertions(+), 3 deletions(-) + create mode 100644 malloc/tst-malloc-tcache-leak.c + +diff --git a/ChangeLog b/ChangeLog +index d7a185e99d..bfcdc1ebbf 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,12 @@ ++2017-10-06 Carlos O'Donell ++ ++ [BZ #22111] ++ * malloc/malloc.c (tcache_shutting_down): Use bool type. ++ (tcache_thread_freeres): Set tcache_shutting_down before ++ freeing the tcache. ++ * malloc/Makefile (tests): Add tst-malloc-tcache-leak. ++ * malloc/tst-malloc-tcache-leak.c: New file. ++ + 2017-10-04 H.J. Lu + + * math/test-math-iscanonical.cc (error): Replace bool with int. +diff --git a/malloc/Makefile b/malloc/Makefile +index 3fa395b949..9e23db9343 100644 +--- a/malloc/Makefile ++++ b/malloc/Makefile +@@ -34,6 +34,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ + tst-interpose-nothread \ + tst-interpose-thread \ + tst-alloc_buffer \ ++ tst-malloc-tcache-leak \ + + tests-static := \ + tst-interpose-static-nothread \ +@@ -242,3 +243,5 @@ tst-dynarray-fail-ENV = MALLOC_TRACE=$(objpfx)tst-dynarray-fail.mtrace + $(objpfx)tst-dynarray-fail-mem.out: $(objpfx)tst-dynarray-fail.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-dynarray-fail.mtrace > $@; \ + $(evaluate-test) ++ ++$(objpfx)tst-malloc-tcache-leak: $(shared-thread-library) +diff --git a/malloc/malloc.c b/malloc/malloc.c +index e3ff778113..01ec1571b9 100644 +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -2952,7 +2952,7 @@ typedef struct tcache_perthread_struct + tcache_entry *entries[TCACHE_MAX_BINS]; + } tcache_perthread_struct; + +-static __thread char tcache_shutting_down = 0; ++static __thread bool tcache_shutting_down = false; + static __thread tcache_perthread_struct *tcache = NULL; + + /* Caller must ensure that we know tc_idx is valid and there's room +@@ -2989,8 +2989,12 @@ tcache_thread_freeres (void) + if (!tcache) + return; + ++ /* Disable the tcache and prevent it from being reinitialized. */ + tcache = NULL; ++ tcache_shutting_down = true; + ++ /* Free all of the entries and the tcache itself back to the arena ++ heap for coalescing. */ + for (i = 0; i < TCACHE_MAX_BINS; ++i) + { + while (tcache_tmp->entries[i]) +@@ -3002,8 +3006,6 @@ tcache_thread_freeres (void) + } + + __libc_free (tcache_tmp); +- +- tcache_shutting_down = 1; + } + text_set_element (__libc_thread_subfreeres, tcache_thread_freeres); + +diff --git a/malloc/tst-malloc-tcache-leak.c b/malloc/tst-malloc-tcache-leak.c +new file mode 100644 +index 0000000000..22c679b65b +--- /dev/null ++++ b/malloc/tst-malloc-tcache-leak.c +@@ -0,0 +1,112 @@ ++/* Bug 22111: Test that threads do not leak their per thread cache. ++ Copyright (C) 2015-2017 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 ++ . */ ++ ++/* The point of this test is to start and exit a large number of ++ threads, while at the same time looking to see if the used ++ memory grows with each round of threads run. If the memory ++ grows above some linear bound we declare the test failed and ++ that the malloc implementation is leaking memory with each ++ thread. This is a good indicator that the thread local cache ++ is leaking chunks. */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++void * ++worker (void *data) ++{ ++ void *ret; ++ /* Allocate an arbitrary amount of memory that is known to fit into ++ the thread local cache (tcache). If we have at least 64 bins ++ (default e.g. TCACHE_MAX_BINS) we should be able to allocate 32 ++ bytes and force malloc to fill the tcache. We are assuming tcahce ++ init happens at the first small alloc, but it might in the future ++ be deferred to some other point. Therefore to future proof this ++ test we include a full alloc/free/alloc cycle for the thread. We ++ need a compiler barrier to avoid the removal of the useless ++ alloc/free. We send some memory back to main to have the memory ++ freed after the thread dies, as just another check that the chunks ++ that were previously in the tcache are still OK to free after ++ thread death. */ ++ ret = xmalloc (32); ++ __asm__ volatile ("" ::: "memory"); ++ free (ret); ++ return (void *) xmalloc (32); ++} ++ ++static int ++do_test (void) ++{ ++ pthread_t *thread; ++ struct mallinfo info_before, info_after; ++ void *retval; ++ ++ /* This is an arbitrary choice. We choose a total of THREADS ++ threads created and joined. This gives us enough iterations to ++ show a leak. */ ++ int threads = 100000; ++ ++ /* Avoid there being 0 malloc'd data at this point by allocating the ++ pthread_t required to run the test. */ ++ thread = (pthread_t *) xcalloc (1, sizeof (pthread_t)); ++ ++ info_before = mallinfo (); ++ ++ assert (info_before.uordblks != 0); ++ ++ printf ("INFO: %d (bytes) are in use before starting threads.\n", ++ info_before.uordblks); ++ ++ for (int loop = 0; loop < threads; loop++) ++ { ++ *thread = xpthread_create (NULL, worker, NULL); ++ retval = xpthread_join (*thread); ++ free (retval); ++ } ++ ++ info_after = mallinfo (); ++ printf ("INFO: %d (bytes) are in use after all threads joined.\n", ++ info_after.uordblks); ++ ++ /* We need to compare the memory in use before and the memory in use ++ after starting and joining THREADS threads. We almost always grow ++ memory slightly, but not much. Consider that if even 1-byte leaked ++ per thread we'd have THREADS bytes of additional memory, and in ++ general the in-use at the start of main is quite low. We will ++ always leak a full malloc chunk, and never just 1-byte, therefore ++ anything above "+ threads" from the start (constant offset) is a ++ leak. Obviously this assumes no thread-related malloc'd internal ++ libc data structures persist beyond the thread death, and any that ++ did would limit the number of times you could call pthread_create, ++ which is a QoI we'd want to detect and fix. */ ++ if (info_after.uordblks > (info_before.uordblks + threads)) ++ FAIL_EXIT1 ("Memory usage after threads is too high.\n"); ++ ++ /* Did not detect excessive memory usage. */ ++ free (thread); ++ exit (0); ++} ++ ++#include + diff --git a/srcpkgs/glibc/patches/glibc-upstream-48.patch b/srcpkgs/glibc/patches/glibc-upstream-48.patch new file mode 100644 index 00000000000..795cea2b417 --- /dev/null +++ b/srcpkgs/glibc/patches/glibc-upstream-48.patch @@ -0,0 +1,21 @@ +From d5c6dea2d5b4b5c64625c5386f6baec7bf2d89b3 Mon Sep 17 00:00:00 2001 +From: Carlos O'Donell +Date: Fri, 6 Oct 2017 13:31:05 -0700 +Subject: [PATCH 48] Update NEWS for bug 22111. + +--- + NEWS | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/NEWS b/NEWS +index 5b05edeb4f..d6d1f90008 100644 +--- a/NEWS ++++ b/NEWS +@@ -33,6 +33,7 @@ The following bugs are resolved with this release: + [22051] libc: zero terminator in the middle of glibc's .eh_frame + [22095] resolv: Fix memory leak with OOM during resolv.conf parsing + [22096] resolv: __resolv_conf_attach must not free passed conf object ++ [22111] malloc: per thread cache is not returned when thread exits + [22146] Let fpclassify use the builtin when optimizing for size in C++ mode + [22225] math: nearbyint arithmetic moved before feholdexcept + [22235] Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm