glibc: update upstream patches
This commit is contained in:
parent
1c6c0030af
commit
470d9bf316
48 changed files with 5019 additions and 67 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ From: Aurelien Jarno <aurelien@aurel32.net>
|
|||
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
|
||||
|
||||
|
||||
|
|
|
@ -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 <fweimer@redhat.com>
|
||||
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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
215
srcpkgs/glibc/patches/glibc-upstream-12.patch
Normal file
215
srcpkgs/glibc/patches/glibc-upstream-12.patch
Normal file
|
@ -0,0 +1,215 @@
|
|||
From fb9a781e9d62c5d7a1f4196915cdfb7c6db59a0c Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ [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 <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* 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 <bool> (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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <assert.h>
|
||||
+
|
||||
+/* 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 <class T> bool operator== (T) const; /* No definition. */
|
||||
+ template <class T> 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 <class T> bool operator== (T) const; /* No definition. */
|
||||
+ template <class T> bool operator!= (T) const; /* No definition. */
|
||||
+};
|
||||
+
|
||||
+static int
|
||||
+do_test ()
|
||||
+{
|
||||
+ {
|
||||
+ no_int value;
|
||||
+ assert (value);
|
||||
+ }
|
||||
+
|
||||
+ {
|
||||
+ bool_and_int value;
|
||||
+ assert (value);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <tst-assert-c++.cc>
|
||||
|
27
srcpkgs/glibc/patches/glibc-upstream-13.patch
Normal file
27
srcpkgs/glibc/patches/glibc-upstream-13.patch
Normal file
|
@ -0,0 +1,27 @@
|
|||
From 3aeab55ee17ca527e4597bc8397c0434c3f8b34e Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
||||
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
|
||||
|
62
srcpkgs/glibc/patches/glibc-upstream-14.patch
Normal file
62
srcpkgs/glibc/patches/glibc-upstream-14.patch
Normal file
|
@ -0,0 +1,62 @@
|
|||
From 77db8772bd3f6f2bbad697dcf46861ce310f5b95 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ * 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 <fweimer@redhat.com>
|
||||
|
||||
[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 <sys/time.h>
|
||||
|
||||
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)
|
||||
|
||||
|
||||
|
81
srcpkgs/glibc/patches/glibc-upstream-15.patch
Normal file
81
srcpkgs/glibc/patches/glibc-upstream-15.patch
Normal file
|
@ -0,0 +1,81 @@
|
|||
From 6043d77a47de297b62084c1c261cdada082bf09c Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Schwab <schwab@suse.de>
|
||||
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 <schwab@suse.de>
|
||||
+
|
||||
+ [BZ #16750]
|
||||
+ CVE-2009-5064
|
||||
+ * elf/ldd.bash.in: Never run file directly.
|
||||
+
|
||||
2017-08-10 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* 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
|
||||
;;
|
||||
*)
|
||||
|
244
srcpkgs/glibc/patches/glibc-upstream-16.patch
Normal file
244
srcpkgs/glibc/patches/glibc-upstream-16.patch
Normal file
|
@ -0,0 +1,244 @@
|
|||
From ef8566d72af5e03c1b82cf02efb794268a347f8c Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
||||
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 <gftg@linux.vnet.ibm.com>
|
||||
+
|
||||
+ * 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 <schwab@suse.de>
|
||||
|
||||
[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 <bits/iscanonical.h>
|
||||
|
||||
/* 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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#define _GNU_SOURCE 1
|
||||
+#include <math.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+#include <limits>
|
||||
+
|
||||
+/* 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 <ieee754_float128.h>
|
||||
+#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 <class T>
|
||||
+static void
|
||||
+check_type ()
|
||||
+{
|
||||
+ typedef std::numeric_limits<T> 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<float> ();
|
||||
+ check_type<double> ();
|
||||
+ check_type<long double> ();
|
||||
+#if __HAVE_DISTINCT_FLOAT128
|
||||
+ check_float128 ();
|
||||
+#endif
|
||||
+ return errors;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
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
|
||||
|
58
srcpkgs/glibc/patches/glibc-upstream-17.patch
Normal file
58
srcpkgs/glibc/patches/glibc-upstream-17.patch
Normal file
|
@ -0,0 +1,58 @@
|
|||
From 35dded99a89db873b06270ca7f21245a0faf712a Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
||||
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 <gftg@linux.vnet.ibm.com>
|
||||
+
|
||||
+ * 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 <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* 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
|
||||
|
232
srcpkgs/glibc/patches/glibc-upstream-18.patch
Normal file
232
srcpkgs/glibc/patches/glibc-upstream-18.patch
Normal file
|
@ -0,0 +1,232 @@
|
|||
From 58270c0049404ef2f878fdd45df55f17f0b8c1f7 Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
||||
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 <gftg@linux.vnet.ibm.com>
|
||||
+
|
||||
+ [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 <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* 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 <class __T> 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 <limits>
|
||||
|
||||
+/* 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 <ieee754_float128.h>
|
||||
+#endif
|
||||
+
|
||||
static bool errors;
|
||||
|
||||
static void
|
||||
@@ -72,12 +79,84 @@ check_type ()
|
||||
std::numeric_limits<T>::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<float> ();
|
||||
check_type<double> ();
|
||||
check_type<long double> ();
|
||||
+#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
|
||||
|
||||
|
61
srcpkgs/glibc/patches/glibc-upstream-19.patch
Normal file
61
srcpkgs/glibc/patches/glibc-upstream-19.patch
Normal file
|
@ -0,0 +1,61 @@
|
|||
From 947e2e0a9410c18eb44144456c7fe8e7c0e2a999 Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Myers <joseph@codesourcery.com>
|
||||
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 <joseph@codesourcery.com>
|
||||
+
|
||||
+ * assert/Makefile [$(have-cxx-thread_local)]: Move conditional
|
||||
+ variable definitions above inclusion of ../Rules.
|
||||
+
|
||||
2017-08-28 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
|
||||
|
||||
[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
|
||||
|
47
srcpkgs/glibc/patches/glibc-upstream-20.patch
Normal file
47
srcpkgs/glibc/patches/glibc-upstream-20.patch
Normal file
|
@ -0,0 +1,47 @@
|
|||
From 4fdd75e4463801b9d8f329769df1a26145560656 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Remove unreachable
|
||||
+ return statement.
|
||||
+
|
||||
2017-08-22 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* 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);
|
||||
|
99
srcpkgs/glibc/patches/glibc-upstream-21.patch
Normal file
99
srcpkgs/glibc/patches/glibc-upstream-21.patch
Normal file
|
@ -0,0 +1,99 @@
|
|||
From 5253749232749adb535d9b2bf7d43173b191ebef Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <support/test-driver.h>
|
||||
#include <support/xunistd.h>
|
||||
|
||||
+/* 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);
|
||||
}
|
||||
|
117
srcpkgs/glibc/patches/glibc-upstream-22.patch
Normal file
117
srcpkgs/glibc/patches/glibc-upstream-22.patch
Normal file
|
@ -0,0 +1,117 @@
|
|||
From bdd8422cfb1fe04cb20617495156fb232b00d23c Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ * sysdeps/posix/getaddrinfo.c (gethosts): Use errno directly.
|
||||
+ (getcanonname): Likewise.
|
||||
+ (gaih_inet): Likewise.
|
||||
+
|
||||
2017-08-08 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* 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;
|
||||
|
171
srcpkgs/glibc/patches/glibc-upstream-23.patch
Normal file
171
srcpkgs/glibc/patches/glibc-upstream-23.patch
Normal file
|
@ -0,0 +1,171 @@
|
|||
From 701f7873da013fb19d9120317322cd78333e63c2 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly.
|
||||
+ (getcanonname): Likewise.
|
||||
+ (gaih_inet): Likewise.
|
||||
+
|
||||
+2017-09-01 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
56
srcpkgs/glibc/patches/glibc-upstream-24.patch
Normal file
56
srcpkgs/glibc/patches/glibc-upstream-24.patch
Normal file
|
@ -0,0 +1,56 @@
|
|||
From 8f46c6052408a23a77ecf46aa378120c1a4afe37 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Make reporting of NSS
|
||||
+ function lookup failures more reliable.
|
||||
+
|
||||
+2017-09-01 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
47
srcpkgs/glibc/patches/glibc-upstream-25.patch
Normal file
47
srcpkgs/glibc/patches/glibc-upstream-25.patch
Normal file
|
@ -0,0 +1,47 @@
|
|||
From 7ab87bccb657b02cac5a3360b11c67aff901de2e Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Only use h_errno if
|
||||
+ status indicates it is set.
|
||||
+
|
||||
+2017-09-01 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
* 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;
|
||||
|
61
srcpkgs/glibc/patches/glibc-upstream-26.patch
Normal file
61
srcpkgs/glibc/patches/glibc-upstream-26.patch
Normal file
|
@ -0,0 +1,61 @@
|
|||
From 7966331555df43bb7e2a55ce5a17a330e57f487f Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ [BZ #21922]
|
||||
+ * sysdeps/posix/getaddrinfo.c (gaih_inet): Report EAI_NODATA error
|
||||
+ coming from gethostbyname2_r.
|
||||
+
|
||||
+2017-09-01 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
* 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
|
||||
{
|
||||
|
376
srcpkgs/glibc/patches/glibc-upstream-27.patch
Normal file
376
srcpkgs/glibc/patches/glibc-upstream-27.patch
Normal file
|
@ -0,0 +1,376 @@
|
|||
From a71a3374cd8cf53776c33994f69ec184c26f2129 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ [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 <fweimer@redhat.com>
|
||||
+
|
||||
[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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+#include <errno.h>
|
||||
+#include <gnu/lib-names.h>
|
||||
+#include <netdb.h>
|
||||
+#include <nss.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/check_nss.h>
|
||||
+#include <support/namespace.h>
|
||||
+#include <support/test-driver.h>
|
||||
+#include <support/xunistd.h>
|
||||
+
|
||||
+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 <support/test-driver.c>
|
||||
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); \
|
||||
|
346
srcpkgs/glibc/patches/glibc-upstream-28.patch
Normal file
346
srcpkgs/glibc/patches/glibc-upstream-28.patch
Normal file
|
@ -0,0 +1,346 @@
|
|||
From 85cfe508568530eed2d9cfd34110c21721d1f99e Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ 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 <fweimer@redhat.com>
|
||||
|
||||
[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 <netdb.h>
|
||||
#include <resolv.h>
|
||||
#include <string.h>
|
||||
+#include <support/check.h>
|
||||
#include <support/check_nss.h>
|
||||
#include <support/resolv_test.h>
|
||||
#include <support/xthread.h>
|
||||
|
||||
+/* 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);
|
||||
|
||||
|
316
srcpkgs/glibc/patches/glibc-upstream-29.patch
Normal file
316
srcpkgs/glibc/patches/glibc-upstream-29.patch
Normal file
|
@ -0,0 +1,316 @@
|
|||
From 3005466abe8fb80ad4ff51865f1e28dd81c43347 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ 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 <fweimer@redhat.com>
|
||||
+
|
||||
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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
+#include <ctype.h>
|
||||
#include <netdb.h>
|
||||
#include <resolv.h>
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <support/check.h>
|
||||
#include <support/check_nss.h>
|
||||
#include <support/resolv_test.h>
|
||||
+#include <support/support.h>
|
||||
#include <support/xthread.h>
|
||||
|
||||
+/* 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 ();
|
||||
|
58
srcpkgs/glibc/patches/glibc-upstream-30.patch
Normal file
58
srcpkgs/glibc/patches/glibc-upstream-30.patch
Normal file
|
@ -0,0 +1,58 @@
|
|||
From 905a6129147e7ee80e8918e23efe212433b8cce7 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ [BZ #22095]
|
||||
+ * resolv/res_init.c (res_vinit_1): Avoid memory leak in case of
|
||||
+ dynarray allocation failure.
|
||||
+
|
||||
+2017-09-06 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
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;
|
||||
}
|
||||
|
58
srcpkgs/glibc/patches/glibc-upstream-31.patch
Normal file
58
srcpkgs/glibc/patches/glibc-upstream-31.patch
Normal file
|
@ -0,0 +1,58 @@
|
|||
From 27233446a62ca35ce0b54566279a99a6774d4210 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ [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 <fweimer@redhat.com>
|
||||
+
|
||||
[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;
|
||||
|
41
srcpkgs/glibc/patches/glibc-upstream-32.patch
Normal file
41
srcpkgs/glibc/patches/glibc-upstream-32.patch
Normal file
|
@ -0,0 +1,41 @@
|
|||
From d265b6129184dd94da600187b67cef9125bc58c7 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
|
||||
+ * malloc/dynarray_emplace_enlarge.c
|
||||
+ (__libc_dynarray_emplace_enlarge): Add missing else.
|
||||
+
|
||||
+2017-09-06 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
[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;
|
||||
|
139
srcpkgs/glibc/patches/glibc-upstream-33.patch
Normal file
139
srcpkgs/glibc/patches/glibc-upstream-33.patch
Normal file
|
@ -0,0 +1,139 @@
|
|||
From 8a1adb593969e099604537804f594efe01e04f6f Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
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 <fweimer@redhat.com>
|
||||
+
|
||||
+ * 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 <fweimer@redhat.com>
|
||||
|
||||
* 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 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <dynarray.h>
|
||||
+#include <errno.h>
|
||||
#include <malloc-internal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -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 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <dynarray.h>
|
||||
+#include <errno.h>
|
||||
#include <malloc-internal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -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 <errno.h>
|
||||
+#include <stdint.h>
|
||||
+
|
||||
#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;
|
||||
}
|
||||
|
59
srcpkgs/glibc/patches/glibc-upstream-34.patch
Normal file
59
srcpkgs/glibc/patches/glibc-upstream-34.patch
Normal file
|
@ -0,0 +1,59 @@
|
|||
From dca8b177f6bb521638f4d8a845b4cb10348137c9 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
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 <hongjiu.lu@intel.com>
|
||||
+
|
||||
+ [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 <fweimer@redhat.com>
|
||||
|
||||
* 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
|
||||
|
41
srcpkgs/glibc/patches/glibc-upstream-35.patch
Normal file
41
srcpkgs/glibc/patches/glibc-upstream-35.patch
Normal file
|
@ -0,0 +1,41 @@
|
|||
From 86553be84d071aee8464b2c2fa03858d12118852 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
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 <hongjiu.lu@intel.com>
|
||||
+
|
||||
+ * resolv/tst-resolv-qtypes.c (domain): Changed to
|
||||
+ "const char domain[] =".
|
||||
+
|
||||
2017-08-31 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
[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)
|
||||
|
43
srcpkgs/glibc/patches/glibc-upstream-36.patch
Normal file
43
srcpkgs/glibc/patches/glibc-upstream-36.patch
Normal file
|
@ -0,0 +1,43 @@
|
|||
From 5f5532caf820f47f714d09766082f1e070c12cfb Mon Sep 17 00:00:00 2001
|
||||
From: Markus Trippelsdorf <markus@trippelsdorf.de>
|
||||
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 <markus@trippelsdorf.de>
|
||||
+
|
||||
+ * sysdeps/x86_64/fpu/libm-test-ulps: Update for AMD Ryzen.
|
||||
+
|
||||
2017-09-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* 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
|
||||
|
654
srcpkgs/glibc/patches/glibc-upstream-37.patch
Normal file
654
srcpkgs/glibc/patches/glibc-upstream-37.patch
Normal file
|
@ -0,0 +1,654 @@
|
|||
From 56ce01906ecb0a3e04411f8ceb60b27f4877f070 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
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 <hongjiu.lu@intel.com>
|
||||
+
|
||||
+ [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 <markus@trippelsdorf.de>
|
||||
|
||||
* 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
|
||||
}
|
||||
|
||||
|
223
srcpkgs/glibc/patches/glibc-upstream-38.patch
Normal file
223
srcpkgs/glibc/patches/glibc-upstream-38.patch
Normal file
|
@ -0,0 +1,223 @@
|
|||
From 2422c6032fd5e95b1c29df5b8671455ead51314e Mon Sep 17 00:00:00 2001
|
||||
From: Alan Modra <amodra@gmail.com>
|
||||
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 <amodra@gmail.com>
|
||||
+
|
||||
+ * 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 <hongjiu.lu@intel.com>
|
||||
|
||||
[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 <stdio.h>
|
||||
+
|
||||
+#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 <stdio.h>
|
||||
-
|
||||
-#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 <support/test-driver.c>
|
||||
|
41
srcpkgs/glibc/patches/glibc-upstream-39.patch
Normal file
41
srcpkgs/glibc/patches/glibc-upstream-39.patch
Normal file
|
@ -0,0 +1,41 @@
|
|||
From ac6113cb0146494af7ecacbbdc6957ce501a40ec Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sebor <msebor@redhat.com>
|
||||
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 <msebor@redhat.com>
|
||||
+
|
||||
+ * 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 <amodra@gmail.com>
|
||||
|
||||
* 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; \
|
||||
|
76
srcpkgs/glibc/patches/glibc-upstream-40.patch
Normal file
76
srcpkgs/glibc/patches/glibc-upstream-40.patch
Normal file
|
@ -0,0 +1,76 @@
|
|||
From 37d4262a7a35886cf8ac856457bbad8c0498c8d6 Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com>
|
||||
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 <msebor@redhat.com>
|
||||
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 <gftg@linux.vnet.ibm.com>
|
||||
+
|
||||
+ * 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 <msebor@redhat.com>
|
||||
|
||||
* 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");
|
||||
|
||||
|
86
srcpkgs/glibc/patches/glibc-upstream-41.patch
Normal file
86
srcpkgs/glibc/patches/glibc-upstream-41.patch
Normal file
|
@ -0,0 +1,86 @@
|
|||
From d37c951fde57e8acb320a9a7d437ba50a1fc3c8a Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gabriel@inconstante.eti.br>
|
||||
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 <gabriel@inconstante.eti.br>
|
||||
+
|
||||
+ [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 <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* 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
|
||||
|
165
srcpkgs/glibc/patches/glibc-upstream-42.patch
Normal file
165
srcpkgs/glibc/patches/glibc-upstream-42.patch
Normal file
|
@ -0,0 +1,165 @@
|
|||
From 548cc83c38a91852b1e44045ead3d20ccd5db4cf Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Myers <joseph@codesourcery.com>
|
||||
Date: Thu, 28 Sep 2017 01:59:02 +0000
|
||||
Subject: [PATCH 42] Fix nearbyint arithmetic moved before feholdexcept (bug
|
||||
22225).
|
||||
|
||||
In <https://sourceware.org/ml/libc-alpha/2013-05/msg00722.html> 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 <joseph@codesourcery.com>
|
||||
+
|
||||
+ [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 <gabriel@inconstante.eti.br>
|
||||
|
||||
[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);
|
||||
|
28
srcpkgs/glibc/patches/glibc-upstream-43.patch
Normal file
28
srcpkgs/glibc/patches/glibc-upstream-43.patch
Normal file
|
@ -0,0 +1,28 @@
|
|||
From fdf58ebc60ce0eb459fd616241b52872b3571ac1 Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Myers <joseph@codesourcery.com>
|
||||
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
|
||||
|
||||
|
104
srcpkgs/glibc/patches/glibc-upstream-44.patch
Normal file
104
srcpkgs/glibc/patches/glibc-upstream-44.patch
Normal file
|
@ -0,0 +1,104 @@
|
|||
From 3f68c5c9b61600f0f85c75bac15b1520d5059359 Mon Sep 17 00:00:00 2001
|
||||
From: Joseph Myers <joseph@codesourcery.com>
|
||||
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 <joseph@codesourcery.com>
|
||||
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 <joseph@codesourcery.com>
|
||||
+
|
||||
+ [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 <joseph@codesourcery.com>
|
||||
|
||||
[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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <bits/wordsize.h>
|
||||
+
|
||||
+#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
|
||||
|
250
srcpkgs/glibc/patches/glibc-upstream-45.patch
Normal file
250
srcpkgs/glibc/patches/glibc-upstream-45.patch
Normal file
|
@ -0,0 +1,250 @@
|
|||
From 3b10c5d2abb0392d5ecfd865e2eb911ac109e36f Mon Sep 17 00:00:00 2001
|
||||
From: "Gabriel F. T. Gomes" <gabriel@inconstante.eti.br>
|
||||
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 <gabriel@inconstante.eti.br>
|
||||
+
|
||||
+ [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 <joseph@codesourcery.com>
|
||||
|
||||
[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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#define _GNU_SOURCE 1
|
||||
+#include <math.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+static bool errors;
|
||||
+
|
||||
+template <class T>
|
||||
+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<float> ();
|
||||
+ check_type<double> ();
|
||||
+ check_type<long double> ();
|
||||
+#if __HAVE_DISTINCT_FLOAT128
|
||||
+ check_type<_Float128> ();
|
||||
+#endif
|
||||
+ return errors;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
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: \
|
||||
|
64
srcpkgs/glibc/patches/glibc-upstream-46.patch
Normal file
64
srcpkgs/glibc/patches/glibc-upstream-46.patch
Normal file
|
@ -0,0 +1,64 @@
|
|||
From dd3a7239fddff81ac31373d69978d7aa1902c65f Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
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 <hongjiu.lu@intel.com>
|
||||
+
|
||||
+ * math/test-math-iscanonical.cc (error): Replace bool with int.
|
||||
+ (do_test): Return errors != 0.
|
||||
+
|
||||
2017-10-03 Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
|
||||
|
||||
[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 <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
-static bool errors;
|
||||
+static int errors;
|
||||
|
||||
template <class T>
|
||||
static void
|
||||
@@ -42,7 +42,7 @@ do_test (void)
|
||||
#if __HAVE_DISTINCT_FLOAT128
|
||||
check_type<_Float128> ();
|
||||
#endif
|
||||
- return errors;
|
||||
+ return errors != 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
||||
|
217
srcpkgs/glibc/patches/glibc-upstream-47.patch
Normal file
217
srcpkgs/glibc/patches/glibc-upstream-47.patch
Normal file
|
@ -0,0 +1,217 @@
|
|||
From 6e1ea21501eac981204c3cc8212d45998f74983c Mon Sep 17 00:00:00 2001
|
||||
From: Carlos O'Donell <carlos@systemhalted.org>
|
||||
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 <carlos@redhat.com>
|
||||
+
|
||||
+ [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 <hongjiu.lu@intel.com>
|
||||
|
||||
* 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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+/* 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 <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <malloc.h>
|
||||
+#include <pthread.h>
|
||||
+#include <assert.h>
|
||||
+
|
||||
+#include <support/check.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/xthread.h>
|
||||
+
|
||||
+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 <support/test-driver.c>
|
||||
|
21
srcpkgs/glibc/patches/glibc-upstream-48.patch
Normal file
21
srcpkgs/glibc/patches/glibc-upstream-48.patch
Normal file
|
@ -0,0 +1,21 @@
|
|||
From d5c6dea2d5b4b5c64625c5386f6baec7bf2d89b3 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos O'Donell <carlos@systemhalted.org>
|
||||
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
|
Loading…
Reference in a new issue