SHA256
1
0
forked from pool/glibc

Accepting request 417981 from Base:System

- Update to glibc 2.24
  * The minimum Linux kernel version that this version of the GNU C Library
    can be used with is 3.2
  * The pap_AN locale has been deleted
  * The readdir_r and readdir64_r functions have been deprecated
  * The type `union wait' has been removed
  * A new NSS action is added to facilitate large distributed system
    administration
  * The deprecated __malloc_initialize_hook variable has been removed from
    the API
  * The long unused localedef --old-style option has been removed
  * nextupl, nextup, nextupf, nextdownl, nextdown and nextdownf are added
    to libm
  * An unnecessary stack copy in _nss_dns_getnetbyname_r was removed
    (CVE-2016-3075)
  * Previously, getaddrinfo copied large amounts of address data to the
    stack, even after the fix for CVE-2013-4458 has been applied,
    potentially resulting in a stack overflow.  getaddrinfo now uses a
    heap allocation instead (CVE-2016-3706)
  * The glob function suffered from a stack-based buffer overflow when it
    was called with the GLOB_ALTDIRFUNC flag and encountered a long file
    name (CVE-2016-1234)
  * The Sun RPC UDP client could exhaust all available stack space when
    flooded with crafted ICMP and UDP messages (CVE-2016-4429)
  * The IPv6 name server management code in libresolv could result in a
    memory leak for each thread which is created, performs a failing
    naming lookup, and exits (CVE-2016-5417)
- startcontext-cantunwind.patch: mark __startcontext as .cantunwind
  (bsc#974800, BZ )
- Removed patches:

OBS-URL: https://build.opensuse.org/request/show/417981
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/glibc?expand=0&rev=206
This commit is contained in:
Dominique Leuenberger 2016-09-09 08:12:50 +00:00 committed by Git OBS Bridge
parent b1c9f643ae
commit 71b6875764
80 changed files with 421 additions and 63165 deletions
0001-Updated-translations-for-2.23.patch0002-Regenerate-libc.pot-for-2.23.patch0003-Regenerated-configure-scripts.patch0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch0008-Update-NEWS.patch0009-sln-use-stat64.patch0010-Add-sys-auxv.h-wrapper-to-include-sys.patch0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch0013-Mention-BZ-19762-in-NEWS.patch0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch0016-Fix-resource-leak-in-resolver-bug-19257.patch0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch0022-configure-fix-test-usage.patch0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch0025-getnameinfo-Do-not-preserve-errno.patch0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch0030-hesiod-Remove-RCS-keywords.patch0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch0033-malloc-Remove-NO_THREADS.patch0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch0036-malloc-Remove-malloc-hooks-from-fork-handler.patch0037-malloc-Add-missing-internal_function-attributes-on-f.patch0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch0041-nss_dns-Check-address-length-before-creating-addrinf.patch0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch0047-strfmon_l-Use-specified-locale-for-number-formatting.patch0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch0052-Fix-tst-dlsym-error-build.patch0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch_serviceclntudp-call-alloca.patchfnmatch-collating-elements.patchglibc-2.23.tar.xzglibc-2.23.tar.xz.sigglibc-2.24.tar.xzglibc-2.24.tar.xz.sigglibc-2.4-china.diffglibc-memset-nontemporal.diffglibc-resolv-reload.diffglibc-testsuite.changesglibc-testsuite.specglibc-utils.changesglibc-utils.specglibc.changesglibc.keyringglibc.speciconv-reset-input-buffer.patchnis-initgroups-status.patchnscd-gc-crash.patchreinitialize-dl_load_write_lock.patchrobust-mutex-deadlock.patchstartcontext-cantunwind.patchstrncat-avoid-array-bounds-warning.patch

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,17 +0,0 @@
2016-02-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* configure: Regenerated.
Index: glibc-2.23/configure
===================================================================
--- glibc-2.23.orig/configure
+++ glibc-2.23/configure
@@ -3864,7 +3864,7 @@ if test -z "$enable_hacker_mode" && test
*** The GNU C library is currently unavailable for this platform.
*** If you are interested in seeing glibc on this platform visit
*** the \"How to submit a new port\" in the wiki:
-*** https://sourceware.org/glibc/wiki/HomePage#Development
+*** https://sourceware.org/glibc/wiki/#Development
*** and join the community!" "$LINENO" 5
;;
esac

@ -1,101 +0,0 @@
2016-02-22 H.J. Lu <hongjiu.lu@intel.com>
[BZ #19679]
* sysdeps/x86_64/dl-trampoline.S (DL_RUNIME_UNALIGNED_VEC_SIZE):
Renamed to ...
(DL_RUNTIME_UNALIGNED_VEC_SIZE): This. Set to 8.
(DL_RUNIME_RESOLVE_REALIGN_STACK): Renamed to ...
(DL_RUNTIME_RESOLVE_REALIGN_STACK): This. Updated.
(DL_RUNIME_RESOLVE_REALIGN_STACK): Renamed to ...
(DL_RUNTIME_RESOLVE_REALIGN_STACK): This.
* sysdeps/x86_64/dl-trampoline.h
(DL_RUNIME_RESOLVE_REALIGN_STACK): Renamed to ...
(DL_RUNTIME_RESOLVE_REALIGN_STACK): This.
Index: glibc-2.23/sysdeps/x86_64/dl-trampoline.S
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/dl-trampoline.S
+++ glibc-2.23/sysdeps/x86_64/dl-trampoline.S
@@ -33,15 +33,19 @@
# define DL_STACK_ALIGNMENT 8
#endif
-#ifndef DL_RUNIME_UNALIGNED_VEC_SIZE
-/* The maximum size of unaligned vector load and store. */
-# define DL_RUNIME_UNALIGNED_VEC_SIZE 16
+#ifndef DL_RUNTIME_UNALIGNED_VEC_SIZE
+/* The maximum size in bytes of unaligned vector load and store in the
+ dynamic linker. Since SSE optimized memory/string functions with
+ aligned SSE register load and store are used in the dynamic linker,
+ we must set this to 8 so that _dl_runtime_resolve_sse will align the
+ stack before calling _dl_fixup. */
+# define DL_RUNTIME_UNALIGNED_VEC_SIZE 8
#endif
/* True if _dl_runtime_resolve should align stack to VEC_SIZE bytes. */
-#define DL_RUNIME_RESOLVE_REALIGN_STACK \
+#define DL_RUNTIME_RESOLVE_REALIGN_STACK \
(VEC_SIZE > DL_STACK_ALIGNMENT \
- && VEC_SIZE > DL_RUNIME_UNALIGNED_VEC_SIZE)
+ && VEC_SIZE > DL_RUNTIME_UNALIGNED_VEC_SIZE)
/* Align vector register save area to 16 bytes. */
#define REGISTER_SAVE_VEC_OFF 0
@@ -76,7 +80,7 @@
#ifdef HAVE_AVX512_ASM_SUPPORT
# define VEC_SIZE 64
# define VMOVA vmovdqa64
-# if DL_RUNIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
+# if DL_RUNTIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
# define VMOV vmovdqa64
# else
# define VMOV vmovdqu64
@@ -100,7 +104,7 @@ strong_alias (_dl_runtime_profile_avx, _
#define VEC_SIZE 32
#define VMOVA vmovdqa
-#if DL_RUNIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
+#if DL_RUNTIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
# define VMOV vmovdqa
#else
# define VMOV vmovdqu
@@ -119,7 +123,7 @@ strong_alias (_dl_runtime_profile_avx, _
/* movaps/movups is 1-byte shorter. */
#define VEC_SIZE 16
#define VMOVA movaps
-#if DL_RUNIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
+#if DL_RUNTIME_RESOLVE_REALIGN_STACK || VEC_SIZE <= DL_STACK_ALIGNMENT
# define VMOV movaps
#else
# define VMOV movups
Index: glibc-2.23/sysdeps/x86_64/dl-trampoline.h
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/dl-trampoline.h
+++ glibc-2.23/sysdeps/x86_64/dl-trampoline.h
@@ -30,7 +30,7 @@
#undef REGISTER_SAVE_AREA
#undef LOCAL_STORAGE_AREA
#undef BASE
-#if DL_RUNIME_RESOLVE_REALIGN_STACK
+#if DL_RUNTIME_RESOLVE_REALIGN_STACK
# define REGISTER_SAVE_AREA (REGISTER_SAVE_AREA_RAW + 8)
/* Local stack area before jumping to function address: RBX. */
# define LOCAL_STORAGE_AREA 8
@@ -57,7 +57,7 @@
cfi_startproc
_dl_runtime_resolve:
cfi_adjust_cfa_offset(16) # Incorporate PLT
-#if DL_RUNIME_RESOLVE_REALIGN_STACK
+#if DL_RUNTIME_RESOLVE_REALIGN_STACK
# if LOCAL_STORAGE_AREA != 8
# error LOCAL_STORAGE_AREA must be 8
# endif
@@ -146,7 +146,7 @@ _dl_runtime_resolve:
VMOV (REGISTER_SAVE_VEC_OFF + VEC_SIZE * 5)(%rsp), %VEC(5)
VMOV (REGISTER_SAVE_VEC_OFF + VEC_SIZE * 6)(%rsp), %VEC(6)
VMOV (REGISTER_SAVE_VEC_OFF + VEC_SIZE * 7)(%rsp), %VEC(7)
-#if DL_RUNIME_RESOLVE_REALIGN_STACK
+#if DL_RUNTIME_RESOLVE_REALIGN_STACK
mov %RBX_LP, %RSP_LP
cfi_def_cfa_register(%rsp)
movq (%rsp), %rbx

@ -1,19 +0,0 @@
2016-02-22 Roland McGrath <roland@hack.frob.com>
* sysdeps/arm/nacl/libc.abilist (GLIBC_2.23): Add GLIBC_2.23,
fts64_children, fts64_close, fts64_open, fts64_read and fts64_set.
Index: glibc-2.23/sysdeps/arm/nacl/libc.abilist
===================================================================
--- glibc-2.23.orig/sysdeps/arm/nacl/libc.abilist
+++ glibc-2.23/sysdeps/arm/nacl/libc.abilist
@@ -1834,3 +1834,9 @@ GLIBC_2.22 wprintf F
GLIBC_2.22 write F
GLIBC_2.22 writev F
GLIBC_2.22 wscanf F
+GLIBC_2.23 GLIBC_2.23 A
+GLIBC_2.23 fts64_children F
+GLIBC_2.23 fts64_close F
+GLIBC_2.23 fts64_open F
+GLIBC_2.23 fts64_read F
+GLIBC_2.23 fts64_set F

@ -1,28 +0,0 @@
2016-02-24 Andreas Schwab <schwab@suse.de>
* math/test-math-isinff.cc (do_test): Only call isinfl and isnanl
if !NO_LONG_DOUBLE.
Index: glibc-2.23/math/test-math-isinff.cc
===================================================================
--- glibc-2.23.orig/math/test-math-isinff.cc
+++ glibc-2.23/math/test-math-isinff.cc
@@ -30,12 +30,17 @@ do_test (void)
header fix this test will not compile. */
if (isinff (1.0f)
|| !isinff (INFINITY)
+#ifndef NO_LONG_DOUBLE
|| isinfl (1.0L)
|| !isinfl (INFINITY)
+#endif
|| isnanf (2.0f)
|| !isnanf (NAN)
+#ifndef NO_LONG_DOUBLE
|| isnanl (2.0L)
- || !isnanl (NAN))
+ || !isnanl (NAN)
+#endif
+ )
{
printf ("FAIL: Failed to call is* functions.\n");
exit (1);

@ -1,17 +0,0 @@
2016-02-24 Marko Myllynen <myllynen@redhat.com>
* NEWS (2.23): Fix typo in bug 19048 text.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -38,7 +38,7 @@ Version 2.23
unnecessary serialization of memory allocation requests across threads.
The defect is now corrected. Users should see a substantial increase in
the concurent throughput of allocation requests for applications which
- trigger this bug. Affected applications typically create create and
+ trigger this bug. Affected applications typically create and
destroy threads frequently. (Bug 19048 was reported and analyzed by
Ericsson.)

@ -1,22 +0,0 @@
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -5,6 +5,17 @@ See the end for copying conditions.
Please send GNU C library bug reports via <http://sourceware.org/bugzilla/>
using `glibc' in the "product" field.
+Version 2.23.1
+
+Security related changes:
+
+ [Add security related changes here]
+
+The following bugs are resolved with this release:
+
+ [19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
+
+
Version 2.23
* Unicode 8.0.0 Support: Character encoding, character type info, and

@ -1,23 +0,0 @@
2016-03-07 Hongjiu Zhang <noctuorare@gmail.com>
* elf/sln.c (makesymlink): Change struct stat to stat64, and lstat
to lstat64.
Index: glibc-2.23/elf/sln.c
===================================================================
--- glibc-2.23.orig/elf/sln.c
+++ glibc-2.23/elf/sln.c
@@ -164,11 +164,11 @@ makesymlinks (const char *file)
static int
makesymlink (const char *src, const char *dest)
{
- struct stat stats;
+ struct stat64 stats;
const char *error;
/* Destination must not be a directory. */
- if (lstat (dest, &stats) == 0)
+ if (lstat64 (dest, &stats) == 0)
{
if (S_ISDIR (stats.st_mode))
{

@ -1,10 +0,0 @@
2016-03-08 Aurelien Jarno <aurelien@aurel32.net>
* include/sys/auxv.h: New file.
Index: glibc-2.23/include/sys/auxv.h
===================================================================
--- /dev/null
+++ glibc-2.23/include/sys/auxv.h
@@ -0,0 +1 @@
+#include <misc/sys/auxv.h>

@ -1,43 +0,0 @@
2016-03-09 Aurelien Jarno <aurelien@aurel32.net>
[BZ #19792]
* sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
Terminate FDE before return label.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -14,6 +14,7 @@ Security related changes:
The following bugs are resolved with this release:
[19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
+ [19792] MIPS: backtrace yields infinite backtrace with makecontext
Version 2.23
Index: glibc-2.23/sysdeps/unix/sysv/linux/mips/makecontext.S
===================================================================
--- glibc-2.23.orig/sysdeps/unix/sysv/linux/mips/makecontext.S
+++ glibc-2.23/sysdeps/unix/sysv/linux/mips/makecontext.S
@@ -153,6 +153,11 @@ NESTED (__makecontext, FRAMESZ, ra)
#endif
jr ra
+ /* We need to terminate the FDE to stop unwinding if backtrace was
+ called within a context created by makecontext. */
+ cfi_endproc
+ nop
+
99:
#ifdef __PIC__
move gp, s1
@@ -186,6 +191,8 @@ NESTED (__makecontext, FRAMESZ, ra)
1:
lb zero, (zero)
b 1b
+
+ cfi_startproc
PSEUDO_END (__makecontext)
weak_alias (__makecontext, makecontext)

@ -1,135 +0,0 @@
2016-03-10 H.J. Lu <hongjiu.lu@intel.com>
[BZ #19762]
* sysdeps/i386/i686/multiarch/bcopy.S (bcopy): Use
HAS_ARCH_FEATURE with Fast_Rep_String.
* sysdeps/i386/i686/multiarch/bzero.S (__bzero): Likewise.
* sysdeps/i386/i686/multiarch/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i686/multiarch/memcpy_chk.S (__memcpy_chk):
Likewise.
* sysdeps/i386/i686/multiarch/memmove_chk.S (__memmove_chk):
Likewise.
* sysdeps/i386/i686/multiarch/mempcpy.S (__mempcpy): Likewise.
* sysdeps/i386/i686/multiarch/mempcpy_chk.S (__mempcpy_chk):
Likewise.
* sysdeps/i386/i686/multiarch/memset.S (memset): Likewise.
* sysdeps/i386/i686/multiarch/memset_chk.S (__memset_chk):
Likewise.
Index: glibc-2.23/sysdeps/i386/i686/multiarch/bcopy.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/bcopy.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/bcopy.S
@@ -36,7 +36,7 @@ ENTRY(bcopy)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__bcopy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__bcopy_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/bzero.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/bzero.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/bzero.S
@@ -31,7 +31,7 @@ ENTRY(__bzero)
HAS_CPU_FEATURE (SSE2)
jz 2f
LOAD_FUNC_GOT_EAX ( __bzero_sse2)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__bzero_sse2_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/memcpy.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/memcpy.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/memcpy.S
@@ -38,7 +38,7 @@ ENTRY(memcpy)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__memcpy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__memcpy_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/memcpy_chk.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/memcpy_chk.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/memcpy_chk.S
@@ -39,7 +39,7 @@ ENTRY(__memcpy_chk)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__memcpy_chk_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/memmove_chk.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/memmove_chk.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/memmove_chk.S
@@ -36,7 +36,7 @@ ENTRY(__memmove_chk)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__memmove_chk_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/mempcpy.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/mempcpy.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/mempcpy.S
@@ -38,7 +38,7 @@ ENTRY(__mempcpy)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__mempcpy_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__mempcpy_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/mempcpy_chk.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/mempcpy_chk.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/mempcpy_chk.S
@@ -39,7 +39,7 @@ ENTRY(__mempcpy_chk)
HAS_CPU_FEATURE (SSSE3)
jz 2f
LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__mempcpy_chk_ssse3_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/memset.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/memset.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/memset.S
@@ -31,7 +31,7 @@ ENTRY(memset)
HAS_CPU_FEATURE (SSE2)
jz 2f
LOAD_FUNC_GOT_EAX (__memset_sse2)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__memset_sse2_rep)
2: ret
Index: glibc-2.23/sysdeps/i386/i686/multiarch/memset_chk.S
===================================================================
--- glibc-2.23.orig/sysdeps/i386/i686/multiarch/memset_chk.S
+++ glibc-2.23/sysdeps/i386/i686/multiarch/memset_chk.S
@@ -31,7 +31,7 @@ ENTRY(__memset_chk)
HAS_CPU_FEATURE (SSE2)
jz 2f
LOAD_FUNC_GOT_EAX (__memset_chk_sse2)
- HAS_CPU_FEATURE (Fast_Rep_String)
+ HAS_ARCH_FEATURE (Fast_Rep_String)
jz 2f
LOAD_FUNC_GOT_EAX (__memset_chk_sse2_rep)
2: ret

@ -1,12 +0,0 @@
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -14,6 +14,7 @@ Security related changes:
The following bugs are resolved with this release:
[19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
+ [19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
[19792] MIPS: backtrace yields infinite backtrace with makecontext

@ -1,31 +0,0 @@
2016-03-11 H.J. Lu <hongjiu.lu@intel.com>
[BZ #19759]
* sysdeps/x86/bits/string.h (_HAVE_STRING_ARCH_mempcpy): New.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -14,6 +14,7 @@ Security related changes:
The following bugs are resolved with this release:
[19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
+ [19759] Don't inline mempcpy for x86
[19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
[19792] MIPS: backtrace yields infinite backtrace with makecontext
Index: glibc-2.23/sysdeps/x86/bits/string.h
===================================================================
--- glibc-2.23.orig/sysdeps/x86/bits/string.h
+++ glibc-2.23/sysdeps/x86/bits/string.h
@@ -23,6 +23,9 @@
/* Use the unaligned string inline ABI. */
#define _STRING_INLINE_unaligned 1
+/* Don't inline mempcpy into memcpy as x86 has an optimized mempcpy. */
+#define _HAVE_STRING_ARCH_mempcpy 1
+
/* Enable inline functions only for i486 or better when compiling for
ia32. */
#if !defined __x86_64__ && (defined __i486__ || defined __pentium__ \

@ -1,31 +0,0 @@
2016-03-11 H.J. Lu <hongjiu.lu@intel.com>
[BZ #19758]
* sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
(EXTRA_LD_ENVVARS): Or bit_Prefer_MAP_32BIT_EXEC.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -14,6 +14,7 @@ Security related changes:
The following bugs are resolved with this release:
[19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
+ [19758] Or bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS
[19759] Don't inline mempcpy for x86
[19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
[19792] MIPS: backtrace yields infinite backtrace with makecontext
Index: glibc-2.23/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
===================================================================
--- glibc-2.23.orig/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
+++ glibc-2.23/sysdeps/unix/sysv/linux/x86_64/64/dl-librecon.h
@@ -33,7 +33,7 @@
case 21: \
if (memcmp (envline, "PREFER_MAP_32BIT_EXEC", 21) == 0) \
GLRO(dl_x86_cpu_features).feature[index_Prefer_MAP_32BIT_EXEC] \
- = bit_Prefer_MAP_32BIT_EXEC; \
+ |= bit_Prefer_MAP_32BIT_EXEC; \
break;
/* Extra unsecure variables. The names are all stuffed in a single

@ -1,19 +0,0 @@
2016-03-15 Andreas Schwab <schwab@suse.de>
[BZ #19257]
* resolv/res_init.c (__res_iclose): Use statp->nscount instead of
statp->_u._ext.nscount as loop count.
Index: glibc-2.23/resolv/res_init.c
===================================================================
--- glibc-2.23.orig/resolv/res_init.c
+++ glibc-2.23/resolv/res_init.c
@@ -594,7 +594,7 @@ __res_iclose(res_state statp, bool free_
statp->_vcsock = -1;
statp->_flags &= ~(RES_F_VC | RES_F_CONN);
}
- for (ns = 0; ns < statp->_u._ext.nscount; ns++)
+ for (ns = 0; ns < statp->nscount; ns++)
if (statp->_u._ext.nsaddrs[ns]) {
if (statp->_u._ext.nssocks[ns] != -1) {
close_not_cancel_no_status(statp->_u._ext.nssocks[ns]);

@ -1,32 +0,0 @@
2016-03-21 Dylan Alex Simon <dylan-sourceware@dylex.net>
[BZ #19822]
* math/Makefile ($(inst_libdir)/libm.so): Write output to $@.tmp and
move it to the final $@ location.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -18,6 +18,7 @@ The following bugs are resolved with thi
[19759] Don't inline mempcpy for x86
[19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
[19792] MIPS: backtrace yields infinite backtrace with makecontext
+ [19822] libm.so install clobbers old version
Version 2.23
Index: glibc-2.23/math/Makefile
===================================================================
--- glibc-2.23.orig/math/Makefile
+++ glibc-2.23/math/Makefile
@@ -100,7 +100,8 @@ $(inst_libdir)/libm.so: $(common-objpfx)
cat $<; \
echo 'GROUP ( $(slibdir)/libm.so$(libm.so-version) ' \
'AS_NEEDED ( $(libdir)/libmvec_nonshared.a $(slibdir)/libmvec.so$(libmvec.so-version) ) )' \
- ) > $@
+ ) > $@.new
+ mv -f $@.new $@
endif
# Rules for the test suite.

@ -1,187 +0,0 @@
2016-03-25 Florian Weimer <fweimer@redhat.com>
[BZ #19791]
* resolv/res_send.c (close_and_return_error): New function.
(send_dg): Initialize *resplen2 after reopen failure. Call
close_and_return_error for error returns. On error paths without
__res_iclose, initialze *resplen2 explicitly. Update comment for
successful return.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -17,6 +17,7 @@ The following bugs are resolved with thi
[19758] Or bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS
[19759] Don't inline mempcpy for x86
[19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
+ [19791] Assertion failure in res_query.c with un-connectable name server addresses
[19792] MIPS: backtrace yields infinite backtrace with makecontext
[19822] libm.so install clobbers old version
Index: glibc-2.23/resolv/res_send.c
===================================================================
--- glibc-2.23.orig/resolv/res_send.c
+++ glibc-2.23/resolv/res_send.c
@@ -649,6 +649,18 @@ get_nsaddr (res_state statp, int n)
return (struct sockaddr *) (void *) &statp->nsaddr_list[n];
}
+/* Close the resolver structure, assign zero to *RESPLEN2 if RESPLEN2
+ is not NULL, and return zero. */
+static int
+__attribute__ ((warn_unused_result))
+close_and_return_error (res_state statp, int *resplen2)
+{
+ __res_iclose(statp, false);
+ if (resplen2 != NULL)
+ *resplen2 = 0;
+ return 0;
+}
+
/* The send_vc function is responsible for sending a DNS query over TCP
to the nameserver numbered NS from the res_state STATP i.e.
EXT(statp).nssocks[ns]. The function supports sending both IPv4 and
@@ -1114,7 +1126,11 @@ send_dg(res_state statp,
retry_reopen:
retval = reopen (statp, terrno, ns);
if (retval <= 0)
- return retval;
+ {
+ if (resplen2 != NULL)
+ *resplen2 = 0;
+ return retval;
+ }
retry:
evNowTime(&now);
evConsTime(&timeout, seconds, 0);
@@ -1127,8 +1143,6 @@ send_dg(res_state statp,
int recvresp2 = buf2 == NULL;
pfd[0].fd = EXT(statp).nssocks[ns];
pfd[0].events = POLLOUT;
- if (resplen2 != NULL)
- *resplen2 = 0;
wait:
if (need_recompute) {
recompute_resend:
@@ -1136,9 +1150,7 @@ send_dg(res_state statp,
if (evCmpTime(finish, now) <= 0) {
poll_err_out:
Perror(statp, stderr, "poll", errno);
- err_out:
- __res_iclose(statp, false);
- return (0);
+ return close_and_return_error (statp, resplen2);
}
evSubTime(&timeout, &finish, &now);
need_recompute = 0;
@@ -1185,7 +1197,9 @@ send_dg(res_state statp,
}
*gotsomewhere = 1;
- return (0);
+ if (resplen2 != NULL)
+ *resplen2 = 0;
+ return 0;
}
if (n < 0) {
if (errno == EINTR)
@@ -1253,7 +1267,7 @@ send_dg(res_state statp,
fail_sendmmsg:
Perror(statp, stderr, "sendmmsg", errno);
- goto err_out;
+ return close_and_return_error (statp, resplen2);
}
}
else
@@ -1271,7 +1285,7 @@ send_dg(res_state statp,
if (errno == EINTR || errno == EAGAIN)
goto recompute_resend;
Perror(statp, stderr, "send", errno);
- goto err_out;
+ return close_and_return_error (statp, resplen2);
}
just_one:
if (nwritten != 0 || buf2 == NULL || single_request)
@@ -1349,7 +1363,7 @@ send_dg(res_state statp,
goto wait;
}
Perror(statp, stderr, "recvfrom", errno);
- goto err_out;
+ return close_and_return_error (statp, resplen2);
}
*gotsomewhere = 1;
if (__glibc_unlikely (*thisresplenp < HFIXEDSZ)) {
@@ -1360,7 +1374,7 @@ send_dg(res_state statp,
(stdout, ";; undersized: %d\n",
*thisresplenp));
*terrno = EMSGSIZE;
- goto err_out;
+ return close_and_return_error (statp, resplen2);
}
if ((recvresp1 || hp->id != anhp->id)
&& (recvresp2 || hp2->id != anhp->id)) {
@@ -1409,7 +1423,7 @@ send_dg(res_state statp,
? *thisanssizp : *thisresplenp);
/* record the error */
statp->_flags |= RES_F_EDNS0ERR;
- goto err_out;
+ return close_and_return_error (statp, resplen2);
}
#endif
if (!(statp->options & RES_INSECURE2)
@@ -1461,10 +1475,10 @@ send_dg(res_state statp,
goto wait;
}
- __res_iclose(statp, false);
/* don't retry if called from dig */
if (!statp->pfcode)
- return (0);
+ return close_and_return_error (statp, resplen2);
+ __res_iclose(statp, false);
}
if (anhp->rcode == NOERROR && anhp->ancount == 0
&& anhp->aa == 0 && anhp->ra == 0 && anhp->arcount == 0) {
@@ -1486,6 +1500,8 @@ send_dg(res_state statp,
__res_iclose(statp, false);
// XXX if we have received one reply we could
// XXX use it and not repeat it over TCP...
+ if (resplen2 != NULL)
+ *resplen2 = 0;
return (1);
}
/* Mark which reply we received. */
@@ -1501,21 +1517,22 @@ send_dg(res_state statp,
__res_iclose (statp, false);
retval = reopen (statp, terrno, ns);
if (retval <= 0)
- return retval;
+ {
+ if (resplen2 != NULL)
+ *resplen2 = 0;
+ return retval;
+ }
pfd[0].fd = EXT(statp).nssocks[ns];
}
}
goto wait;
}
- /*
- * All is well, or the error is fatal. Signal that the
- * next nameserver ought not be tried.
- */
+ /* All is well. We have received both responses (if
+ two responses were requested). */
return (resplen);
- } else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
- /* Something went wrong. We can stop trying. */
- goto err_out;
- }
+ } else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL))
+ /* Something went wrong. We can stop trying. */
+ return close_and_return_error (statp, resplen2);
else {
/* poll should not have returned > 0 in this case. */
abort ();

@ -1,857 +0,0 @@
2016-04-01 Stefan Liebler <stli@linux.vnet.ibm.com>
* sysdeps/s390/s390-32/dl-trampoline.S: Include dl-trampoline.h twice
to create a non-vector/vector version for _dl_runtime_resolve and
_dl_runtime_profile. Move implementation to ...
* sysdeps/s390/s390-32/dl-trampoline.h: ... here.
(_dl_runtime_resolve) Save and restore fpr/vrs.
(_dl_runtime_profile) Save and restore vrs and fix some issues
if _dl_call_pltexit is called.
* sysdeps/s390/s390-32/dl-machine.h (elf_machine_runtime_setup):
Choose the correct resolver function if running on a machine with vx.
* sysdeps/s390/s390-64/dl-trampoline.S: Include dl-trampoline.h twice
to create a non-vector/vector version for _dl_runtime_resolve and
_dl_runtime_profile. Move implementation to ...
* sysdeps/s390/s390-64/dl-trampoline.h: ... here.
(_dl_runtime_resolve) Save and restore fpr/vrs.
(_dl_runtime_profile) Save and restore vrs and fix some issues
* sysdeps/s390/s390-64/dl-machine.h: (elf_machine_runtime_setup):
Choose the correct resolver function if running on a machine with vx.
Index: glibc-2.23/sysdeps/s390/s390-32/dl-machine.h
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-32/dl-machine.h
+++ glibc-2.23/sysdeps/s390/s390-32/dl-machine.h
@@ -89,6 +89,11 @@ elf_machine_runtime_setup (struct link_m
{
extern void _dl_runtime_resolve (Elf32_Word);
extern void _dl_runtime_profile (Elf32_Word);
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ extern void _dl_runtime_resolve_vx (Elf32_Word);
+ extern void _dl_runtime_profile_vx (Elf32_Word);
+#endif
+
if (l->l_info[DT_JMPREL] && lazy)
{
@@ -116,7 +121,14 @@ elf_machine_runtime_setup (struct link_m
end in this function. */
if (__glibc_unlikely (profile))
{
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+ got[2] = (Elf32_Addr) &_dl_runtime_profile_vx;
+ else
+ got[2] = (Elf32_Addr) &_dl_runtime_profile;
+#else
got[2] = (Elf32_Addr) &_dl_runtime_profile;
+#endif
if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l))
@@ -125,9 +137,18 @@ elf_machine_runtime_setup (struct link_m
GL(dl_profile_map) = l;
}
else
- /* This function will get called to fix up the GOT entry indicated by
- the offset on the stack, and then jump to the resolved address. */
- got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+ {
+ /* This function will get called to fix up the GOT entry indicated by
+ the offset on the stack, and then jump to the resolved address. */
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve_vx;
+ else
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+#else
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+#endif
+ }
}
return lazy;
Index: glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.S
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-32/dl-trampoline.S
+++ glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.S
@@ -16,130 +16,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-/* This code is used in dl-runtime.c to call the `fixup' function
- and then redirect to the address it returns. */
-
-/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
- * with the following linkage:
- * r2 - r6 : parameter registers
- * f0, f2 : floating point parameter registers
- * 24(r15), 28(r15) : PLT arguments PLT1, PLT2
- * 96(r15) : additional stack parameters
- * The normal clobber rules for function calls apply:
- * r0 - r5 : call clobbered
- * r6 - r13 : call saved
- * r14 : return address (call clobbered)
- * r15 : stack pointer (call saved)
- * f4, f6 : call saved
- * f0 - f3, f5, f7 - f15 : call clobbered
- */
-
#include <sysdep.h>
.text
- .globl _dl_runtime_resolve
- .type _dl_runtime_resolve, @function
- cfi_startproc
- .align 16
-_dl_runtime_resolve:
- stm %r2,%r5,32(%r15) # save registers
- st %r14,8(%r15)
- cfi_offset (r14, -88)
- lr %r0,%r15 # create stack frame
- ahi %r15,-96
- cfi_adjust_cfa_offset (96)
- st 0,0(%r15)
- lm %r2,%r3,120(%r15) # load args saved by PLT
- basr %r1,0
-0: l %r14,1f-0b(%r1)
- bas %r14,0(%r14,%r1) # call resolver
- lr %r1,%r2 # function addr returned in r2
- ahi %r15,96 # remove stack frame
- cfi_adjust_cfa_offset (-96)
- l %r14,8(15) # restore registers
- lm %r2,%r5,32(%r15)
- br %r1
-1: .long _dl_fixup - 0b
- cfi_endproc
- .size _dl_runtime_resolve, .-_dl_runtime_resolve
-
-
-#ifndef PROF
- .globl _dl_runtime_profile
- .type _dl_runtime_profile, @function
- cfi_startproc
- .align 16
-_dl_runtime_profile:
- stm %r2,%r6,32(%r15) # save registers
- std %f0,56(%r15)
- std %f2,64(%r15)
- st %r6,8(%r15)
- st %r12,12(%r15)
- st %r14,16(%r15)
- cfi_offset (r6, -64)
- cfi_offset (f0, -40)
- cfi_offset (f2, -32)
- cfi_offset (r12, -84)
- cfi_offset (r14, -80)
- lr %r12,%r15 # create stack frame
- cfi_def_cfa_register (12)
- ahi %r15,-96
- st %r12,0(%r15)
- lm %r2,%r3,24(%r12) # load arguments saved by PLT
- lr %r4,%r14 # return address as third parameter
- basr %r1,0
-0: l %r14,6f-0b(%r1)
- la %r5,32(%r12) # pointer to struct La_s390_32_regs
- la %r6,20(%r12) # long int * framesize
- bas %r14,0(%r14,%r1) # call resolver
- lr %r1,%r2 # function addr returned in r2
- icm %r0,15,20(%r12) # load & test framesize
- jnm 2f
-
- lm %r2,%r6,32(%r12)
- ld %f0,56(%r12)
- ld %f2,64(%r12)
- lr %r15,%r12 # remove stack frame
- cfi_def_cfa_register (15)
- l %r14,16(%r15) # restore registers
- l %r12,12(%r15)
- br %r1 # tail-call to the resolved function
-
- cfi_def_cfa_register (12)
-2: jz 4f # framesize == 0 ?
- ahi %r0,7 # align framesize to 8
- lhi %r2,-8
- nr %r0,%r2
- slr %r15,%r0 # make room for framesize bytes
- st %r12,0(%r15)
- la %r2,96(%r15)
- la %r3,96(%r12)
- srl %r0,3
-3: mvc 0(8,%r2),0(%r3) # copy additional parameters
- la %r2,8(%r2)
- la %r3,8(%r3)
- brct %r0,3b
-4: lm %r2,%r6,32(%r12) # load register parameters
- ld %f0,56(%r12)
- ld %f2,64(%r12)
- basr %r14,%r1 # call resolved function
- stm %r2,%r3,72(%r12)
- std %f0,80(%r12)
- lm %r2,%r3,24(%r12) # load arguments saved by PLT
- basr %r1,0
-5: l %r14,7f-5b(%r1)
- la %r4,32(%r12) # pointer to struct La_s390_32_regs
- la %r5,72(%r12) # pointer to struct La_s390_32_retval
- basr %r14,%r1 # call _dl_call_pltexit
-
- lr %r15,%r12 # remove stack frame
- cfi_def_cfa_register (15)
- l %r14,16(%r15) # restore registers
- l %r12,12(%r15)
- br %r14
-
-6: .long _dl_profile_fixup - 0b
-7: .long _dl_call_pltexit - 5b
- cfi_endproc
- .size _dl_runtime_profile, .-_dl_runtime_profile
+/* Create variant of _dl_runtime_resolve/profile for machines before z13.
+ No vector registers are saved/restored. */
+#include <dl-trampoline.h>
+
+#if defined HAVE_S390_VX_ASM_SUPPORT
+/* Create variant of _dl_runtime_resolve/profile for z13 and newer.
+ The vector registers are saved/restored, too.*/
+# define _dl_runtime_resolve _dl_runtime_resolve_vx
+# define _dl_runtime_profile _dl_runtime_profile_vx
+# define RESTORE_VRS
+# include <dl-trampoline.h>
#endif
Index: glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.h
===================================================================
--- /dev/null
+++ glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.h
@@ -0,0 +1,215 @@
+/* PLT trampolines. s390 version.
+ Copyright (C) 2016 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/>. */
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+ and then redirect to the address it returns. */
+
+/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
+ * with the following linkage:
+ * r2 - r6 : parameter registers
+ * f0, f2 : floating point parameter registers
+ * v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers
+ * 24(r15), 28(r15) : PLT arguments PLT1, PLT2
+ * 96(r15) : additional stack parameters
+ * The normal clobber rules for function calls apply:
+ * r0 - r5 : call clobbered
+ * r6 - r13 : call saved
+ * r14 : return address (call clobbered)
+ * r15 : stack pointer (call saved)
+ * f4, f6 : call saved
+ * f0 - f3, f5, f7 - f15 : call clobbered
+ * v0 - v3, v5, v7 - v15 : bytes 0-7 overlap with fprs: call clobbered
+ bytes 8-15: call clobbered
+ * v4, v6 : bytes 0-7 overlap with f4, f6: call saved
+ bytes 8-15: call clobbered
+ * v16 - v31 : call clobbered
+ */
+
+
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve, @function
+ cfi_startproc
+ .align 16
+_dl_runtime_resolve:
+ stm %r2,%r5,32(%r15) # save registers
+ cfi_offset (r2, -64)
+ cfi_offset (r3, -60)
+ cfi_offset (r4, -56)
+ cfi_offset (r5, -52)
+ std %f0,56(%r15)
+ cfi_offset (f0, -40)
+ std %f2,64(%r15)
+ cfi_offset (f2, -32)
+ st %r14,8(%r15)
+ cfi_offset (r14, -88)
+ lr %r0,%r15
+ lm %r2,%r3,24(%r15) # load args saved by PLT
+#ifdef RESTORE_VRS
+ ahi %r15,-224 # create stack frame
+ cfi_adjust_cfa_offset (224)
+ .machine push
+ .machine "z13"
+ .machinemode "zarch_nohighgprs"
+ vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments
+ cfi_offset (v24, -224)
+ cfi_offset (v25, -208)
+ cfi_offset (v26, -192)
+ cfi_offset (v27, -176)
+ cfi_offset (v28, -160)
+ cfi_offset (v29, -144)
+ cfi_offset (v30, -128)
+ cfi_offset (v31, -112)
+ .machine pop
+#else
+ ahi %r15,-96 # create stack frame
+ cfi_adjust_cfa_offset (96)
+#endif
+ st %r0,0(%r15) # write backchain
+ basr %r1,0
+0: l %r14,1f-0b(%r1)
+ bas %r14,0(%r14,%r1) # call _dl_fixup
+ lr %r1,%r2 # function addr returned in r2
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ .machinemode "zarch_nohighgprs"
+ vlm %v24,%v31,96(%r15) # restore vector registers
+ .machine pop
+ ahi %r15,224 # remove stack frame
+ cfi_adjust_cfa_offset (-224)
+#else
+ ahi %r15,96 # remove stack frame
+ cfi_adjust_cfa_offset (-96)
+#endif
+ l %r14,8(15) # restore registers
+ ld %f0,56(%r15)
+ ld %f2,64(%r15)
+ lm %r2,%r5,32(%r15)
+ br %r1
+1: .long _dl_fixup - 0b
+ cfi_endproc
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+
+#ifndef PROF
+ .globl _dl_runtime_profile
+ .type _dl_runtime_profile, @function
+ cfi_startproc
+ .align 16
+_dl_runtime_profile:
+ stm %r2,%r6,32(%r15) # save registers
+ cfi_offset (r2, -64) # + r6 needed as arg for
+ cfi_offset (r3, -60) # _dl_profile_fixup
+ cfi_offset (r4, -56)
+ cfi_offset (r5, -52)
+ cfi_offset (r6, -48)
+ std %f0,56(%r15)
+ cfi_offset (f0, -40)
+ std %f2,64(%r15)
+ cfi_offset (f2, -32)
+ st %r12,12(%r15) # r12 is used as backup of r15
+ cfi_offset (r12, -84)
+ st %r14,16(%r15)
+ cfi_offset (r14, -80)
+ lr %r12,%r15 # backup stack pointer
+ cfi_def_cfa_register (12)
+#ifdef RESTORE_VRS
+ ahi %r15,-224 # create stack frame
+ .machine push
+ .machine "z13"
+ .machinemode "zarch_nohighgprs"
+ vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments
+ cfi_offset (v24, -224)
+ cfi_offset (v25, -208)
+ cfi_offset (v26, -192)
+ cfi_offset (v27, -176)
+ cfi_offset (v28, -160)
+ cfi_offset (v29, -144)
+ cfi_offset (v30, -128)
+ cfi_offset (v31, -112)
+ .machine pop
+#else
+ ahi %r15,-96 # create stack frame
+#endif
+ st %r12,0(%r15) # save backchain
+ lm %r2,%r3,24(%r12) # load arguments saved by PLT
+ lr %r4,%r14 # return address as third parameter
+ basr %r1,0
+0: l %r14,6f-0b(%r1)
+ la %r5,32(%r12) # pointer to struct La_s390_32_regs
+ la %r6,20(%r12) # long int * framesize
+ bas %r14,0(%r14,%r1) # call resolver
+ lr %r1,%r2 # function addr returned in r2
+ ld %f0,56(%r12) # restore call-clobbered arg fprs
+ ld %f2,64(%r12)
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ .machinemode "zarch_nohighgprs"
+ vlm %v24,%v31,96(%r15) # restore call-clobbered arg vrs
+ .machine pop
+#endif
+ icm %r0,15,20(%r12) # load & test framesize
+ jnm 2f
+
+ lm %r2,%r6,32(%r12)
+ lr %r15,%r12 # remove stack frame
+ cfi_def_cfa_register (15)
+ l %r14,16(%r15) # restore registers
+ l %r12,12(%r15)
+ br %r1 # tail-call to the resolved function
+
+ cfi_def_cfa_register (12)
+2: jz 4f # framesize == 0 ?
+ ahi %r0,7 # align framesize to 8
+ lhi %r2,-8
+ nr %r0,%r2
+ slr %r15,%r0 # make room for framesize bytes
+ st %r12,0(%r15) # save backchain
+ la %r2,96(%r15)
+ la %r3,96(%r12)
+ srl %r0,3
+3: mvc 0(8,%r2),0(%r3) # copy additional parameters
+ la %r2,8(%r2)
+ la %r3,8(%r3)
+ brct %r0,3b
+4: lm %r2,%r6,32(%r12) # load register parameters
+ basr %r14,%r1 # call resolved function
+ stm %r2,%r3,72(%r12) # store return values r2, r3, f0
+ std %f0,80(%r12) # to struct La_s390_32_retval
+ lm %r2,%r3,24(%r12) # load arguments saved by PLT
+ basr %r1,0
+5: l %r14,7f-5b(%r1)
+ la %r4,32(%r12) # pointer to struct La_s390_32_regs
+ la %r5,72(%r12) # pointer to struct La_s390_32_retval
+ bas %r14,0(%r14,%r1) # call _dl_call_pltexit
+
+ lr %r15,%r12 # remove stack frame
+ cfi_def_cfa_register (15)
+ l %r14,16(%r15) # restore registers
+ l %r12,12(%r15)
+ l %r2,72(%r15) # restore return values
+ l %r3,76(%r15)
+ ld %f0,80(%r15)
+ br %r14
+
+6: .long _dl_profile_fixup - 0b
+7: .long _dl_call_pltexit - 5b
+ cfi_endproc
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+#endif
Index: glibc-2.23/sysdeps/s390/s390-64/dl-machine.h
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-64/dl-machine.h
+++ glibc-2.23/sysdeps/s390/s390-64/dl-machine.h
@@ -26,6 +26,7 @@
#include <sys/param.h>
#include <string.h>
#include <link.h>
+#include <sysdeps/s390/dl-procinfo.h>
#include <dl-irel.h>
#define ELF_MACHINE_IRELATIVE R_390_IRELATIVE
@@ -78,6 +79,10 @@ elf_machine_runtime_setup (struct link_m
{
extern void _dl_runtime_resolve (Elf64_Word);
extern void _dl_runtime_profile (Elf64_Word);
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ extern void _dl_runtime_resolve_vx (Elf64_Word);
+ extern void _dl_runtime_profile_vx (Elf64_Word);
+#endif
if (l->l_info[DT_JMPREL] && lazy)
{
@@ -105,7 +110,14 @@ elf_machine_runtime_setup (struct link_m
end in this function. */
if (__glibc_unlikely (profile))
{
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+ got[2] = (Elf64_Addr) &_dl_runtime_profile_vx;
+ else
+ got[2] = (Elf64_Addr) &_dl_runtime_profile;
+#else
got[2] = (Elf64_Addr) &_dl_runtime_profile;
+#endif
if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l))
@@ -114,9 +126,18 @@ elf_machine_runtime_setup (struct link_m
GL(dl_profile_map) = l;
}
else
- /* This function will get called to fix up the GOT entry indicated by
- the offset on the stack, and then jump to the resolved address. */
- got[2] = (Elf64_Addr) &_dl_runtime_resolve;
+ {
+ /* This function will get called to fix up the GOT entry indicated by
+ the offset on the stack, and then jump to the resolved address. */
+#if defined HAVE_S390_VX_ASM_SUPPORT
+ if (GLRO(dl_hwcap) & HWCAP_S390_VX)
+ got[2] = (Elf64_Addr) &_dl_runtime_resolve_vx;
+ else
+ got[2] = (Elf64_Addr) &_dl_runtime_resolve;
+#else
+ got[2] = (Elf64_Addr) &_dl_runtime_resolve;
+#endif
+ }
}
return lazy;
Index: glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.S
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-64/dl-trampoline.S
+++ glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.S
@@ -16,126 +16,18 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
- * with the following linkage:
- * r2 - r6 : parameter registers
- * f0, f2, f4, f6 : floating point parameter registers
- * 48(r15), 56(r15) : PLT arguments PLT1, PLT2
- * 160(r15) : additional stack parameters
- * The normal clobber rules for function calls apply:
- * r0 - r5 : call clobbered
- * r6 - r13 : call saved
- * r14 : return address (call clobbered)
- * r15 : stack pointer (call saved)
- * f1, f3, f5, f7 : call saved
- * f0 - f3, f5, f7 - f15 : call clobbered
- */
-
#include <sysdep.h>
.text
- .globl _dl_runtime_resolve
- .type _dl_runtime_resolve, @function
- cfi_startproc
- .align 16
-_dl_runtime_resolve:
- stmg %r2,%r5,64(15) # save call-clobbered argument registers
- stg %r14,96(15)
- cfi_offset (r14, -64)
- lgr %r0,%r15
- aghi %r15,-160 # create stack frame
- cfi_adjust_cfa_offset (160)
- stg %r0,0(%r15) # write backchain
- lmg %r2,%r3,208(%r15)# load args saved by PLT
- brasl %r14,_dl_fixup # call fixup
- lgr %r1,%r2 # function addr returned in r2
- aghi %r15,160 # remove stack frame
- cfi_adjust_cfa_offset (-160)
- lg %r14,96(15) # restore registers
- lmg %r2,%r5,64(15)
- br %r1
- cfi_endproc
- .size _dl_runtime_resolve, .-_dl_runtime_resolve
-
-
-#ifndef PROF
- .globl _dl_runtime_profile
- .type _dl_runtime_profile, @function
- cfi_startproc
- .align 16
-_dl_runtime_profile:
- stmg %r2,%r6,64(%r15) # save call-clobbered arg regs
- std %f0,104(%r15) # + r6 needed as arg for
- std %f2,112(%r15) # _dl_profile_fixup
- std %f4,120(%r15)
- std %f6,128(%r15)
- stg %r12,24(%r15) # r12 is used as backup of r15
- stg %r14,32(%r15)
- cfi_offset (r6, -96)
- cfi_offset (f0, -56)
- cfi_offset (f2, -48)
- cfi_offset (f4, -40)
- cfi_offset (f6, -32)
- cfi_offset (r12, -136)
- cfi_offset (r14, -128)
- lgr %r12,%r15 # backup stack pointer
- cfi_def_cfa_register (12)
- aghi %r15,-160 # create stack frame
- stg %r12,0(%r15) # save backchain
- lmg %r2,%r3,48(%r12) # load arguments saved by PLT
- lgr %r4,%r14 # return address as third parameter
- la %r5,64(%r12) # pointer to struct La_s390_32_regs
- la %r6,40(%r12) # long int * framesize
- brasl %r14,_dl_profile_fixup # call resolver
- lgr %r1,%r2 # function addr returned in r2
- lg %r0,40(%r12) # load framesize
- ltgr %r0,%r0
- jnm 1f
-
- lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call
- ld %f0,104(%r12) # so we can do a tail call without
- ld %f2,112(%r12) # copying the arg overflow area
- ld %f4,120(%r12)
- ld %f6,128(%r12)
-
- lgr %r15,%r12 # remove stack frame
- cfi_def_cfa_register (15)
- lg %r14,32(%r15) # restore registers
- lg %r12,24(%r15)
- br %r1 # tail-call to resolved function
-
- cfi_def_cfa_register (12)
-1: jz 4f # framesize == 0 ?
- aghi %r0,7 # align framesize to 8
- nill %r0,0xfff8
- slgr %r15,%r0 # make room for framesize bytes
- stg %r12,0(%r15)
- la %r2,160(%r15)
- la %r3,160(%r12)
- srlg %r0,%r0,3
-3: mvc 0(8,%r2),0(%r3) # copy additional parameters
- la %r2,8(%r2)
- la %r3,8(%r3)
- brctg %r0,3b
-4: lmg %r2,%r6,64(%r12) # load register parameters
- ld %f0,104(%r12) # restore call-clobbered arg regs
- ld %f2,112(%r12)
- ld %f4,120(%r12)
- ld %f6,128(%r12)
- basr %r14,%r1 # call resolved function
- stg %r2,136(%r12)
- std %f0,144(%r12)
- lmg %r2,%r3,48(%r12) # load arguments saved by PLT
- la %r4,32(%r12) # pointer to struct La_s390_32_regs
- la %r5,72(%r12) # pointer to struct La_s390_32_retval
- brasl %r14,_dl_call_pltexit
-
- lgr %r15,%r12 # remove stack frame
- cfi_def_cfa_register (15)
- lg %r14,32(%r15) # restore registers
- lg %r12,24(%r15)
- br %r14
-
- cfi_endproc
- .size _dl_runtime_profile, .-_dl_runtime_profile
+/* Create variant of _dl_runtime_resolve/profile for machines before z13.
+ No vector registers are saved/restored. */
+#include <dl-trampoline.h>
+
+#if defined HAVE_S390_VX_ASM_SUPPORT
+/* Create variant of _dl_runtime_resolve/profile for z13 and newer.
+ The vector registers are saved/restored, too.*/
+# define _dl_runtime_resolve _dl_runtime_resolve_vx
+# define _dl_runtime_profile _dl_runtime_profile_vx
+# define RESTORE_VRS
+# include <dl-trampoline.h>
#endif
Index: glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.h
===================================================================
--- /dev/null
+++ glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.h
@@ -0,0 +1,211 @@
+/* PLT trampolines. s390x version.
+ Copyright (C) 2016 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 PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
+ * with the following linkage:
+ * r2 - r6 : parameter registers
+ * f0, f2, f4, f6 : floating point parameter registers
+ * v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers
+ * 48(r15), 56(r15) : PLT arguments PLT1, PLT2
+ * 160(r15) : additional stack parameters
+ * The normal clobber rules for function calls apply:
+ * r0 - r5 : call clobbered
+ * r6 - r13 : call saved
+ * r14 : return address (call clobbered)
+ * r15 : stack pointer (call saved)
+ * f0 - f7 : call clobbered
+ * f8 - f15 : call saved
+ * v0 - v7 : bytes 0-7 overlap with f0-f7: call clobbered
+ bytes 8-15: call clobbered
+ * v8 - v15 : bytes 0-7 overlap with f8-f15: call saved
+ bytes 8-15: call clobbered
+ * v16 - v31 : call clobbered
+ */
+
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve, @function
+ cfi_startproc
+ .align 16
+_dl_runtime_resolve:
+ stmg %r2,%r5,64(%r15) # save call-clobbered argument registers
+ cfi_offset (r2, -96)
+ cfi_offset (r3, -88)
+ cfi_offset (r4, -80)
+ cfi_offset (r5, -72)
+ std %f0,104(%r15)
+ cfi_offset (f0, -56)
+ std %f2,112(%r15)
+ cfi_offset (f2, -48)
+ std %f4,120(%r15)
+ cfi_offset (f4, -40)
+ std %f6,128(%r15)
+ cfi_offset (f6, -32)
+ stg %r14,96(15)
+ cfi_offset (r14, -64)
+ lmg %r2,%r3,48(%r15) # load args for fixup saved by PLT
+ lgr %r0,%r15
+#ifdef RESTORE_VRS
+ aghi %r15,-288 # create stack frame
+ cfi_adjust_cfa_offset (288)
+ .machine push
+ .machine "z13"
+ vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers
+ cfi_offset (v24, -288)
+ cfi_offset (v25, -272)
+ cfi_offset (v26, -256)
+ cfi_offset (v27, -240)
+ cfi_offset (v28, -224)
+ cfi_offset (v29, -208)
+ cfi_offset (v30, -192)
+ cfi_offset (v31, -176)
+ .machine pop
+#else
+ aghi %r15,-160 # create stack frame
+ cfi_adjust_cfa_offset (160)
+#endif
+ stg %r0,0(%r15) # write backchain
+ brasl %r14,_dl_fixup # call _dl_fixup
+ lgr %r1,%r2 # function addr returned in r2
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vlm %v24,%v31,160(%r15)# restore vector registers
+ .machine pop
+ aghi %r15,288 # remove stack frame
+ cfi_adjust_cfa_offset (-288)
+#else
+ aghi %r15,160 # remove stack frame
+ cfi_adjust_cfa_offset (-160)
+#endif
+ lg %r14,96(%r15) # restore registers
+ ld %f0,104(%r15)
+ ld %f2,112(%r15)
+ ld %f4,120(%r15)
+ ld %f6,128(%r15)
+ lmg %r2,%r5,64(%r15)
+ br %r1
+ cfi_endproc
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+
+#ifndef PROF
+ .globl _dl_runtime_profile
+ .type _dl_runtime_profile, @function
+ cfi_startproc
+ .align 16
+_dl_runtime_profile:
+ stmg %r2,%r6,64(%r15) # save call-clobbered arg regs
+ cfi_offset (r2, -96) # + r6 needed as arg for
+ cfi_offset (r3, -88) # _dl_profile_fixup
+ cfi_offset (r4, -80)
+ cfi_offset (r5, -72)
+ cfi_offset (r6, -64)
+ std %f0,104(%r15)
+ cfi_offset (f0, -56)
+ std %f2,112(%r15)
+ cfi_offset (f2, -48)
+ std %f4,120(%r15)
+ cfi_offset (f4, -40)
+ std %f6,128(%r15)
+ cfi_offset (f6, -32)
+ stg %r12,24(%r15) # r12 is used as backup of r15
+ cfi_offset (r12, -136)
+ stg %r14,32(%r15)
+ cfi_offset (r14, -128)
+ lgr %r12,%r15 # backup stack pointer
+ cfi_def_cfa_register (12)
+#ifdef RESTORE_VRS
+ aghi %r15,-288 # create stack frame
+ .machine push
+ .machine "z13"
+ vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers
+ cfi_offset (v24, -288)
+ cfi_offset (v25, -272)
+ cfi_offset (v26, -256)
+ cfi_offset (v27, -240)
+ cfi_offset (v28, -224)
+ cfi_offset (v29, -208)
+ cfi_offset (v30, -192)
+ cfi_offset (v31, -176)
+ .machine pop
+#else
+ aghi %r15,-160 # create stack frame
+#endif
+ stg %r12,0(%r15) # save backchain
+ lmg %r2,%r3,48(%r12) # load arguments saved by PLT
+ lgr %r4,%r14 # return address as third parameter
+ la %r5,64(%r12) # pointer to struct La_s390_64_regs
+ la %r6,40(%r12) # long int * framesize
+ brasl %r14,_dl_profile_fixup # call resolver
+ lgr %r1,%r2 # function addr returned in r2
+ ld %f0,104(%r12) # restore call-clobbered arg fprs
+ ld %f2,112(%r12)
+ ld %f4,120(%r12)
+ ld %f6,128(%r12)
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vlm %v24,%v31,160(%r15) # restore call-clobbered arg vrs
+ .machine pop
+#endif
+ lg %r0,40(%r12) # load framesize
+ ltgr %r0,%r0
+ jnm 1f
+
+ lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call
+ # so we can do a tail call without
+ # copying the arg overflow area
+ lgr %r15,%r12 # remove stack frame
+ cfi_def_cfa_register (15)
+ lg %r14,32(%r15) # restore registers
+ lg %r12,24(%r15)
+ br %r1 # tail-call to resolved function
+
+ cfi_def_cfa_register (12)
+1: jz 4f # framesize == 0 ?
+ aghi %r0,7 # align framesize to 8
+ nill %r0,0xfff8
+ slgr %r15,%r0 # make room for framesize bytes
+ stg %r12,0(%r15) # save backchain
+ la %r2,160(%r15)
+ la %r3,160(%r12)
+ srlg %r0,%r0,3
+3: mvc 0(8,%r2),0(%r3) # copy additional parameters
+ la %r2,8(%r2) # depending on framesize
+ la %r3,8(%r3)
+ brctg %r0,3b
+4: lmg %r2,%r6,64(%r12) # restore call-clobbered arg gprs
+ basr %r14,%r1 # call resolved function
+ stg %r2,136(%r12) # store return values r2, f0
+ std %f0,144(%r12) # to struct La_s390_64_retval
+ lmg %r2,%r3,48(%r12) # load arguments saved by PLT
+ la %r4,64(%r12) # pointer to struct La_s390_64_regs
+ la %r5,136(%r12) # pointer to struct La_s390_64_retval
+ brasl %r14,_dl_call_pltexit
+
+ lgr %r15,%r12 # remove stack frame
+ cfi_def_cfa_register (15)
+ lg %r14,32(%r15) # restore registers
+ lg %r12,24(%r15)
+ lg %r2,136(%r15) # restore return values
+ ld %f0,144(%r15)
+ br %r14 # Jump back to caller
+
+ cfi_endproc
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+#endif

@ -1,371 +0,0 @@
2016-04-01 Stefan Liebler <stli@linux.vnet.ibm.com>
* sysdeps/s390/bits/link.h: (La_s390_vr) New typedef.
(La_s390_32_regs): Append vector register lr_v24-lr_v31.
(La_s390_64_regs): Likewise.
(La_s390_32_retval): Append vector register lrv_v24.
(La_s390_64_retval): Likeweise.
* sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_profile):
Handle extended structs La_s390_32_regs and La_s390_32_retval.
* sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile):
Handle extended structs La_s390_64_regs and La_s390_64_retval.
Index: glibc-2.23/sysdeps/s390/bits/link.h
===================================================================
--- glibc-2.23.orig/sysdeps/s390/bits/link.h
+++ glibc-2.23/sysdeps/s390/bits/link.h
@@ -19,6 +19,9 @@
# error "Never include <bits/link.h> directly; use <link.h> instead."
#endif
+#if defined HAVE_S390_VX_ASM_SUPPORT
+typedef char La_s390_vr[16];
+#endif
#if __ELF_NATIVE_CLASS == 32
@@ -32,6 +35,16 @@ typedef struct La_s390_32_regs
uint32_t lr_r6;
double lr_fp0;
double lr_fp2;
+# if defined HAVE_S390_VX_ASM_SUPPORT
+ La_s390_vr lr_v24;
+ La_s390_vr lr_v25;
+ La_s390_vr lr_v26;
+ La_s390_vr lr_v27;
+ La_s390_vr lr_v28;
+ La_s390_vr lr_v29;
+ La_s390_vr lr_v30;
+ La_s390_vr lr_v31;
+# endif
} La_s390_32_regs;
/* Return values for calls from PLT on s390-32. */
@@ -40,6 +53,9 @@ typedef struct La_s390_32_retval
uint32_t lrv_r2;
uint32_t lrv_r3;
double lrv_fp0;
+# if defined HAVE_S390_VX_ASM_SUPPORT
+ La_s390_vr lrv_v24;
+# endif
} La_s390_32_retval;
@@ -77,6 +93,16 @@ typedef struct La_s390_64_regs
double lr_fp2;
double lr_fp4;
double lr_fp6;
+# if defined HAVE_S390_VX_ASM_SUPPORT
+ La_s390_vr lr_v24;
+ La_s390_vr lr_v25;
+ La_s390_vr lr_v26;
+ La_s390_vr lr_v27;
+ La_s390_vr lr_v28;
+ La_s390_vr lr_v29;
+ La_s390_vr lr_v30;
+ La_s390_vr lr_v31;
+# endif
} La_s390_64_regs;
/* Return values for calls from PLT on s390-64. */
@@ -84,6 +110,9 @@ typedef struct La_s390_64_retval
{
uint64_t lrv_r2;
double lrv_fp0;
+# if defined HAVE_S390_VX_ASM_SUPPORT
+ La_s390_vr lrv_v24;
+# endif
} La_s390_64_retval;
Index: glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.h
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-32/dl-trampoline.h
+++ glibc-2.23/sysdeps/s390/s390-32/dl-trampoline.h
@@ -112,28 +112,31 @@ _dl_runtime_resolve:
cfi_startproc
.align 16
_dl_runtime_profile:
- stm %r2,%r6,32(%r15) # save registers
- cfi_offset (r2, -64) # + r6 needed as arg for
- cfi_offset (r3, -60) # _dl_profile_fixup
- cfi_offset (r4, -56)
- cfi_offset (r5, -52)
- cfi_offset (r6, -48)
- std %f0,56(%r15)
- cfi_offset (f0, -40)
- std %f2,64(%r15)
- cfi_offset (f2, -32)
st %r12,12(%r15) # r12 is used as backup of r15
cfi_offset (r12, -84)
st %r14,16(%r15)
cfi_offset (r14, -80)
lr %r12,%r15 # backup stack pointer
cfi_def_cfa_register (12)
+ ahi %r15,-264 # create stack frame:
+ # 96 + sizeof(La_s390_32_regs)
+ st %r12,0(%r15) # save backchain
+
+ stm %r2,%r6,96(%r15) # save registers
+ cfi_offset (r2, -264) # + r6 needed as arg for
+ cfi_offset (r3, -260) # _dl_profile_fixup
+ cfi_offset (r4, -256)
+ cfi_offset (r5, -252)
+ cfi_offset (r6, -248)
+ std %f0,120(%r15)
+ cfi_offset (f0, -240)
+ std %f2,128(%r15)
+ cfi_offset (f2, -232)
#ifdef RESTORE_VRS
- ahi %r15,-224 # create stack frame
.machine push
.machine "z13"
.machinemode "zarch_nohighgprs"
- vstm %v24,%v31,96(%r15) # store call-clobbered vr arguments
+ vstm %v24,%v31,136(%r15) # store call-clobbered vr arguments
cfi_offset (v24, -224)
cfi_offset (v25, -208)
cfi_offset (v26, -192)
@@ -143,31 +146,31 @@ _dl_runtime_profile:
cfi_offset (v30, -128)
cfi_offset (v31, -112)
.machine pop
-#else
- ahi %r15,-96 # create stack frame
#endif
- st %r12,0(%r15) # save backchain
+
lm %r2,%r3,24(%r12) # load arguments saved by PLT
lr %r4,%r14 # return address as third parameter
basr %r1,0
0: l %r14,6f-0b(%r1)
- la %r5,32(%r12) # pointer to struct La_s390_32_regs
+ la %r5,96(%r15) # pointer to struct La_s390_32_regs
la %r6,20(%r12) # long int * framesize
bas %r14,0(%r14,%r1) # call resolver
lr %r1,%r2 # function addr returned in r2
- ld %f0,56(%r12) # restore call-clobbered arg fprs
- ld %f2,64(%r12)
+ ld %f0,120(%r15) # restore call-clobbered arg fprs
+ ld %f2,128(%r15)
#ifdef RESTORE_VRS
.machine push
.machine "z13"
.machinemode "zarch_nohighgprs"
- vlm %v24,%v31,96(%r15) # restore call-clobbered arg vrs
+ vlm %v24,%v31,136(%r15) # restore call-clobbered arg vrs
.machine pop
#endif
icm %r0,15,20(%r12) # load & test framesize
jnm 2f
- lm %r2,%r6,32(%r12)
+ lm %r2,%r6,96(%r15) # framesize < 0 means no pltexit call
+ # so we can do a tail call without
+ # copying the arg overflow area
lr %r15,%r12 # remove stack frame
cfi_def_cfa_register (15)
l %r14,16(%r15) # restore registers
@@ -175,7 +178,9 @@ _dl_runtime_profile:
br %r1 # tail-call to the resolved function
cfi_def_cfa_register (12)
-2: jz 4f # framesize == 0 ?
+2: la %r4,96(%r15) # pointer to struct La_s390_32_regs
+ st %r4,32(%r12)
+ jz 4f # framesize == 0 ?
ahi %r0,7 # align framesize to 8
lhi %r2,-8
nr %r0,%r2
@@ -188,24 +193,35 @@ _dl_runtime_profile:
la %r2,8(%r2)
la %r3,8(%r3)
brct %r0,3b
-4: lm %r2,%r6,32(%r12) # load register parameters
+4: lm %r2,%r6,0(%r4) # load register parameters
basr %r14,%r1 # call resolved function
- stm %r2,%r3,72(%r12) # store return values r2, r3, f0
- std %f0,80(%r12) # to struct La_s390_32_retval
- lm %r2,%r3,24(%r12) # load arguments saved by PLT
+ stm %r2,%r3,40(%r12) # store return values r2, r3, f0
+ std %f0,48(%r12) # to struct La_s390_32_retval
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vst %v24,56(%r12) # store return value v24
+ .machine pop
+#endif
+ lm %r2,%r4,24(%r12) # r2, r3: load arguments saved by PLT
+ # r4: pointer to struct La_s390_32_regs
basr %r1,0
5: l %r14,7f-5b(%r1)
- la %r4,32(%r12) # pointer to struct La_s390_32_regs
- la %r5,72(%r12) # pointer to struct La_s390_32_retval
+ la %r5,40(%r12) # pointer to struct La_s390_32_retval
bas %r14,0(%r14,%r1) # call _dl_call_pltexit
lr %r15,%r12 # remove stack frame
cfi_def_cfa_register (15)
l %r14,16(%r15) # restore registers
l %r12,12(%r15)
- l %r2,72(%r15) # restore return values
- l %r3,76(%r15)
- ld %f0,80(%r15)
+ lm %r2,%r3,40(%r15) # restore return values
+ ld %f0,48(%r15)
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vl %v24,56(%r15) # restore return value v24
+ .machine pop
+#endif
br %r14
6: .long _dl_profile_fixup - 0b
Index: glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.h
===================================================================
--- glibc-2.23.orig/sysdeps/s390/s390-64/dl-trampoline.h
+++ glibc-2.23/sysdeps/s390/s390-64/dl-trampoline.h
@@ -109,31 +109,34 @@ _dl_runtime_resolve:
cfi_startproc
.align 16
_dl_runtime_profile:
- stmg %r2,%r6,64(%r15) # save call-clobbered arg regs
- cfi_offset (r2, -96) # + r6 needed as arg for
- cfi_offset (r3, -88) # _dl_profile_fixup
- cfi_offset (r4, -80)
- cfi_offset (r5, -72)
- cfi_offset (r6, -64)
- std %f0,104(%r15)
- cfi_offset (f0, -56)
- std %f2,112(%r15)
- cfi_offset (f2, -48)
- std %f4,120(%r15)
- cfi_offset (f4, -40)
- std %f6,128(%r15)
- cfi_offset (f6, -32)
stg %r12,24(%r15) # r12 is used as backup of r15
cfi_offset (r12, -136)
stg %r14,32(%r15)
cfi_offset (r14, -128)
lgr %r12,%r15 # backup stack pointer
cfi_def_cfa_register (12)
+ aghi %r15,-360 # create stack frame:
+ # 160 + sizeof(La_s390_64_regs)
+ stg %r12,0(%r15) # save backchain
+
+ stmg %r2,%r6,160(%r15) # save call-clobbered arg regs
+ cfi_offset (r2, -360) # + r6 needed as arg for
+ cfi_offset (r3, -352) # _dl_profile_fixup
+ cfi_offset (r4, -344)
+ cfi_offset (r5, -336)
+ cfi_offset (r6, -328)
+ std %f0,200(%r15)
+ cfi_offset (f0, -320)
+ std %f2,208(%r15)
+ cfi_offset (f2, -312)
+ std %f4,216(%r15)
+ cfi_offset (f4, -304)
+ std %f6,224(%r15)
+ cfi_offset (f6, -296)
#ifdef RESTORE_VRS
- aghi %r15,-288 # create stack frame
.machine push
.machine "z13"
- vstm %v24,%v31,160(%r15)# store call-clobbered vector argument registers
+ vstm %v24,%v31,232(%r15) # store call-clobbered vector arguments
cfi_offset (v24, -288)
cfi_offset (v25, -272)
cfi_offset (v26, -256)
@@ -143,31 +146,28 @@ _dl_runtime_profile:
cfi_offset (v30, -192)
cfi_offset (v31, -176)
.machine pop
-#else
- aghi %r15,-160 # create stack frame
#endif
- stg %r12,0(%r15) # save backchain
lmg %r2,%r3,48(%r12) # load arguments saved by PLT
lgr %r4,%r14 # return address as third parameter
- la %r5,64(%r12) # pointer to struct La_s390_64_regs
+ la %r5,160(%r15) # pointer to struct La_s390_64_regs
la %r6,40(%r12) # long int * framesize
brasl %r14,_dl_profile_fixup # call resolver
lgr %r1,%r2 # function addr returned in r2
- ld %f0,104(%r12) # restore call-clobbered arg fprs
- ld %f2,112(%r12)
- ld %f4,120(%r12)
- ld %f6,128(%r12)
+ ld %f0,200(%r15) # restore call-clobbered arg fprs
+ ld %f2,208(%r15)
+ ld %f4,216(%r15)
+ ld %f6,224(%r15)
#ifdef RESTORE_VRS
.machine push
.machine "z13"
- vlm %v24,%v31,160(%r15) # restore call-clobbered arg vrs
+ vlm %v24,%v31,232(%r15) # restore call-clobbered arg vrs
.machine pop
#endif
lg %r0,40(%r12) # load framesize
ltgr %r0,%r0
jnm 1f
- lmg %r2,%r6,64(%r12) # framesize < 0 means no pltexit call
+ lmg %r2,%r6,160(%r15) # framesize < 0 means no pltexit call
# so we can do a tail call without
# copying the arg overflow area
lgr %r15,%r12 # remove stack frame
@@ -177,7 +177,9 @@ _dl_runtime_profile:
br %r1 # tail-call to resolved function
cfi_def_cfa_register (12)
-1: jz 4f # framesize == 0 ?
+1: la %r4,160(%r15) # pointer to struct La_s390_64_regs
+ stg %r4,64(%r12)
+ jz 4f # framesize == 0 ?
aghi %r0,7 # align framesize to 8
nill %r0,0xfff8
slgr %r15,%r0 # make room for framesize bytes
@@ -189,21 +191,33 @@ _dl_runtime_profile:
la %r2,8(%r2) # depending on framesize
la %r3,8(%r3)
brctg %r0,3b
-4: lmg %r2,%r6,64(%r12) # restore call-clobbered arg gprs
+4: lmg %r2,%r6,0(%r4) # restore call-clobbered arg gprs
basr %r14,%r1 # call resolved function
- stg %r2,136(%r12) # store return values r2, f0
- std %f0,144(%r12) # to struct La_s390_64_retval
- lmg %r2,%r3,48(%r12) # load arguments saved by PLT
- la %r4,64(%r12) # pointer to struct La_s390_64_regs
- la %r5,136(%r12) # pointer to struct La_s390_64_retval
+ stg %r2,72(%r12) # store return values r2, f0
+ std %f0,80(%r12) # to struct La_s390_64_retval
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vst %v24,88(%r12) # store return value v24
+ .machine pop
+#endif
+ lmg %r2,%r4,48(%r12) # r2, r3: load arguments saved by PLT
+ # r4: pointer to struct La_s390_64_regs
+ la %r5,72(%r12) # pointer to struct La_s390_64_retval
brasl %r14,_dl_call_pltexit
lgr %r15,%r12 # remove stack frame
cfi_def_cfa_register (15)
lg %r14,32(%r15) # restore registers
lg %r12,24(%r15)
- lg %r2,136(%r15) # restore return values
- ld %f0,144(%r15)
+ lg %r2,72(%r15) # restore return values
+ ld %f0,80(%r15)
+#ifdef RESTORE_VRS
+ .machine push
+ .machine "z13"
+ vl %v24,88(%r15) # restore return value v24
+ .machine pop
+#endif
br %r14 # Jump back to caller
cfi_endproc

@ -1,60 +0,0 @@
2016-04-01 Florian Weimer <fweimer@redhat.com>
[BZ #19879]
CVE-2016-3075
* resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r): Do not
copy name.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -9,7 +9,10 @@ Version 2.23.1
Security related changes:
- [Add security related changes here]
+* The getnetbyname implementation in nss_dns had a potentially unbounded
+ alloca call (in the form of a call to strdupa), leading to a stack
+ overflow (stack exhaustion) and a crash if getnetbyname is invoked
+ on a very long name. (CVE-2016-3075)
The following bugs are resolved with this release:
@@ -17,9 +20,12 @@ The following bugs are resolved with thi
[19758] Or bit_Prefer_MAP_32BIT_EXEC in EXTRA_LD_ENVVARS
[19759] Don't inline mempcpy for x86
[19762] Use HAS_ARCH_FEATURE with Fast_Rep_String
- [19791] Assertion failure in res_query.c with un-connectable name server addresses
+ [19791] Assertion failure in res_query.c with un-connectable name server
+ addresses
[19792] MIPS: backtrace yields infinite backtrace with makecontext
[19822] libm.so install clobbers old version
+ [19879] network: nss_dns: Stack overflow in getnetbyname implementation
+ (CVE-2016-3075)
Version 2.23
Index: glibc-2.23/resolv/nss_dns/dns-network.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-network.c
+++ glibc-2.23/resolv/nss_dns/dns-network.c
@@ -118,17 +118,14 @@ _nss_dns_getnetbyname_r (const char *nam
} net_buffer;
querybuf *orig_net_buffer;
int anslen;
- char *qbuf;
enum nss_status status;
if (__res_maybe_init (&_res, 0) == -1)
return NSS_STATUS_UNAVAIL;
- qbuf = strdupa (name);
-
net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
- anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
+ anslen = __libc_res_nsearch (&_res, name, C_IN, T_PTR, net_buffer.buf->buf,
1024, &net_buffer.ptr, NULL, NULL, NULL, NULL);
if (anslen < 0)
{

@ -1,77 +0,0 @@
2016-04-09 Mike Frysinger <vapier@gentoo.org>
* sysdeps/i386/configure.ac: Change == to = when calling test.
* sysdeps/x86_64/configure.ac: Likewise.
* sysdeps/i386/configure: Regenerated.
* sysdeps/x86_64/configure: Likewise.
Index: glibc-2.23/sysdeps/i386/configure
===================================================================
--- glibc-2.23.orig/sysdeps/i386/configure
+++ glibc-2.23/sysdeps/i386/configure
@@ -72,7 +72,7 @@ rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_mpx" >&5
$as_echo "$libc_cv_asm_mpx" >&6; }
-if test $libc_cv_asm_mpx == yes; then
+if test $libc_cv_asm_mpx = yes; then
$as_echo "#define HAVE_MPX_SUPPORT 1" >>confdefs.h
fi
Index: glibc-2.23/sysdeps/i386/configure.ac
===================================================================
--- glibc-2.23.orig/sysdeps/i386/configure.ac
+++ glibc-2.23/sysdeps/i386/configure.ac
@@ -41,7 +41,7 @@ else
libc_cv_asm_mpx=no
fi
rm -f conftest*])
-if test $libc_cv_asm_mpx == yes; then
+if test $libc_cv_asm_mpx = yes; then
AC_DEFINE(HAVE_MPX_SUPPORT)
fi
Index: glibc-2.23/sysdeps/x86_64/configure
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/configure
+++ glibc-2.23/sysdeps/x86_64/configure
@@ -24,7 +24,7 @@ rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_avx512" >&5
$as_echo "$libc_cv_asm_avx512" >&6; }
-if test $libc_cv_asm_avx512 == yes; then
+if test $libc_cv_asm_avx512 = yes; then
$as_echo "#define HAVE_AVX512_ASM_SUPPORT 1" >>confdefs.h
fi
@@ -77,7 +77,7 @@ rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_mpx" >&5
$as_echo "$libc_cv_asm_mpx" >&6; }
-if test $libc_cv_asm_mpx == yes; then
+if test $libc_cv_asm_mpx = yes; then
$as_echo "#define HAVE_MPX_SUPPORT 1" >>confdefs.h
fi
Index: glibc-2.23/sysdeps/x86_64/configure.ac
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/configure.ac
+++ glibc-2.23/sysdeps/x86_64/configure.ac
@@ -13,7 +13,7 @@ else
libc_cv_asm_avx512=no
fi
rm -f conftest*])
-if test $libc_cv_asm_avx512 == yes; then
+if test $libc_cv_asm_avx512 = yes; then
AC_DEFINE(HAVE_AVX512_ASM_SUPPORT)
fi
@@ -37,7 +37,7 @@ else
libc_cv_asm_mpx=no
fi
rm -f conftest*])
-if test $libc_cv_asm_mpx == yes; then
+if test $libc_cv_asm_mpx = yes; then
AC_DEFINE(HAVE_MPX_SUPPORT)
fi

@ -1,73 +0,0 @@
2016-04-20 Yvan Roux <yvan.roux@linaro.org>
* stdlib/setenv.c (unsetenv): Fix ambiguous 'else'.
* nis/nis_call.c (nis_server_cache_add): Likewise.
Index: glibc-2.23/nis/nis_call.c
===================================================================
--- glibc-2.23.orig/nis/nis_call.c
+++ glibc-2.23/nis/nis_call.c
@@ -680,16 +680,18 @@ nis_server_cache_add (const_nis_name nam
/* Choose which entry should be evicted from the cache. */
loc = &nis_server_cache[0];
if (*loc != NULL)
- for (i = 1; i < 16; ++i)
- if (nis_server_cache[i] == NULL)
- {
+ {
+ for (i = 1; i < 16; ++i)
+ if (nis_server_cache[i] == NULL)
+ {
+ loc = &nis_server_cache[i];
+ break;
+ }
+ else if ((*loc)->uses > nis_server_cache[i]->uses
+ || ((*loc)->uses == nis_server_cache[i]->uses
+ && (*loc)->expires > nis_server_cache[i]->expires))
loc = &nis_server_cache[i];
- break;
- }
- else if ((*loc)->uses > nis_server_cache[i]->uses
- || ((*loc)->uses == nis_server_cache[i]->uses
- && (*loc)->expires > nis_server_cache[i]->expires))
- loc = &nis_server_cache[i];
+ }
old = *loc;
*loc = new;
Index: glibc-2.23/stdlib/setenv.c
===================================================================
--- glibc-2.23.orig/stdlib/setenv.c
+++ glibc-2.23/stdlib/setenv.c
@@ -278,18 +278,20 @@ unsetenv (const char *name)
ep = __environ;
if (ep != NULL)
while (*ep != NULL)
- if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
- {
- /* Found it. Remove this pointer by moving later ones back. */
- char **dp = ep;
+ {
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
- do
- dp[0] = dp[1];
- while (*dp++);
- /* Continue the loop in case NAME appears again. */
- }
- else
- ++ep;
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+ }
UNLOCK;

@ -1,21 +0,0 @@
2016-03-29 Florian Weimer <fweimer@redhat.com>
[BZ #19837]
* nss/nss_db/db-XXX.c (_nss_db_getENTNAME_r): Propagate ERANGE
error if parse_line fails.
Index: glibc-2.23/nss/nss_db/db-XXX.c
===================================================================
--- glibc-2.23.orig/nss/nss_db/db-XXX.c
+++ glibc-2.23/nss/nss_db/db-XXX.c
@@ -288,8 +288,8 @@ CONCAT(_nss_db_get,ENTNAME_r) (struct ST
}
if (err < 0)
{
- H_ERRNO_SET (HOST_NOT_FOUND);
- status = NSS_STATUS_NOTFOUND;
+ H_ERRNO_SET (NETDB_INTERNAL);
+ status = NSS_STATUS_TRYAGAIN;
break;
}

@ -1,48 +0,0 @@
2016-04-28 Florian Weimer <fweimer@redhat.com>
* inet/getnameinfo.c (getnameinfo): Do not preserve errno.
Index: glibc-2.23/inet/getnameinfo.c
===================================================================
--- glibc-2.23.orig/inet/getnameinfo.c
+++ glibc-2.23/inet/getnameinfo.c
@@ -175,7 +175,6 @@ getnameinfo (const struct sockaddr *sa,
socklen_t hostlen, char *serv, socklen_t servlen,
int flags)
{
- int serrno = errno;
int herrno;
struct hostent th;
int ok = 0;
@@ -326,10 +325,7 @@ getnameinfo (const struct sockaddr *sa,
if (!ok)
{
if (flags & NI_NAMEREQD)
- {
- __set_errno (serrno);
- return EAI_NONAME;
- }
+ return EAI_NONAME;
else
{
const char *c;
@@ -406,10 +402,7 @@ getnameinfo (const struct sockaddr *sa,
};
if (flags & NI_NAMEREQD)
- {
- __set_errno (serrno);
- return EAI_NONAME;
- }
+ return EAI_NONAME;
strncpy (host, "localhost", hostlen);
break;
@@ -463,7 +456,6 @@ getnameinfo (const struct sockaddr *sa,
host[hostlen-1] = 0;
if (serv && (servlen > 0))
serv[servlen-1] = 0;
- errno = serrno;
return 0;
}
libc_hidden_def (getnameinfo)

@ -1,635 +0,0 @@
2016-04-29 Florian Weimer <fweimer@redhat.com>
[BZ #19642]
* inet/getnameinfo.c (gni_host_inet_name, gni_host_inet_numeric)
(gni_host_inet, gni_host_local, gni_host, gni_serv_inet)
(gni_serv_local, gni_serv): New functions extracted from
getnameinfo.
(getnameinfo): Call gni_host and gni_serv to perform the
processing. Always free scratch buffer.
Index: glibc-2.23/inet/getnameinfo.c
===================================================================
--- glibc-2.23.orig/inet/getnameinfo.c
+++ glibc-2.23/inet/getnameinfo.c
@@ -1,3 +1,21 @@
+/* Convert socket address to string using Name Service Switch modules.
+ Copyright (C) 1997-2016 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 Inner Net License, Version 2.00
The author(s) grant permission for redistribution and use in source and
@@ -169,19 +187,323 @@ nrl_domainname (void)
return domain;
};
+/* Convert host name, AF_INET/AF_INET6 case, name only. */
+static int
+gni_host_inet_name (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ int herrno;
+ struct hostent th;
+ struct hostent *h = NULL;
+ if (sa->sa_family == AF_INET6)
+ {
+ while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr),
+ sizeof(struct in6_addr),
+ AF_INET6, &th,
+ tmpbuf->data, tmpbuf->length,
+ &h, &herrno))
+ if (herrno == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ {
+ __set_h_errno (herrno);
+ return EAI_MEMORY;
+ }
+ }
+ else
+ break;
+ }
+ else
+ {
+ while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr),
+ sizeof(struct in_addr),
+ AF_INET, &th,
+ tmpbuf->data, tmpbuf->length,
+ &h, &herrno))
+ if (herrno == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ {
+ __set_h_errno (herrno);
+ return EAI_MEMORY;
+ }
+ }
+ else
+ break;
+ }
+
+ if (h == NULL)
+ {
+ if (herrno == NETDB_INTERNAL)
+ {
+ __set_h_errno (herrno);
+ return EAI_SYSTEM;
+ }
+ if (herrno == TRY_AGAIN)
+ {
+ __set_h_errno (herrno);
+ return EAI_AGAIN;
+ }
+ }
+
+ if (h)
+ {
+ char *c;
+ if ((flags & NI_NOFQDN)
+ && (c = nrl_domainname ())
+ && (c = strstr (h->h_name, c))
+ && (c != h->h_name) && (*(--c) == '.'))
+ /* Terminate the string after the prefix. */
+ *c = '\0';
+
+#ifdef HAVE_LIBIDN
+ /* If requested, convert from the IDN format. */
+ if (flags & NI_IDN)
+ {
+ int idn_flags = 0;
+ if (flags & NI_IDN_ALLOW_UNASSIGNED)
+ idn_flags |= IDNA_ALLOW_UNASSIGNED;
+ if (flags & NI_IDN_USE_STD3_ASCII_RULES)
+ idn_flags |= IDNA_USE_STD3_ASCII_RULES;
+
+ char *out;
+ int rc = __idna_to_unicode_lzlz (h->h_name, &out,
+ idn_flags);
+ if (rc != IDNA_SUCCESS)
+ {
+ if (rc == IDNA_MALLOC_ERROR)
+ return EAI_MEMORY;
+ if (rc == IDNA_DLOPEN_ERROR)
+ return EAI_SYSTEM;
+ return EAI_IDN_ENCODE;
+ }
+
+ if (out != h->h_name)
+ {
+ h->h_name = strdupa (out);
+ free (out);
+ }
+ }
+#endif
+
+ size_t len = strlen (h->h_name) + 1;
+ if (len > hostlen)
+ return EAI_OVERFLOW;
+
+ memcpy (host, h->h_name, len);
+
+ return 0;
+ }
+
+ return EAI_NONAME;
+}
+
+/* Convert host name, AF_INET/AF_INET6 case, numeric conversion. */
+static int
+gni_host_inet_numeric (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ const char *c;
+ if (sa->sa_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *sin6p;
+ uint32_t scopeid;
+
+ sin6p = (const struct sockaddr_in6 *) sa;
+
+ c = inet_ntop (AF_INET6,
+ (const void *) &sin6p->sin6_addr, host, hostlen);
+ scopeid = sin6p->sin6_scope_id;
+ if (scopeid != 0)
+ {
+ /* Buffer is >= IFNAMSIZ+1. */
+ char scopebuf[IFNAMSIZ + 1];
+ char *scopeptr;
+ int ni_numericscope = 0;
+ size_t real_hostlen = __strnlen (host, hostlen);
+ size_t scopelen = 0;
+
+ scopebuf[0] = SCOPE_DELIMITER;
+ scopebuf[1] = '\0';
+ scopeptr = &scopebuf[1];
+
+ if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
+ || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
+ {
+ if (if_indextoname (scopeid, scopeptr) == NULL)
+ ++ni_numericscope;
+ else
+ scopelen = strlen (scopebuf);
+ }
+ else
+ ++ni_numericscope;
+
+ if (ni_numericscope)
+ scopelen = 1 + __snprintf (scopeptr,
+ (scopebuf
+ + sizeof scopebuf
+ - scopeptr),
+ "%u", scopeid);
+
+ if (real_hostlen + scopelen + 1 > hostlen)
+ /* Signal the buffer is too small. This is
+ what inet_ntop does. */
+ c = NULL;
+ else
+ memcpy (host + real_hostlen, scopebuf, scopelen + 1);
+ }
+ }
+ else
+ c = inet_ntop (AF_INET,
+ (const void *) &(((const struct sockaddr_in *) sa)->sin_addr),
+ host, hostlen);
+ if (c == NULL)
+ return EAI_OVERFLOW;
+ return 0;
+}
+
+static int
+gni_host_inet (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ if (!(flags & NI_NUMERICHOST))
+ {
+ int result = gni_host_inet_name
+ (tmpbuf, sa, addrlen, host, hostlen, flags);
+ if (result != EAI_NONAME)
+ return result;
+ }
+
+ if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+ else
+ return gni_host_inet_numeric
+ (tmpbuf, sa, addrlen, host, hostlen, flags);
+}
+
+static int
+gni_host_local (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+
+ if (!(flags & NI_NUMERICHOST))
+ {
+ struct utsname utsname;
+
+ if (!uname (&utsname))
+ {
+ strncpy (host, utsname.nodename, hostlen);
+ return 0;
+ }
+ }
+
+ if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+
+ strncpy (host, "localhost", hostlen);
+ return 0;
+}
+
+static int
+gni_host (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ case AF_INET6:
+ return gni_host_inet (tmpbuf, sa, addrlen, host, hostlen, flags);
+
+ case AF_LOCAL:
+ return gni_host_local (tmpbuf, sa, addrlen, host, hostlen, flags);
+
+ default:
+ return EAI_FAMILY;
+ }
+}
+
+/* Convert service to string, AF_INET and AF_INET6 variant. */
+static int
+gni_serv_inet (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ _Static_assert
+ (offsetof (struct sockaddr_in, sin_port)
+ == offsetof (struct sockaddr_in6, sin6_port)
+ && sizeof (((struct sockaddr_in) {}).sin_port) == sizeof (in_port_t)
+ && sizeof (((struct sockaddr_in6) {}).sin6_port) == sizeof (in_port_t),
+ "AF_INET and AF_INET6 port consistency");
+ if (!(flags & NI_NUMERICSERV))
+ {
+ struct servent *s, ts;
+ int e;
+ while ((e = __getservbyport_r (((const struct sockaddr_in *) sa)->sin_port,
+ ((flags & NI_DGRAM)
+ ? "udp" : "tcp"), &ts,
+ tmpbuf->data, tmpbuf->length, &s)))
+ {
+ if (e == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ return EAI_MEMORY;
+ }
+ else
+ break;
+ }
+ if (s)
+ {
+ strncpy (serv, s->s_name, servlen);
+ return 0;
+ }
+ /* Fall through to numeric conversion. */
+ }
+ if (__snprintf (serv, servlen, "%d",
+ ntohs (((const struct sockaddr_in *) sa)->sin_port))
+ + 1 > servlen)
+ return EAI_OVERFLOW;
+ return 0;
+}
+
+/* Convert service to string, AF_LOCAL variant. */
+static int
+gni_serv_local (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ strncpy (serv, ((const struct sockaddr_un *) sa)->sun_path, servlen);
+ return 0;
+}
+
+/* Convert service to string, dispatching to the implementations
+ above. */
+static int
+gni_serv (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ case AF_INET6:
+ return gni_serv_inet (tmpbuf, sa, addrlen, serv, servlen, flags);
+ case AF_LOCAL:
+ return gni_serv_local (tmpbuf, sa, addrlen, serv, servlen, flags);
+ default:
+ return EAI_FAMILY;
+ }
+}
int
getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
socklen_t hostlen, char *serv, socklen_t servlen,
int flags)
{
- int herrno;
- struct hostent th;
- int ok = 0;
- struct scratch_buffer tmpbuf;
-
- scratch_buffer_init (&tmpbuf);
-
if (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV|NI_NOFQDN|NI_NAMEREQD|NI_DGRAM
#ifdef HAVE_LIBIDN
|NI_IDN|NI_IDN_ALLOW_UNASSIGNED|NI_IDN_USE_STD3_ASCII_RULES
@@ -213,249 +535,34 @@ getnameinfo (const struct sockaddr *sa,
return EAI_FAMILY;
}
- if (host != NULL && hostlen > 0)
- switch (sa->sa_family)
- {
- case AF_INET:
- case AF_INET6:
- if (!(flags & NI_NUMERICHOST))
- {
- struct hostent *h = NULL;
- if (sa->sa_family == AF_INET6)
- {
- while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr),
- sizeof(struct in6_addr),
- AF_INET6, &th,
- tmpbuf.data, tmpbuf.length,
- &h, &herrno))
- if (herrno == NETDB_INTERNAL && errno == ERANGE)
- {
- if (!scratch_buffer_grow (&tmpbuf))
- {
- __set_h_errno (herrno);
- return EAI_MEMORY;
- }
- }
- else
- break;
- }
- else
- {
- while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr),
- sizeof(struct in_addr),
- AF_INET, &th,
- tmpbuf.data, tmpbuf.length,
- &h, &herrno))
- if (herrno == NETDB_INTERNAL && errno == ERANGE)
- {
- if (!scratch_buffer_grow (&tmpbuf))
- {
- __set_h_errno (herrno);
- return EAI_MEMORY;
- }
- }
- else
- break;
- }
-
- if (h == NULL)
- {
- if (herrno == NETDB_INTERNAL)
- {
- __set_h_errno (herrno);
- return EAI_SYSTEM;
- }
- if (herrno == TRY_AGAIN)
- {
- __set_h_errno (herrno);
- return EAI_AGAIN;
- }
- }
-
- if (h)
- {
- char *c;
- if ((flags & NI_NOFQDN)
- && (c = nrl_domainname ())
- && (c = strstr (h->h_name, c))
- && (c != h->h_name) && (*(--c) == '.'))
- /* Terminate the string after the prefix. */
- *c = '\0';
-
-#ifdef HAVE_LIBIDN
- /* If requested, convert from the IDN format. */
- if (flags & NI_IDN)
- {
- int idn_flags = 0;
- if (flags & NI_IDN_ALLOW_UNASSIGNED)
- idn_flags |= IDNA_ALLOW_UNASSIGNED;
- if (flags & NI_IDN_USE_STD3_ASCII_RULES)
- idn_flags |= IDNA_USE_STD3_ASCII_RULES;
-
- char *out;
- int rc = __idna_to_unicode_lzlz (h->h_name, &out,
- idn_flags);
- if (rc != IDNA_SUCCESS)
- {
- if (rc == IDNA_MALLOC_ERROR)
- return EAI_MEMORY;
- if (rc == IDNA_DLOPEN_ERROR)
- return EAI_SYSTEM;
- return EAI_IDN_ENCODE;
- }
-
- if (out != h->h_name)
- {
- h->h_name = strdupa (out);
- free (out);
- }
- }
-#endif
-
- size_t len = strlen (h->h_name) + 1;
- if (len > hostlen)
- return EAI_OVERFLOW;
-
- memcpy (host, h->h_name, len);
-
- ok = 1;
- }
- }
-
- if (!ok)
- {
- if (flags & NI_NAMEREQD)
- return EAI_NONAME;
- else
- {
- const char *c;
- if (sa->sa_family == AF_INET6)
- {
- const struct sockaddr_in6 *sin6p;
- uint32_t scopeid;
-
- sin6p = (const struct sockaddr_in6 *) sa;
-
- c = inet_ntop (AF_INET6,
- (const void *) &sin6p->sin6_addr, host, hostlen);
- scopeid = sin6p->sin6_scope_id;
- if (scopeid != 0)
- {
- /* Buffer is >= IFNAMSIZ+1. */
- char scopebuf[IFNAMSIZ + 1];
- char *scopeptr;
- int ni_numericscope = 0;
- size_t real_hostlen = __strnlen (host, hostlen);
- size_t scopelen = 0;
-
- scopebuf[0] = SCOPE_DELIMITER;
- scopebuf[1] = '\0';
- scopeptr = &scopebuf[1];
-
- if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
- || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
- {
- if (if_indextoname (scopeid, scopeptr) == NULL)
- ++ni_numericscope;
- else
- scopelen = strlen (scopebuf);
- }
- else
- ++ni_numericscope;
-
- if (ni_numericscope)
- scopelen = 1 + __snprintf (scopeptr,
- (scopebuf
- + sizeof scopebuf
- - scopeptr),
- "%u", scopeid);
-
- if (real_hostlen + scopelen + 1 > hostlen)
- /* Signal the buffer is too small. This is
- what inet_ntop does. */
- c = NULL;
- else
- memcpy (host + real_hostlen, scopebuf, scopelen + 1);
- }
- }
- else
- c = inet_ntop (AF_INET,
- (const void *) &(((const struct sockaddr_in *) sa)->sin_addr),
- host, hostlen);
- if (c == NULL)
- return EAI_OVERFLOW;
- }
- ok = 1;
- }
- break;
-
- case AF_LOCAL:
- if (!(flags & NI_NUMERICHOST))
- {
- struct utsname utsname;
-
- if (!uname (&utsname))
- {
- strncpy (host, utsname.nodename, hostlen);
- break;
- };
- };
-
- if (flags & NI_NAMEREQD)
- return EAI_NONAME;
-
- strncpy (host, "localhost", hostlen);
- break;
+ struct scratch_buffer tmpbuf;
+ scratch_buffer_init (&tmpbuf);
- default:
- return EAI_FAMILY;
+ if (host != NULL && hostlen > 0)
+ {
+ int result = gni_host (&tmpbuf, sa, addrlen, host, hostlen, flags);
+ if (result != 0)
+ {
+ scratch_buffer_free (&tmpbuf);
+ return result;
+ }
}
if (serv && (servlen > 0))
- switch (sa->sa_family)
- {
- case AF_INET:
- case AF_INET6:
- if (!(flags & NI_NUMERICSERV))
- {
- struct servent *s, ts;
- int e;
- while ((e = __getservbyport_r (((const struct sockaddr_in *) sa)->sin_port,
- ((flags & NI_DGRAM)
- ? "udp" : "tcp"), &ts,
- tmpbuf.data, tmpbuf.length, &s)))
- {
- if (e == ERANGE)
- {
- if (!scratch_buffer_grow (&tmpbuf))
- return EAI_MEMORY;
- }
- else
- break;
- }
- if (s)
- {
- strncpy (serv, s->s_name, servlen);
- break;
- }
- }
-
- if (__snprintf (serv, servlen, "%d",
- ntohs (((const struct sockaddr_in *) sa)->sin_port))
- + 1 > servlen)
- return EAI_OVERFLOW;
-
- break;
-
- case AF_LOCAL:
- strncpy (serv, ((const struct sockaddr_un *) sa)->sun_path, servlen);
- break;
+ {
+ int result = gni_serv (&tmpbuf, sa, addrlen, serv, servlen, flags);
+ if (result != 0)
+ {
+ scratch_buffer_free (&tmpbuf);
+ return result;
+ }
}
if (host && (hostlen > 0))
host[hostlen-1] = 0;
if (serv && (servlen > 0))
serv[servlen-1] = 0;
+ scratch_buffer_free (&tmpbuf);
return 0;
}
libc_hidden_def (getnameinfo)

@ -1,119 +0,0 @@
2016-05-04 Florian Weimer <fweimer@redhat.com>
* inet/getnameinfo.c (gni_host_inet_name): Use temporaries to
avoid long lines.
(gni_host_inet_numeric): Likewise. Reduce scope of local
variables.
(gni_host_inet, gni_host_local): Add comment.
(gni_host): Add comment. Use temporary to avoid long lines.
Index: glibc-2.23/inet/getnameinfo.c
===================================================================
--- glibc-2.23.orig/inet/getnameinfo.c
+++ glibc-2.23/inet/getnameinfo.c
@@ -198,10 +198,9 @@ gni_host_inet_name (struct scratch_buffe
struct hostent *h = NULL;
if (sa->sa_family == AF_INET6)
{
- while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr),
- sizeof(struct in6_addr),
- AF_INET6, &th,
- tmpbuf->data, tmpbuf->length,
+ const struct sockaddr_in6 *sin6p = (const struct sockaddr_in6 *) sa;
+ while (__gethostbyaddr_r (&sin6p->sin6_addr, sizeof(struct in6_addr),
+ AF_INET6, &th, tmpbuf->data, tmpbuf->length,
&h, &herrno))
if (herrno == NETDB_INTERNAL && errno == ERANGE)
{
@@ -216,10 +215,9 @@ gni_host_inet_name (struct scratch_buffe
}
else
{
- while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr),
- sizeof(struct in_addr),
- AF_INET, &th,
- tmpbuf->data, tmpbuf->length,
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
+ while (__gethostbyaddr_r (&sinp->sin_addr, sizeof(struct in_addr),
+ AF_INET, &th, tmpbuf->data, tmpbuf->length,
&h, &herrno))
if (herrno == NETDB_INTERNAL && errno == ERANGE)
{
@@ -308,14 +306,10 @@ gni_host_inet_numeric (struct scratch_bu
const char *c;
if (sa->sa_family == AF_INET6)
{
- const struct sockaddr_in6 *sin6p;
- uint32_t scopeid;
-
- sin6p = (const struct sockaddr_in6 *) sa;
-
+ const struct sockaddr_in6 *sin6p = (const struct sockaddr_in6 *) sa;
c = inet_ntop (AF_INET6,
(const void *) &sin6p->sin6_addr, host, hostlen);
- scopeid = sin6p->sin6_scope_id;
+ uint32_t scopeid = sin6p->sin6_scope_id;
if (scopeid != 0)
{
/* Buffer is >= IFNAMSIZ+1. */
@@ -356,14 +350,16 @@ gni_host_inet_numeric (struct scratch_bu
}
}
else
- c = inet_ntop (AF_INET,
- (const void *) &(((const struct sockaddr_in *) sa)->sin_addr),
- host, hostlen);
+ {
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
+ c = inet_ntop (AF_INET, &sinp->sin_addr, host, hostlen);
+ }
if (c == NULL)
return EAI_OVERFLOW;
return 0;
}
+/* Convert AF_INET or AF_INET6 socket address, host part. */
static int
gni_host_inet (struct scratch_buffer *tmpbuf,
const struct sockaddr *sa, socklen_t addrlen,
@@ -384,6 +380,7 @@ gni_host_inet (struct scratch_buffer *tm
(tmpbuf, sa, addrlen, host, hostlen, flags);
}
+/* Convert AF_LOCAL socket address, host part. */
static int
gni_host_local (struct scratch_buffer *tmpbuf,
const struct sockaddr *sa, socklen_t addrlen,
@@ -408,6 +405,7 @@ gni_host_local (struct scratch_buffer *t
return 0;
}
+/* Convert the host part of an AF_LOCAK socket address. */
static int
gni_host (struct scratch_buffer *tmpbuf,
const struct sockaddr *sa, socklen_t addrlen,
@@ -439,11 +437,12 @@ gni_serv_inet (struct scratch_buffer *tm
&& sizeof (((struct sockaddr_in) {}).sin_port) == sizeof (in_port_t)
&& sizeof (((struct sockaddr_in6) {}).sin6_port) == sizeof (in_port_t),
"AF_INET and AF_INET6 port consistency");
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
if (!(flags & NI_NUMERICSERV))
{
struct servent *s, ts;
int e;
- while ((e = __getservbyport_r (((const struct sockaddr_in *) sa)->sin_port,
+ while ((e = __getservbyport_r (sinp->sin_port,
((flags & NI_DGRAM)
? "udp" : "tcp"), &ts,
tmpbuf->data, tmpbuf->length, &s)))
@@ -463,9 +462,7 @@ gni_serv_inet (struct scratch_buffer *tm
}
/* Fall through to numeric conversion. */
}
- if (__snprintf (serv, servlen, "%d",
- ntohs (((const struct sockaddr_in *) sa)->sin_port))
- + 1 > servlen)
+ if (__snprintf (serv, servlen, "%d", ntohs (sinp->sin_port)) + 1 > servlen)
return EAI_OVERFLOW;
return 0;
}

@ -1,47 +0,0 @@
2016-05-04 Florian Weimer <fweimer@redhat.com>
* inet/getnameinfo.c (gni_host_inet_numeric): Return EAI_OVERFLOW
in case of inet_ntop failure.
Index: glibc-2.23/inet/getnameinfo.c
===================================================================
--- glibc-2.23.orig/inet/getnameinfo.c
+++ glibc-2.23/inet/getnameinfo.c
@@ -303,12 +303,12 @@ gni_host_inet_numeric (struct scratch_bu
const struct sockaddr *sa, socklen_t addrlen,
char *host, socklen_t hostlen, int flags)
{
- const char *c;
if (sa->sa_family == AF_INET6)
{
const struct sockaddr_in6 *sin6p = (const struct sockaddr_in6 *) sa;
- c = inet_ntop (AF_INET6,
- (const void *) &sin6p->sin6_addr, host, hostlen);
+ if (inet_ntop (AF_INET6, &sin6p->sin6_addr, host, hostlen) == NULL)
+ return EAI_OVERFLOW;
+
uint32_t scopeid = sin6p->sin6_scope_id;
if (scopeid != 0)
{
@@ -344,7 +344,7 @@ gni_host_inet_numeric (struct scratch_bu
if (real_hostlen + scopelen + 1 > hostlen)
/* Signal the buffer is too small. This is
what inet_ntop does. */
- c = NULL;
+ return EAI_OVERFLOW;
else
memcpy (host + real_hostlen, scopebuf, scopelen + 1);
}
@@ -352,10 +352,9 @@ gni_host_inet_numeric (struct scratch_bu
else
{
const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
- c = inet_ntop (AF_INET, &sinp->sin_addr, host, hostlen);
+ if (inet_ntop (AF_INET, &sinp->sin_addr, host, hostlen) == NULL)
+ return EAI_OVERFLOW;
}
- if (c == NULL)
- return EAI_OVERFLOW;
return 0;
}

@ -1,176 +0,0 @@
2016-05-04 Florian Weimer <fweimer@redhat.com>
[BZ #19787]
* inet/getnameinfo.c (check_sprintf_result): New function.
(CHECKED_SNPRINTF): New macro.
(gni_host_inet_numeric): Use CHECKED_SNPRINTF to write the scope
to the host buffer.
(gni_host_local): Use checked_copy to copy the host name.
(gni_serv_inet): Use CHECKED_SNPRINTF to write the service name.
(gni_serv_local): Use checked_copy to copy the service name.
(getnameinfo): Remove unnecessary truncation of result buffers.
Index: glibc-2.23/inet/getnameinfo.c
===================================================================
--- glibc-2.23.orig/inet/getnameinfo.c
+++ glibc-2.23/inet/getnameinfo.c
@@ -187,6 +187,39 @@ nrl_domainname (void)
return domain;
};
+/* Copy a string to a destination buffer with length checking. Return
+ EAI_OVERFLOW if the buffer is not large enough, and 0 on
+ success. */
+static int
+checked_copy (char *dest, size_t destlen, const char *source)
+{
+ size_t source_length = strlen (source);
+ if (source_length + 1 > destlen)
+ return EAI_OVERFLOW;
+ memcpy (dest, source, source_length + 1);
+ return 0;
+}
+
+/* Helper function for CHECKED_SNPRINTF below. */
+static int
+check_sprintf_result (int result, size_t destlen)
+{
+ if (result < 0)
+ return EAI_SYSTEM;
+ if ((size_t) result >= destlen)
+ /* If ret == destlen, there was no room for the terminating NUL
+ character. */
+ return EAI_OVERFLOW;
+ return 0;
+}
+
+/* Format a string in the destination buffer. Return 0 on success,
+ EAI_OVERFLOW in case the buffer is too small, or EAI_SYSTEM on any
+ other error. */
+#define CHECKED_SNPRINTF(dest, destlen, format, ...) \
+ check_sprintf_result \
+ (__snprintf (dest, destlen, format, __VA_ARGS__), destlen)
+
/* Convert host name, AF_INET/AF_INET6 case, name only. */
static int
gni_host_inet_name (struct scratch_buffer *tmpbuf,
@@ -312,41 +345,22 @@ gni_host_inet_numeric (struct scratch_bu
uint32_t scopeid = sin6p->sin6_scope_id;
if (scopeid != 0)
{
- /* Buffer is >= IFNAMSIZ+1. */
- char scopebuf[IFNAMSIZ + 1];
- char *scopeptr;
- int ni_numericscope = 0;
- size_t real_hostlen = __strnlen (host, hostlen);
- size_t scopelen = 0;
-
- scopebuf[0] = SCOPE_DELIMITER;
- scopebuf[1] = '\0';
- scopeptr = &scopebuf[1];
+ size_t used_hostlen = __strnlen (host, hostlen);
+ /* Location of the scope string in the host buffer. */
+ char *scope_start = host + used_hostlen;
+ size_t scope_length = hostlen - used_hostlen;
if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
|| IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
{
- if (if_indextoname (scopeid, scopeptr) == NULL)
- ++ni_numericscope;
- else
- scopelen = strlen (scopebuf);
+ char scopebuf[IFNAMSIZ];
+ if (if_indextoname (scopeid, scopebuf) != NULL)
+ return CHECKED_SNPRINTF
+ (scope_start, scope_length,
+ "%c%s", SCOPE_DELIMITER, scopebuf);
}
- else
- ++ni_numericscope;
-
- if (ni_numericscope)
- scopelen = 1 + __snprintf (scopeptr,
- (scopebuf
- + sizeof scopebuf
- - scopeptr),
- "%u", scopeid);
-
- if (real_hostlen + scopelen + 1 > hostlen)
- /* Signal the buffer is too small. This is
- what inet_ntop does. */
- return EAI_OVERFLOW;
- else
- memcpy (host + real_hostlen, scopebuf, scopelen + 1);
+ return CHECKED_SNPRINTF
+ (scope_start, scope_length, "%c%u", SCOPE_DELIMITER, scopeid);
}
}
else
@@ -385,23 +399,17 @@ gni_host_local (struct scratch_buffer *t
const struct sockaddr *sa, socklen_t addrlen,
char *host, socklen_t hostlen, int flags)
{
-
if (!(flags & NI_NUMERICHOST))
{
struct utsname utsname;
-
- if (!uname (&utsname))
- {
- strncpy (host, utsname.nodename, hostlen);
- return 0;
- }
+ if (uname (&utsname) == 0)
+ return checked_copy (host, hostlen, utsname.nodename);
}
if (flags & NI_NAMEREQD)
return EAI_NONAME;
- strncpy (host, "localhost", hostlen);
- return 0;
+ return checked_copy (host, hostlen, "localhost");
}
/* Convert the host part of an AF_LOCAK socket address. */
@@ -455,15 +463,10 @@ gni_serv_inet (struct scratch_buffer *tm
break;
}
if (s)
- {
- strncpy (serv, s->s_name, servlen);
- return 0;
- }
+ return checked_copy (serv, servlen, s->s_name);
/* Fall through to numeric conversion. */
}
- if (__snprintf (serv, servlen, "%d", ntohs (sinp->sin_port)) + 1 > servlen)
- return EAI_OVERFLOW;
- return 0;
+ return CHECKED_SNPRINTF (serv, servlen, "%d", ntohs (sinp->sin_port));
}
/* Convert service to string, AF_LOCAL variant. */
@@ -472,8 +475,8 @@ gni_serv_local (struct scratch_buffer *t
const struct sockaddr *sa, socklen_t addrlen,
char *serv, socklen_t servlen, int flags)
{
- strncpy (serv, ((const struct sockaddr_un *) sa)->sun_path, servlen);
- return 0;
+ return checked_copy
+ (serv, servlen, ((const struct sockaddr_un *) sa)->sun_path);
}
/* Convert service to string, dispatching to the implementations
@@ -554,10 +557,6 @@ getnameinfo (const struct sockaddr *sa,
}
}
- if (host && (hostlen > 0))
- host[hostlen-1] = 0;
- if (serv && (servlen > 0))
- serv[servlen-1] = 0;
scratch_buffer_free (&tmpbuf);
return 0;
}

@ -1,48 +0,0 @@
2016-05-02 Florian Weimer <fweimer@redhat.com>
* hesiod/hesiod.h: Remove RCS keyword.
* hesiod/hesiod_p.h: Likewise.
* hesiod/hesiod.c: Likewise.
Index: glibc-2.23/hesiod/hesiod.c
===================================================================
--- glibc-2.23.orig/hesiod/hesiod.c
+++ glibc-2.23/hesiod/hesiod.c
@@ -1,7 +1,3 @@
-#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$BINDId: hesiod.c,v 1.21 2000/02/28 14:51:08 vixie Exp $";
-#endif
-
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
Index: glibc-2.23/hesiod/hesiod.h
===================================================================
--- glibc-2.23.orig/hesiod/hesiod.h
+++ glibc-2.23/hesiod/hesiod.h
@@ -19,10 +19,6 @@
* This file is primarily maintained by <tytso@mit.edu> and <ghudson@mit.edu>.
*/
-/*
- * $BINDId: hesiod.h,v 1.7 1999/01/08 19:22:45 vixie Exp $
- */
-
#ifndef _HESIOD_H_INCLUDED
#define _HESIOD_H_INCLUDED
Index: glibc-2.23/hesiod/hesiod_p.h
===================================================================
--- glibc-2.23.orig/hesiod/hesiod_p.h
+++ glibc-2.23/hesiod/hesiod_p.h
@@ -20,10 +20,6 @@
*/
/*
- * $BINDId: hesiod_p.h,v 1.9 1999/01/08 19:24:39 vixie Exp $
- */
-
-/*
* hesiod_p.h -- private definitions for the hesiod library
*/

@ -1,440 +0,0 @@
2016-05-02 Florian Weimer <fweimer@redhat.com>
[BZ #19573]
* hesiod/Makefile (libnss_hesiod-routines): Remove hesiod-init.
* hesiod/nss_hesiod/hesiod-init.c: Remove file.
* hesiod/nss_hesiod/nss_hesiod.h: Likewise.
* hesiod/hesiod.h (__hesiod_res_get, __hesiod_res_set): Remove.
(hesiod_init, hesiod_end, hesiod_to_bind, hesiod_resolve)
(hesiod_free_list): Mark as hidden.
* hesiod/hesiod_p (struct hesiod_p): Remove res, free_res,
res_set, res_get.
* hesiod/hesiod.c: Remove unnecessary forward declarations.
(init, __hesiod_res_get, __hesiod_res_set): Remove.
(hesiod_init): Remove obsolete res_ninit call.
(hesiod_end): Do not free resolver state. Do not invoke callback.
(hesiod_bind): Do not call init.
(get_txt_records): Use res_mkquery, res_send instead of
res_nmkquery, res_nsend.
* hesiod/nss_hesiod/hesiod-grp.c (lookup): Call hesiod_init
instead of _nss_hesiod_init.
(_nss_hesiod_initgroups_dyn): Likewise.
* hesiod/nss_hesiod/hesiod-proto.c (lookup): Likewise.
* hesiod/nss_hesiod/hesiod-pwd.c (lookup): Likewise.
* hesiod/nss_hesiod/hesiod-service.c (lookup): Likewise.
Index: glibc-2.23/hesiod/Makefile
===================================================================
--- glibc-2.23.orig/hesiod/Makefile
+++ glibc-2.23/hesiod/Makefile
@@ -28,7 +28,7 @@ extra-libs-others = $(extra-libs)
subdir-dirs = nss_hesiod
vpath %.c nss_hesiod
-libnss_hesiod-routines := hesiod hesiod-grp hesiod-init hesiod-proto \
+libnss_hesiod-routines := hesiod hesiod-grp hesiod-proto \
hesiod-pwd hesiod-service
# Build only shared library
libnss_hesiod-inhibit-o = $(filter-out .os,$(object-suffixes))
Index: glibc-2.23/hesiod/hesiod.c
===================================================================
--- glibc-2.23.orig/hesiod/hesiod.c
+++ glibc-2.23/hesiod/hesiod.c
@@ -1,3 +1,20 @@
+/* Copyright (C) 1997-2016 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/>. */
+
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
@@ -48,18 +65,9 @@
/* Forward */
-int hesiod_init(void **context);
-void hesiod_end(void *context);
-char * hesiod_to_bind(void *context, const char *name,
- const char *type);
-char ** hesiod_resolve(void *context, const char *name,
- const char *type);
-void hesiod_free_list(void *context, char **list);
-
static int parse_config_file(struct hesiod_p *ctx, const char *filename);
static char ** get_txt_records(struct hesiod_p *ctx, int class,
const char *name);
-static int init(struct hesiod_p *ctx);
/* Public */
@@ -78,7 +86,6 @@ hesiod_init(void **context) {
ctx->LHS = NULL;
ctx->RHS = NULL;
- ctx->res = NULL;
/* Set default query classes. */
ctx->classes[0] = C_IN;
ctx->classes[1] = C_HS;
@@ -127,11 +134,6 @@ hesiod_init(void **context) {
goto cleanup;
}
-#if 0
- if (res_ninit(ctx->res) < 0)
- goto cleanup;
-#endif
-
*context = ctx;
return (0);
@@ -148,12 +150,8 @@ hesiod_end(void *context) {
struct hesiod_p *ctx = (struct hesiod_p *) context;
int save_errno = errno;
- if (ctx->res)
- res_nclose(ctx->res);
free(ctx->RHS);
free(ctx->LHS);
- if (ctx->res && ctx->free_res)
- (*ctx->free_res)(ctx->res);
free(ctx);
__set_errno(save_errno);
}
@@ -228,10 +226,6 @@ hesiod_resolve(void *context, const char
if (bindname == NULL)
return (NULL);
- if (init(ctx) == -1) {
- free(bindname);
- return (NULL);
- }
retvec = get_txt_records(ctx, ctx->classes[0], bindname);
@@ -361,13 +355,13 @@ get_txt_records(struct hesiod_p *ctx, in
/*
* Construct the query and send it.
*/
- n = res_nmkquery(ctx->res, QUERY, name, class, T_TXT, NULL, 0,
+ n = res_mkquery(QUERY, name, class, T_TXT, NULL, 0,
NULL, qbuf, MAX_HESRESP);
if (n < 0) {
__set_errno(EMSGSIZE);
return (NULL);
}
- n = res_nsend(ctx->res, qbuf, n, abuf, MAX_HESRESP);
+ n = res_send(qbuf, n, abuf, MAX_HESRESP);
if (n < 0) {
__set_errno(ECONNREFUSED);
return (NULL);
@@ -460,44 +454,3 @@ get_txt_records(struct hesiod_p *ctx, in
free(list);
return (NULL);
}
-
-struct __res_state *
-__hesiod_res_get(void *context) {
- struct hesiod_p *ctx = context;
-
- if (!ctx->res) {
- struct __res_state *res;
- res = (struct __res_state *)calloc(1, sizeof *res);
- if (res == NULL)
- return (NULL);
- __hesiod_res_set(ctx, res, free);
- }
-
- return (ctx->res);
-}
-
-void
-__hesiod_res_set(void *context, struct __res_state *res,
- void (*free_res)(void *)) {
- struct hesiod_p *ctx = context;
-
- if (ctx->res && ctx->free_res) {
- res_nclose(ctx->res);
- (*ctx->free_res)(ctx->res);
- }
-
- ctx->res = res;
- ctx->free_res = free_res;
-}
-
-static int
-init(struct hesiod_p *ctx) {
-
- if (!ctx->res && !__hesiod_res_get(ctx))
- return (-1);
-
- if (__res_maybe_init (ctx->res, 0) == -1)
- return (-1);
-
- return (0);
-}
Index: glibc-2.23/hesiod/hesiod.h
===================================================================
--- glibc-2.23.orig/hesiod/hesiod.h
+++ glibc-2.23/hesiod/hesiod.h
@@ -1,3 +1,20 @@
+/* Copyright (C) 1997-2016 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/>. */
+
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
@@ -22,15 +39,12 @@
#ifndef _HESIOD_H_INCLUDED
#define _HESIOD_H_INCLUDED
-int hesiod_init (void **context);
-void hesiod_end (void *context);
+int hesiod_init (void **context) attribute_hidden;
+void hesiod_end (void *context) attribute_hidden;
char * hesiod_to_bind (void *context, const char *name,
- const char *type);
+ const char *type) attribute_hidden;
char ** hesiod_resolve (void *context, const char *name,
- const char *type);
-void hesiod_free_list (void *context, char **list);
-struct __res_state * __hesiod_res_get (void *context);
-void __hesiod_res_set (void *context, struct __res_state *,
- void (*)(void *));
+ const char *type) attribute_hidden;
+void hesiod_free_list (void *context, char **list) attribute_hidden;
#endif /*_HESIOD_H_INCLUDED*/
Index: glibc-2.23/hesiod/hesiod_p.h
===================================================================
--- glibc-2.23.orig/hesiod/hesiod_p.h
+++ glibc-2.23/hesiod/hesiod_p.h
@@ -1,3 +1,20 @@
+/* Copyright (C) 1997-2016 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/>. */
+
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
@@ -32,11 +49,6 @@
struct hesiod_p {
char * LHS; /* normally ".ns" */
char * RHS; /* AKA the default hesiod domain */
- struct __res_state * res; /* resolver context */
- void (*free_res)(void *);
- void (*res_set)(struct hesiod_p *, struct __res_state *,
- void (*)(void *));
- struct __res_state * (*res_get)(struct hesiod_p *);
int classes[2]; /* The class search order. */
};
Index: glibc-2.23/hesiod/nss_hesiod/hesiod-grp.c
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/hesiod-grp.c
+++ glibc-2.23/hesiod/nss_hesiod/hesiod-grp.c
@@ -26,8 +26,6 @@
#include <string.h>
#include <sys/param.h>
-#include "nss_hesiod.h"
-
/* Get the declaration of the parser function. */
#define ENTNAME grent
#define STRUCTURE group
@@ -58,8 +56,7 @@ lookup (const char *name, const char *ty
size_t len;
int olderr = errno;
- context = _nss_hesiod_init ();
- if (context == NULL)
+ if (hesiod_init (&context) < 0)
return NSS_STATUS_UNAVAIL;
list = hesiod_resolve (context, name, type);
@@ -179,8 +176,7 @@ _nss_hesiod_initgroups_dyn (const char *
gid_t *groups = *groupsp;
int save_errno;
- context = _nss_hesiod_init ();
- if (context == NULL)
+ if (hesiod_init (&context) < 0)
return NSS_STATUS_UNAVAIL;
list = hesiod_resolve (context, user, "grplist");
Index: glibc-2.23/hesiod/nss_hesiod/hesiod-init.c
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/hesiod-init.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2000-2016 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 2000.
-
- 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 <sys/cdefs.h> /* Needs to come before <hesiod.h>. */
-#include <hesiod.h>
-#include <resolv.h>
-#include <stddef.h>
-
-#include "nss_hesiod.h"
-
-void *
-_nss_hesiod_init (void)
-{
- void *context;
-
- if (hesiod_init (&context) == -1)
- return NULL;
-
- /* Use the default (per-thread) resolver state. */
- __hesiod_res_set (context, &_res, NULL);
-
- return context;
-}
Index: glibc-2.23/hesiod/nss_hesiod/hesiod-proto.c
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/hesiod-proto.c
+++ glibc-2.23/hesiod/nss_hesiod/hesiod-proto.c
@@ -25,8 +25,6 @@
#include <stdlib.h>
#include <string.h>
-#include "nss_hesiod.h"
-
/* Declare a parser for Hesiod protocol entries. Although the format
of the entries is identical to those in /etc/protocols, here is no
predefined parser for us to use. */
@@ -68,8 +66,7 @@ lookup (const char *name, const char *ty
int found;
int olderr = errno;
- context = _nss_hesiod_init ();
- if (context == NULL)
+ if (hesiod_init (&context) < 0)
return NSS_STATUS_UNAVAIL;
list = hesiod_resolve (context, name, type);
Index: glibc-2.23/hesiod/nss_hesiod/hesiod-pwd.c
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/hesiod-pwd.c
+++ glibc-2.23/hesiod/nss_hesiod/hesiod-pwd.c
@@ -24,8 +24,6 @@
#include <stdlib.h>
#include <string.h>
-#include "nss_hesiod.h"
-
/* Get the declaration of the parser function. */
#define ENTNAME pwent
#define STRUCTURE passwd
@@ -56,8 +54,7 @@ lookup (const char *name, const char *ty
size_t len;
int olderr = errno;
- context = _nss_hesiod_init ();
- if (context == NULL)
+ if (hesiod_init (&context) < 0)
return NSS_STATUS_UNAVAIL;
list = hesiod_resolve (context, name, type);
Index: glibc-2.23/hesiod/nss_hesiod/hesiod-service.c
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/hesiod-service.c
+++ glibc-2.23/hesiod/nss_hesiod/hesiod-service.c
@@ -25,8 +25,6 @@
#include <stdlib.h>
#include <string.h>
-#include "nss_hesiod.h"
-
/* Hesiod uses a format for service entries that differs from the
traditional format. We therefore declare our own parser. */
@@ -69,8 +67,7 @@ lookup (const char *name, const char *ty
int found;
int olderr = errno;
- context = _nss_hesiod_init ();
- if (context == NULL)
+ if (hesiod_init (&context) < 0)
return NSS_STATUS_UNAVAIL;
list = hesiod_resolve (context, name, type);
Index: glibc-2.23/hesiod/nss_hesiod/nss_hesiod.h
===================================================================
--- glibc-2.23.orig/hesiod/nss_hesiod/nss_hesiod.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (C) 2000-2016 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 2000.
-
- 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/>. */
-
-/* Initialize a Hesiod context. */
-extern void *_nss_hesiod_init (void);

@ -1,19 +0,0 @@
2016-05-02 Florian Weimer <fweimer@redhat.com>
[BZ #20031]
* hesiod/hesiod.c (get_txt_records): Return error if TXT record is
completely empty.
Index: glibc-2.23/hesiod/hesiod.c
===================================================================
--- glibc-2.23.orig/hesiod/hesiod.c
+++ glibc-2.23/hesiod/hesiod.c
@@ -411,7 +411,7 @@ get_txt_records(struct hesiod_p *ctx, in
cp += INT16SZ + INT32SZ; /* skip the ttl, too */
rr.dlen = ns_get16(cp);
cp += INT16SZ;
- if (cp + rr.dlen > eom) {
+ if (rr.dlen == 0 || cp + rr.dlen > eom) {
__set_errno(EMSGSIZE);
goto cleanup;
}

@ -1,73 +0,0 @@
2016-02-19 Florian Weimer <fweimer@redhat.com>
* sysdeps/generic/malloc-machine.h: Assume mutex_init is always
available. Do not define NO_THREADS.
* malloc/malloc.c: Do not check NO_THREADS.
* malloc/arena.c: Likewise.
Index: glibc-2.23/malloc/arena.c
===================================================================
--- glibc-2.23.orig/malloc/arena.c
+++ glibc-2.23/malloc/arena.c
@@ -130,8 +130,6 @@ int __malloc_initialized = -1;
/**************************************************************************/
-#ifndef NO_THREADS
-
/* atfork support. */
static void *(*save_malloc_hook)(size_t __size, const void *);
@@ -330,7 +328,6 @@ ptmalloc_unlock_all2 (void)
# define ptmalloc_unlock_all2 ptmalloc_unlock_all
# endif
-#endif /* !NO_THREADS */
/* Initialization routine. */
#include <string.h>
Index: glibc-2.23/malloc/malloc.c
===================================================================
--- glibc-2.23.orig/malloc/malloc.c
+++ glibc-2.23/malloc/malloc.c
@@ -1074,10 +1074,8 @@ static void* realloc_check(void* oldme
const void *caller);
static void* memalign_check(size_t alignment, size_t bytes,
const void *caller);
-#ifndef NO_THREADS
static void* malloc_atfork(size_t sz, const void *caller);
static void free_atfork(void* mem, const void *caller);
-#endif
/* ------------------ MMAP support ------------------ */
Index: glibc-2.23/sysdeps/generic/malloc-machine.h
===================================================================
--- glibc-2.23.orig/sysdeps/generic/malloc-machine.h
+++ glibc-2.23/sysdeps/generic/malloc-machine.h
@@ -22,25 +22,6 @@
#include <atomic.h>
-#ifndef mutex_init /* No threads, provide dummy macros */
-
-# define NO_THREADS
-
-/* The mutex functions used to do absolutely nothing, i.e. lock,
- trylock and unlock would always just return 0. However, even
- without any concurrently active threads, a mutex can be used
- legitimately as an `in use' flag. To make the code that is
- protected by a mutex async-signal safe, these macros would have to
- be based on atomic test-and-set operations, for example. */
-typedef int mutex_t;
-
-# define mutex_init(m) (*(m) = 0)
-# define mutex_lock(m) ({ *(m) = 1; 0; })
-# define mutex_trylock(m) (*(m) ? 1 : ((*(m) = 1), 0))
-# define mutex_unlock(m) (*(m) = 0)
-
-#endif /* !defined mutex_init */
-
#ifndef atomic_full_barrier
# define atomic_full_barrier() __asm ("" ::: "memory")
#endif

@ -1,26 +0,0 @@
2016-03-22 Samuel Thibault <samuel.thibault@ens-lyon.org>
* malloc/Makefile ($(objpfx)tst-malloc-backtrace,
$(objpfx)tst-malloc-thread-exit, $(objpfx)tst-malloc-thread-fail): Use
$(shared-thread-library) instead of hardcoding the path to libpthread.
Index: glibc-2.23/malloc/Makefile
===================================================================
--- glibc-2.23.orig/malloc/Makefile
+++ glibc-2.23/malloc/Makefile
@@ -46,12 +46,9 @@ extra-libs-others = $(extra-libs)
libmemusage-routines = memusage
libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes))
-$(objpfx)tst-malloc-backtrace: $(common-objpfx)nptl/libpthread.so \
- $(common-objpfx)nptl/libpthread_nonshared.a
-$(objpfx)tst-malloc-thread-exit: $(common-objpfx)nptl/libpthread.so \
- $(common-objpfx)nptl/libpthread_nonshared.a
-$(objpfx)tst-malloc-thread-fail: $(common-objpfx)nptl/libpthread.so \
- $(common-objpfx)nptl/libpthread_nonshared.a
+$(objpfx)tst-malloc-backtrace: $(shared-thread-library)
+$(objpfx)tst-malloc-thread-exit: $(shared-thread-library)
+$(objpfx)tst-malloc-thread-fail: $(shared-thread-library)
# These should be removed by `make clean'.
extra-objs = mcheck-init.o libmcheck.a

@ -1,568 +0,0 @@
2016-04-14 Florian Weimer <fweimer@redhat.com>
[BZ #19431]
Run the malloc fork handler as late as possible to avoid deadlocks.
* malloc/malloc-internal.h: New file.
* malloc/malloc.c: Include it.
* malloc/arena.c (ATFORK_MEM): Remove.
(__malloc_fork_lock_parent): Rename from ptmalloc_lock_all.
Update comment.
(__malloc_fork_unlock_parent): Rename from ptmalloc_unlock_all.
(__malloc_fork_unlock_child): Rename from ptmalloc_unlock_all2.
Remove outdated comment.
(ptmalloc_init): Do not call thread_atfork. Remove
thread_atfork_static.
* malloc/tst-malloc-fork-deadlock.c: New file.
* Makefile (tests): Add tst-malloc-fork-deadlock.
(tst-malloc-fork-deadlock): Link against libpthread.
* manual/memory.texi (Aligned Memory Blocks): Update safety
annotation comments.
* sysdeps/nptl/fork.c (__libc_fork): Call
__malloc_fork_lock_parent, __malloc_fork_unlock_parent,
__malloc_fork_unlock_child.
* sysdeps/mach/hurd/fork.c (__fork): Likewise.
Index: glibc-2.23/malloc/Makefile
===================================================================
--- glibc-2.23.orig/malloc/Makefile
+++ glibc-2.23/malloc/Makefile
@@ -29,7 +29,7 @@ tests := mallocbug tst-malloc tst-valloc
tst-malloc-usable tst-realloc tst-posix_memalign \
tst-pvalloc tst-memalign tst-mallopt tst-scratch_buffer \
tst-malloc-backtrace tst-malloc-thread-exit \
- tst-malloc-thread-fail
+ tst-malloc-thread-fail tst-malloc-fork-deadlock
test-srcs = tst-mtrace
routines = malloc morecore mcheck mtrace obstack \
@@ -49,6 +49,7 @@ libmemusage-inhibit-o = $(filter-out .os
$(objpfx)tst-malloc-backtrace: $(shared-thread-library)
$(objpfx)tst-malloc-thread-exit: $(shared-thread-library)
$(objpfx)tst-malloc-thread-fail: $(shared-thread-library)
+$(objpfx)tst-malloc-fork-deadlock: $(shared-thread-library)
# These should be removed by `make clean'.
extra-objs = mcheck-init.o libmcheck.a
Index: glibc-2.23/malloc/arena.c
===================================================================
--- glibc-2.23.orig/malloc/arena.c
+++ glibc-2.23/malloc/arena.c
@@ -136,10 +136,6 @@ static void *(*save_malloc_hook)(size_t
static void (*save_free_hook) (void *__ptr, const void *);
static void *save_arena;
-# ifdef ATFORK_MEM
-ATFORK_MEM;
-# endif
-
/* Magic value for the thread-specific arena pointer when
malloc_atfork() is in use. */
@@ -205,14 +201,14 @@ free_atfork (void *mem, const void *call
/* Counter for number of times the list is locked by the same thread. */
static unsigned int atfork_recursive_cntr;
-/* The following two functions are registered via thread_atfork() to
- make sure that the mutexes remain in a consistent state in the
- fork()ed version of a thread. Also adapt the malloc and free hooks
- temporarily, because the `atfork' handler mechanism may use
- malloc/free internally (e.g. in LinuxThreads). */
+/* The following three functions are called around fork from a
+ multi-threaded process. We do not use the general fork handler
+ mechanism to make sure that our handlers are the last ones being
+ called, so that other fork handlers can use the malloc
+ subsystem. */
-static void
-ptmalloc_lock_all (void)
+void
+__malloc_fork_lock_parent (void)
{
mstate ar_ptr;
@@ -220,7 +216,7 @@ ptmalloc_lock_all (void)
return;
/* We do not acquire free_list_lock here because we completely
- reconstruct free_list in ptmalloc_unlock_all2. */
+ reconstruct free_list in __malloc_fork_unlock_child. */
if (mutex_trylock (&list_lock))
{
@@ -245,7 +241,7 @@ ptmalloc_lock_all (void)
__free_hook = free_atfork;
/* Only the current thread may perform malloc/free calls now.
save_arena will be reattached to the current thread, in
- ptmalloc_lock_all, so save_arena->attached_threads is not
+ __malloc_fork_lock_parent, so save_arena->attached_threads is not
updated. */
save_arena = thread_arena;
thread_arena = ATFORK_ARENA_PTR;
@@ -253,8 +249,8 @@ out:
++atfork_recursive_cntr;
}
-static void
-ptmalloc_unlock_all (void)
+void
+__malloc_fork_unlock_parent (void)
{
mstate ar_ptr;
@@ -265,8 +261,8 @@ ptmalloc_unlock_all (void)
return;
/* Replace ATFORK_ARENA_PTR with save_arena.
- save_arena->attached_threads was not changed in ptmalloc_lock_all
- and is still correct. */
+ save_arena->attached_threads was not changed in
+ __malloc_fork_lock_parent and is still correct. */
thread_arena = save_arena;
__malloc_hook = save_malloc_hook;
__free_hook = save_free_hook;
@@ -280,15 +276,8 @@ ptmalloc_unlock_all (void)
(void) mutex_unlock (&list_lock);
}
-# ifdef __linux__
-
-/* In NPTL, unlocking a mutex in the child process after a
- fork() is currently unsafe, whereas re-initializing it is safe and
- does not leak resources. Therefore, a special atfork handler is
- installed for the child. */
-
-static void
-ptmalloc_unlock_all2 (void)
+void
+__malloc_fork_unlock_child (void)
{
mstate ar_ptr;
@@ -324,11 +313,6 @@ ptmalloc_unlock_all2 (void)
atfork_recursive_cntr = 0;
}
-# else
-
-# define ptmalloc_unlock_all2 ptmalloc_unlock_all
-# endif
-
/* Initialization routine. */
#include <string.h>
extern char **_environ;
@@ -397,7 +381,6 @@ ptmalloc_init (void)
#endif
thread_arena = &main_arena;
- thread_atfork (ptmalloc_lock_all, ptmalloc_unlock_all, ptmalloc_unlock_all2);
const char *s = NULL;
if (__glibc_likely (_environ != NULL))
{
@@ -472,14 +455,6 @@ ptmalloc_init (void)
__malloc_initialized = 1;
}
-/* There are platforms (e.g. Hurd) with a link-time hook mechanism. */
-#ifdef thread_atfork_static
-thread_atfork_static (ptmalloc_lock_all, ptmalloc_unlock_all, \
- ptmalloc_unlock_all2)
-#endif
-
-
-
/* Managing heaps and arenas (for concurrent threads) */
#if MALLOC_DEBUG > 1
@@ -828,7 +803,8 @@ _int_new_arena (size_t size)
limit is reached). At this point, some arena has to be attached
to two threads. We could acquire the arena lock before list_lock
to make it less likely that reused_arena picks this new arena,
- but this could result in a deadlock with ptmalloc_lock_all. */
+ but this could result in a deadlock with
+ __malloc_fork_lock_parent. */
(void) mutex_lock (&a->mutex);
Index: glibc-2.23/malloc/malloc-internal.h
===================================================================
--- /dev/null
+++ glibc-2.23/malloc/malloc-internal.h
@@ -0,0 +1,32 @@
+/* Internal declarations for malloc, for use within libc.
+ Copyright (C) 2016 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; see the file COPYING.LIB. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _MALLOC_PRIVATE_H
+#define _MALLOC_PRIVATE_H
+
+/* Called in the parent process before a fork. */
+void __malloc_fork_lock_parent (void) internal_function attribute_hidden;
+
+/* Called in the parent process after a fork. */
+void __malloc_fork_unlock_parent (void) internal_function attribute_hidden;
+
+/* Called in the child process after a fork. */
+void __malloc_fork_unlock_child (void) internal_function attribute_hidden;
+
+
+#endif /* _MALLOC_PRIVATE_H */
Index: glibc-2.23/malloc/malloc.c
===================================================================
--- glibc-2.23.orig/malloc/malloc.c
+++ glibc-2.23/malloc/malloc.c
@@ -244,6 +244,7 @@
/* For ALIGN_UP et. al. */
#include <libc-internal.h>
+#include <malloc/malloc-internal.h>
/*
Debugging:
Index: glibc-2.23/malloc/tst-malloc-fork-deadlock.c
===================================================================
--- /dev/null
+++ glibc-2.23/malloc/tst-malloc-fork-deadlock.c
@@ -0,0 +1,220 @@
+/* Test concurrent fork, getline, and fflush (NULL).
+ Copyright (C) 2016 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; see the file COPYING.LIB. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <time.h>
+#include <string.h>
+#include <signal.h>
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
+
+enum {
+ /* Number of threads which call fork. */
+ fork_thread_count = 4,
+ /* Number of threads which call getline (and, indirectly,
+ malloc). */
+ read_thread_count = 8,
+};
+
+static bool termination_requested;
+
+static void *
+fork_thread_function (void *closure)
+{
+ while (!__atomic_load_n (&termination_requested, __ATOMIC_RELAXED))
+ {
+ pid_t pid = fork ();
+ if (pid < 0)
+ {
+ printf ("error: fork: %m\n");
+ abort ();
+ }
+ else if (pid == 0)
+ _exit (17);
+
+ int status;
+ if (waitpid (pid, &status, 0) < 0)
+ {
+ printf ("error: waitpid: %m\n");
+ abort ();
+ }
+ if (!WIFEXITED (status) || WEXITSTATUS (status) != 17)
+ {
+ printf ("error: waitpid returned invalid status: %d\n", status);
+ abort ();
+ }
+ }
+ return NULL;
+}
+
+static char *file_to_read;
+
+static void *
+read_thread_function (void *closure)
+{
+ FILE *f = fopen (file_to_read, "r");
+ if (f == NULL)
+ {
+ printf ("error: fopen (%s): %m\n", file_to_read);
+ abort ();
+ }
+
+ while (!__atomic_load_n (&termination_requested, __ATOMIC_RELAXED))
+ {
+ rewind (f);
+ char *line = NULL;
+ size_t line_allocated = 0;
+ ssize_t ret = getline (&line, &line_allocated, f);
+ if (ret < 0)
+ {
+ printf ("error: getline: %m\n");
+ abort ();
+ }
+ free (line);
+ }
+ fclose (f);
+
+ return NULL;
+}
+
+static void *
+flushall_thread_function (void *closure)
+{
+ while (!__atomic_load_n (&termination_requested, __ATOMIC_RELAXED))
+ if (fflush (NULL) != 0)
+ {
+ printf ("error: fflush (NULL): %m\n");
+ abort ();
+ }
+ return NULL;
+}
+
+static void
+create_threads (pthread_t *threads, size_t count, void *(*func) (void *))
+{
+ for (size_t i = 0; i < count; ++i)
+ {
+ int ret = pthread_create (threads + i, NULL, func, NULL);
+ if (ret != 0)
+ {
+ errno = ret;
+ printf ("error: pthread_create: %m\n");
+ abort ();
+ }
+ }
+}
+
+static void
+join_threads (pthread_t *threads, size_t count)
+{
+ for (size_t i = 0; i < count; ++i)
+ {
+ int ret = pthread_join (threads[i], NULL);
+ if (ret != 0)
+ {
+ errno = ret;
+ printf ("error: pthread_join: %m\n");
+ abort ();
+ }
+ }
+}
+
+/* Create a file which consists of a single long line, and assigns
+ file_to_read. The hope is that this triggers an allocation in
+ getline which needs a lock. */
+static void
+create_file_with_large_line (void)
+{
+ int fd = create_temp_file ("bug19431-large-line", &file_to_read);
+ if (fd < 0)
+ {
+ printf ("error: create_temp_file: %m\n");
+ abort ();
+ }
+ FILE *f = fdopen (fd, "w+");
+ if (f == NULL)
+ {
+ printf ("error: fdopen: %m\n");
+ abort ();
+ }
+ for (int i = 0; i < 50000; ++i)
+ fputc ('x', f);
+ fputc ('\n', f);
+ if (ferror (f))
+ {
+ printf ("error: fputc: %m\n");
+ abort ();
+ }
+ if (fclose (f) != 0)
+ {
+ printf ("error: fclose: %m\n");
+ abort ();
+ }
+}
+
+static int
+do_test (void)
+{
+ /* Make sure that we do not exceed the arena limit with the number
+ of threads we configured. */
+ if (mallopt (M_ARENA_MAX, 400) == 0)
+ {
+ printf ("error: mallopt (M_ARENA_MAX) failed\n");
+ return 1;
+ }
+
+ /* Leave some room for shutting down all threads gracefully. */
+ int timeout = 3;
+ if (timeout > TIMEOUT)
+ timeout = TIMEOUT - 1;
+
+ create_file_with_large_line ();
+
+ pthread_t fork_threads[fork_thread_count];
+ create_threads (fork_threads, fork_thread_count, fork_thread_function);
+ pthread_t read_threads[read_thread_count];
+ create_threads (read_threads, read_thread_count, read_thread_function);
+ pthread_t flushall_threads[1];
+ create_threads (flushall_threads, 1, flushall_thread_function);
+
+ struct timespec ts = {timeout, 0};
+ if (nanosleep (&ts, NULL))
+ {
+ printf ("error: error: nanosleep: %m\n");
+ abort ();
+ }
+
+ __atomic_store_n (&termination_requested, true, __ATOMIC_RELAXED);
+
+ join_threads (flushall_threads, 1);
+ join_threads (read_threads, read_thread_count);
+ join_threads (fork_threads, fork_thread_count);
+
+ free (file_to_read);
+
+ return 0;
+}
Index: glibc-2.23/manual/memory.texi
===================================================================
--- glibc-2.23.orig/manual/memory.texi
+++ glibc-2.23/manual/memory.texi
@@ -1051,14 +1051,6 @@ systems that do not support @w{ISO C11}.
@c _dl_addr_inside_object ok
@c determine_info ok
@c __rtld_lock_unlock_recursive (dl_load_lock) @aculock
-@c thread_atfork @asulock @aculock @acsfd @acsmem
-@c __register_atfork @asulock @aculock @acsfd @acsmem
-@c lll_lock (__fork_lock) @asulock @aculock
-@c fork_handler_alloc @asulock @aculock @acsfd @acsmem
-@c calloc dup @asulock @aculock @acsfd @acsmem
-@c __linkin_atfork ok
-@c catomic_compare_and_exchange_bool_acq ok
-@c lll_unlock (__fork_lock) @aculock
@c *_environ @mtsenv
@c next_env_entry ok
@c strcspn dup ok
Index: glibc-2.23/sysdeps/mach/hurd/fork.c
===================================================================
--- glibc-2.23.orig/sysdeps/mach/hurd/fork.c
+++ glibc-2.23/sysdeps/mach/hurd/fork.c
@@ -26,6 +26,7 @@
#include <assert.h>
#include "hurdmalloc.h" /* XXX */
#include <tls.h>
+#include <malloc/malloc-internal.h>
#undef __fork
@@ -107,6 +108,12 @@ __fork (void)
/* Run things that prepare for forking before we create the task. */
RUN_HOOK (_hurd_fork_prepare_hook, ());
+ /* Acquire malloc locks. This needs to come last because fork
+ handlers may use malloc, and the libio list lock has an
+ indirect malloc dependency as well (via the getdelim
+ function). */
+ __malloc_fork_lock_parent ();
+
/* Lock things that want to be locked before we fork. */
{
void *const *p;
@@ -604,6 +611,9 @@ __fork (void)
nthreads * sizeof (*threads));
}
+ /* Release malloc locks. */
+ __malloc_fork_unlock_parent ();
+
/* Run things that want to run in the parent to restore it to
normality. Usually prepare hooks and parent hooks are
symmetrical: the prepare hook arrests state in some way for the
@@ -655,6 +665,9 @@ __fork (void)
/* Forking clears the trace flag. */
__sigemptyset (&_hurdsig_traced);
+ /* Release malloc locks. */
+ __malloc_fork_unlock_child ();
+
/* Run things that want to run in the child task to set up. */
RUN_HOOK (_hurd_fork_child_hook, ());
Index: glibc-2.23/sysdeps/nptl/fork.c
===================================================================
--- glibc-2.23.orig/sysdeps/nptl/fork.c
+++ glibc-2.23/sysdeps/nptl/fork.c
@@ -31,7 +31,7 @@
#include <fork.h>
#include <arch-fork.h>
#include <futex-internal.h>
-
+#include <malloc/malloc-internal.h>
static void
fresetlockfiles (void)
@@ -111,6 +111,11 @@ __libc_fork (void)
_IO_list_lock ();
+ /* Acquire malloc locks. This needs to come last because fork
+ handlers may use malloc, and the libio list lock has an indirect
+ malloc dependency as well (via the getdelim function). */
+ __malloc_fork_lock_parent ();
+
#ifndef NDEBUG
pid_t ppid = THREAD_GETMEM (THREAD_SELF, tid);
#endif
@@ -168,6 +173,9 @@ __libc_fork (void)
# endif
#endif
+ /* Release malloc locks. */
+ __malloc_fork_unlock_child ();
+
/* Reset the file list. These are recursive mutexes. */
fresetlockfiles ();
@@ -209,6 +217,9 @@ __libc_fork (void)
/* Restore the PID value. */
THREAD_SETMEM (THREAD_SELF, pid, parentpid);
+ /* Release malloc locks, parent process variant. */
+ __malloc_fork_unlock_parent ();
+
/* We execute this even if the 'fork' call failed. */
_IO_list_unlock ();

@ -1,216 +0,0 @@
2016-04-14 Florian Weimer <fweimer@redhat.com>
Remove malloc hooks from fork handler. They are no longer needed
because malloc runs right before fork, and no malloc calls from
other fork handlers are not possible anymore.
* malloc/malloc.c (malloc_atfork, free_atfork): Remove
declarations.
* malloc/arena.c (save_malloc_hook, save_free_hook, save_arena)
(ATFORK_ARENA_PTR, malloc_atfork, free_atfork)
(atfork_recursive_cntr): Remove.
(__malloc_fork_lock_parent): Do not override malloc hooks and
thread_arena.
(__malloc_fork_unlock_parent): Do not restore malloc hooks and
thread_arena.
(__malloc_fork_unlock_child): Do not restore malloc hooks. Use
thread_arena instead of save_arena.
Index: glibc-2.23/malloc/arena.c
===================================================================
--- glibc-2.23.orig/malloc/arena.c
+++ glibc-2.23/malloc/arena.c
@@ -132,75 +132,6 @@ int __malloc_initialized = -1;
/* atfork support. */
-static void *(*save_malloc_hook)(size_t __size, const void *);
-static void (*save_free_hook) (void *__ptr, const void *);
-static void *save_arena;
-
-/* Magic value for the thread-specific arena pointer when
- malloc_atfork() is in use. */
-
-# define ATFORK_ARENA_PTR ((void *) -1)
-
-/* The following hooks are used while the `atfork' handling mechanism
- is active. */
-
-static void *
-malloc_atfork (size_t sz, const void *caller)
-{
- void *victim;
-
- if (thread_arena == ATFORK_ARENA_PTR)
- {
- /* We are the only thread that may allocate at all. */
- if (save_malloc_hook != malloc_check)
- {
- return _int_malloc (&main_arena, sz);
- }
- else
- {
- if (top_check () < 0)
- return 0;
-
- victim = _int_malloc (&main_arena, sz + 1);
- return mem2mem_check (victim, sz);
- }
- }
- else
- {
- /* Suspend the thread until the `atfork' handlers have completed.
- By that time, the hooks will have been reset as well, so that
- mALLOc() can be used again. */
- (void) mutex_lock (&list_lock);
- (void) mutex_unlock (&list_lock);
- return __libc_malloc (sz);
- }
-}
-
-static void
-free_atfork (void *mem, const void *caller)
-{
- mstate ar_ptr;
- mchunkptr p; /* chunk corresponding to mem */
-
- if (mem == 0) /* free(0) has no effect */
- return;
-
- p = mem2chunk (mem); /* do not bother to replicate free_check here */
-
- if (chunk_is_mmapped (p)) /* release mmapped memory. */
- {
- munmap_chunk (p);
- return;
- }
-
- ar_ptr = arena_for_chunk (p);
- _int_free (ar_ptr, p, thread_arena == ATFORK_ARENA_PTR);
-}
-
-
-/* Counter for number of times the list is locked by the same thread. */
-static unsigned int atfork_recursive_cntr;
-
/* The following three functions are called around fork from a
multi-threaded process. We do not use the general fork handler
mechanism to make sure that our handlers are the last ones being
@@ -210,63 +141,30 @@ static unsigned int atfork_recursive_cnt
void
__malloc_fork_lock_parent (void)
{
- mstate ar_ptr;
-
if (__malloc_initialized < 1)
return;
/* We do not acquire free_list_lock here because we completely
reconstruct free_list in __malloc_fork_unlock_child. */
- if (mutex_trylock (&list_lock))
- {
- if (thread_arena == ATFORK_ARENA_PTR)
- /* This is the same thread which already locks the global list.
- Just bump the counter. */
- goto out;
+ (void) mutex_lock (&list_lock);
- /* This thread has to wait its turn. */
- (void) mutex_lock (&list_lock);
- }
- for (ar_ptr = &main_arena;; )
+ for (mstate ar_ptr = &main_arena;; )
{
(void) mutex_lock (&ar_ptr->mutex);
ar_ptr = ar_ptr->next;
if (ar_ptr == &main_arena)
break;
}
- save_malloc_hook = __malloc_hook;
- save_free_hook = __free_hook;
- __malloc_hook = malloc_atfork;
- __free_hook = free_atfork;
- /* Only the current thread may perform malloc/free calls now.
- save_arena will be reattached to the current thread, in
- __malloc_fork_lock_parent, so save_arena->attached_threads is not
- updated. */
- save_arena = thread_arena;
- thread_arena = ATFORK_ARENA_PTR;
-out:
- ++atfork_recursive_cntr;
}
void
__malloc_fork_unlock_parent (void)
{
- mstate ar_ptr;
-
if (__malloc_initialized < 1)
return;
- if (--atfork_recursive_cntr != 0)
- return;
-
- /* Replace ATFORK_ARENA_PTR with save_arena.
- save_arena->attached_threads was not changed in
- __malloc_fork_lock_parent and is still correct. */
- thread_arena = save_arena;
- __malloc_hook = save_malloc_hook;
- __free_hook = save_free_hook;
- for (ar_ptr = &main_arena;; )
+ for (mstate ar_ptr = &main_arena;; )
{
(void) mutex_unlock (&ar_ptr->mutex);
ar_ptr = ar_ptr->next;
@@ -279,25 +177,19 @@ __malloc_fork_unlock_parent (void)
void
__malloc_fork_unlock_child (void)
{
- mstate ar_ptr;
-
if (__malloc_initialized < 1)
return;
- thread_arena = save_arena;
- __malloc_hook = save_malloc_hook;
- __free_hook = save_free_hook;
-
- /* Push all arenas to the free list, except save_arena, which is
+ /* Push all arenas to the free list, except thread_arena, which is
attached to the current thread. */
mutex_init (&free_list_lock);
- if (save_arena != NULL)
- ((mstate) save_arena)->attached_threads = 1;
+ if (thread_arena != NULL)
+ thread_arena->attached_threads = 1;
free_list = NULL;
- for (ar_ptr = &main_arena;; )
+ for (mstate ar_ptr = &main_arena;; )
{
mutex_init (&ar_ptr->mutex);
- if (ar_ptr != save_arena)
+ if (ar_ptr != thread_arena)
{
/* This arena is no longer attached to any thread. */
ar_ptr->attached_threads = 0;
@@ -310,7 +202,6 @@ __malloc_fork_unlock_child (void)
}
mutex_init (&list_lock);
- atfork_recursive_cntr = 0;
}
/* Initialization routine. */
Index: glibc-2.23/malloc/malloc.c
===================================================================
--- glibc-2.23.orig/malloc/malloc.c
+++ glibc-2.23/malloc/malloc.c
@@ -1075,8 +1075,6 @@ static void* realloc_check(void* oldme
const void *caller);
static void* memalign_check(size_t alignment, size_t bytes,
const void *caller);
-static void* malloc_atfork(size_t sz, const void *caller);
-static void free_atfork(void* mem, const void *caller);
/* ------------------ MMAP support ------------------ */

@ -1,34 +0,0 @@
2016-04-14 Florian Weimer <fweimer@redhat.com>
* malloc/arena.c (__malloc_fork_lock_parent)
(__malloc_fork_unlock_parent, __malloc_fork_unlock_child): Add
internal_function attribute.
Index: glibc-2.23/malloc/arena.c
===================================================================
--- glibc-2.23.orig/malloc/arena.c
+++ glibc-2.23/malloc/arena.c
@@ -139,6 +139,7 @@ int __malloc_initialized = -1;
subsystem. */
void
+internal_function
__malloc_fork_lock_parent (void)
{
if (__malloc_initialized < 1)
@@ -159,6 +160,7 @@ __malloc_fork_lock_parent (void)
}
void
+internal_function
__malloc_fork_unlock_parent (void)
{
if (__malloc_initialized < 1)
@@ -175,6 +177,7 @@ __malloc_fork_unlock_parent (void)
}
void
+internal_function
__malloc_fork_unlock_child (void)
{
if (__malloc_initialized < 1)

@ -1,24 +0,0 @@
2016-04-11 Florian Weimer <fweimer@redhat.com>
[BZ #19865]
* resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Restore
original buffer before retry.
Index: glibc-2.23/resolv/nss_dns/dns-canon.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-canon.c
+++ glibc-2.23/resolv/nss_dns/dns-canon.c
@@ -144,6 +144,13 @@ _nss_dns_getcanonname_r (const char *nam
ptr += sizeof (uint16_t) + __ns_get16 (ptr);
}
}
+
+ /* Restore original buffer before retry. */
+ if (ansp.ptr != buf)
+ {
+ free (ansp.ptr);
+ ansp.ptr = buf;
+ }
}
out:

@ -1,77 +0,0 @@
2016-04-27 Florian Weimer <fweimer@redhat.com>
[BZ #19830]
* resolv/nss_dns/dns-host.c (getanswer_r): Check RDATA length.
(gaih_getanswer_slice): Likewise.
* resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Likewise.
Also check for availability of RR metadata.
Index: glibc-2.23/resolv/nss_dns/dns-canon.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-canon.c
+++ glibc-2.23/resolv/nss_dns/dns-canon.c
@@ -103,6 +103,11 @@ _nss_dns_getcanonname_r (const char *nam
ptr += s;
+ /* Check that there are enough bytes for the RR
+ metadata. */
+ if (endptr - ptr < 10)
+ goto unavail;
+
/* Check whether type and class match. */
uint_fast16_t type;
NS_GET16 (type, ptr);
@@ -137,11 +142,16 @@ _nss_dns_getcanonname_r (const char *nam
if (__ns_get16 (ptr) != ns_c_in)
goto unavail;
- /* Also skip over the TTL. */
+ /* Also skip over class and TTL. */
ptr += sizeof (uint16_t) + sizeof (uint32_t);
- /* Skip over the data length and data. */
- ptr += sizeof (uint16_t) + __ns_get16 (ptr);
+ /* Skip over RDATA length and RDATA itself. */
+ uint16_t rdatalen = __ns_get16 (ptr);
+ ptr += sizeof (uint16_t);
+ /* Not enough room for RDATA. */
+ if (endptr - ptr < rdatalen)
+ goto unavail;
+ ptr += rdatalen;
}
}
Index: glibc-2.23/resolv/nss_dns/dns-host.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-host.c
+++ glibc-2.23/resolv/nss_dns/dns-host.c
@@ -751,6 +751,14 @@ getanswer_r (const querybuf *answer, int
cp += INT32SZ; /* TTL */
n = __ns_get16 (cp);
cp += INT16SZ; /* len */
+
+ if (end_of_message - cp < n)
+ {
+ /* RDATA extends beyond the end of the packet. */
+ ++had_error;
+ continue;
+ }
+
if (__glibc_unlikely (class != C_IN))
{
/* XXX - debug? syslog? */
@@ -1077,6 +1085,13 @@ gaih_getanswer_slice (const querybuf *an
n = __ns_get16 (cp);
cp += INT16SZ; /* len */
+ if (end_of_message - cp < n)
+ {
+ /* RDATA extends beyond the end of the packet. */
+ ++had_error;
+ continue;
+ }
+
if (class != C_IN)
{
cp += n;

@ -1,150 +0,0 @@
2016-04-27 Florian Weimer <fweimer@redhat.com>
[BZ #19862]
* resolv/nss_dns/dns-host.c (AskedForGot): Remove.
(getanswer_r): Do not call syslog.
(gaih_getanswer_slice): Likewise.
* resolv/gethnamaddr.c (AskedForGot): Remove.
(getanswer): Do not call syslog.
(gethostbyaddr): Likewise.
Index: glibc-2.23/resolv/gethnamaddr.c
===================================================================
--- glibc-2.23.orig/resolv/gethnamaddr.c
+++ glibc-2.23/resolv/gethnamaddr.c
@@ -70,7 +70,6 @@ static char sccsid[] = "@(#)gethostnamad
#include <resolv.h>
#include <ctype.h>
#include <errno.h>
-#include <syslog.h>
#define RESOLVSORT
@@ -100,9 +99,6 @@ static char sccsid[] = "@(#)gethostnamad
#define MAXALIASES 35
#define MAXADDRS 35
-static const char AskedForGot[] =
- "gethostby*.getanswer: asked for \"%s\", got \"%s\"";
-
static char *h_addr_ptrs[MAXADDRS + 1];
static struct hostent host;
@@ -335,20 +331,12 @@ getanswer (const querybuf *answer, int a
* uses many different types in responses that do not
* match QTYPE.
*/
- if ((_res.options & RES_USE_DNSSEC) == 0) {
- syslog(LOG_NOTICE|LOG_AUTH,
- "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"",
- qname, p_class(C_IN), p_type(qtype),
- p_type(type));
- }
cp += n;
continue; /* XXX - had_error++ ? */
}
switch (type) {
case T_PTR:
if (strcasecmp(tname, bp) != 0) {
- syslog(LOG_NOTICE|LOG_AUTH,
- AskedForGot, qname, bp);
cp += n;
continue; /* XXX - had_error++ ? */
}
@@ -397,8 +385,6 @@ getanswer (const querybuf *answer, int a
case T_A:
case T_AAAA:
if (strcasecmp(host.h_name, bp) != 0) {
- syslog(LOG_NOTICE|LOG_AUTH,
- AskedForGot, host.h_name, bp);
cp += n;
continue; /* XXX - had_error++ ? */
}
@@ -740,9 +726,6 @@ gethostbyaddr (const void *addr, socklen
_res.options &= ~RES_DNSRCH;
_res.options |= RES_DEFNAMES;
if (!(rhp = gethostbyname(hname2))) {
- syslog(LOG_NOTICE|LOG_AUTH,
- "gethostbyaddr: No A record for %s (verifying [%s])",
- hname2, inet_ntoa(*((struct in_addr *)addr)));
_res.options = old_options;
__set_h_errno (HOST_NOT_FOUND);
return (NULL);
@@ -752,9 +735,6 @@ gethostbyaddr (const void *addr, socklen
if (!memcmp(*haddr, addr, INADDRSZ))
break;
if (!*haddr) {
- syslog(LOG_NOTICE|LOG_AUTH,
- "gethostbyaddr: A record of %s != PTR record [%s]",
- hname2, inet_ntoa(*((struct in_addr *)addr)));
__set_h_errno (HOST_NOT_FOUND);
return (NULL);
}
Index: glibc-2.23/resolv/nss_dns/dns-host.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-host.c
+++ glibc-2.23/resolv/nss_dns/dns-host.c
@@ -78,7 +78,6 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
-#include <sys/syslog.h>
#include "nsswitch.h"
@@ -99,10 +98,6 @@
#endif
#define MAXHOSTNAMELEN 256
-static const char AskedForGot[] = "\
-gethostby*.getanswer: asked for \"%s\", got \"%s\"";
-
-
/* We need this time later. */
typedef union querybuf
{
@@ -838,14 +833,6 @@ getanswer_r (const querybuf *answer, int
have_to_map = 1;
else if (__glibc_unlikely (type != qtype))
{
- /* Log a low priority message if we get an unexpected record, but
- skip it if we are using DNSSEC since it uses many different types
- in responses that do not match QTYPE. */
- if ((_res.options & RES_USE_DNSSEC) == 0)
- syslog (LOG_NOTICE | LOG_AUTH,
- "gethostby*.getanswer: asked for \"%s %s %s\", "
- "got type \"%s\"",
- qname, p_class (C_IN), p_type (qtype), p_type (type));
cp += n;
continue; /* XXX - had_error++ ? */
}
@@ -855,7 +842,6 @@ getanswer_r (const querybuf *answer, int
case T_PTR:
if (__glibc_unlikely (strcasecmp (tname, bp) != 0))
{
- syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp);
cp += n;
continue; /* XXX - had_error++ ? */
}
@@ -899,7 +885,6 @@ getanswer_r (const querybuf *answer, int
case T_AAAA:
if (__builtin_expect (strcasecmp (result->h_name, bp), 0) != 0)
{
- syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, result->h_name, bp);
cp += n;
continue; /* XXX - had_error++ ? */
}
@@ -1152,13 +1137,6 @@ gaih_getanswer_slice (const querybuf *an
|| __builtin_expect (type == T_DNAME, 0))
#endif
{
- /* We don't support DNSSEC yet. For now, ignore the record
- and send a low priority message to syslog.
-
- We also don't expect T_PTR or T_DNAME messages. */
- syslog (LOG_DEBUG | LOG_AUTH,
- "getaddrinfo*.gaih_getanswer: got type \"%s\"",
- p_type (type));
cp += n;
continue;
}

@ -1,104 +0,0 @@
2016-04-27 Florian Weimer <fweimer@redhat.com>
[BZ #19831]
* resolv/nss_dns/dns-host.c (rrtype_to_rdata_length): New
function.
(getanswer_r): Check RDATA length against RRTYPE and QTYPE.
(gaih_getanswer_slice): Check RDATA length against RRTYPE.
Index: glibc-2.23/resolv/nss_dns/dns-host.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-host.c
+++ glibc-2.23/resolv/nss_dns/dns-host.c
@@ -134,6 +134,22 @@ extern enum nss_status _nss_dns_gethostb
char **canonp);
hidden_proto (_nss_dns_gethostbyname3_r)
+/* Return the expected RDATA length for an address record type (A or
+ AAAA). */
+static int
+rrtype_to_rdata_length (int type)
+{
+ switch (type)
+ {
+ case T_A:
+ return INADDRSZ;
+ case T_AAAA:
+ return IN6ADDRSZ;
+ default:
+ return -1;
+ }
+}
+
enum nss_status
_nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result,
char *buffer, size_t buflen, int *errnop,
@@ -888,6 +904,15 @@ getanswer_r (const querybuf *answer, int
cp += n;
continue; /* XXX - had_error++ ? */
}
+
+ /* Stop parsing at a record whose length is incorrect. */
+ if (n != rrtype_to_rdata_length (type))
+ {
+ ++had_error;
+ break;
+ }
+
+ /* Skip records of the wrong type. */
if (n != result->h_length)
{
cp += n;
@@ -1124,25 +1149,25 @@ gaih_getanswer_slice (const querybuf *an
}
continue;
}
-#if 1
- // We should not see any types other than those explicitly listed
- // below. Some types sent by server seem missing, though. Just
- // collect the data for now.
- if (__glibc_unlikely (type != T_A && type != T_AAAA))
-#else
- if (__builtin_expect (type == T_SIG, 0)
- || __builtin_expect (type == T_KEY, 0)
- || __builtin_expect (type == T_NXT, 0)
- || __builtin_expect (type == T_PTR, 0)
- || __builtin_expect (type == T_DNAME, 0))
-#endif
+
+ /* Stop parsing if we encounter a record with incorrect RDATA
+ length. */
+ if (type == T_A || type == T_AAAA)
{
+ if (n != rrtype_to_rdata_length (type))
+ {
+ ++had_error;
+ continue;
+ }
+ }
+ else
+ {
+ /* Skip unknown records. */
cp += n;
continue;
}
- if (type != T_A && type != T_AAAA)
- abort ();
+ assert (type == T_A || type == T_AAAA);
if (*pat == NULL)
{
uintptr_t pad = (-(uintptr_t) buffer
@@ -1176,12 +1201,6 @@ gaih_getanswer_slice (const querybuf *an
}
(*pat)->family = type == T_A ? AF_INET : AF_INET6;
- if (__builtin_expect ((type == T_A && n != INADDRSZ)
- || (type == T_AAAA && n != IN6ADDRSZ), 0))
- {
- ++had_error;
- continue;
- }
memcpy ((*pat)->addr, cp, n);
cp += n;
(*pat)->scopeid = 0;

@ -1,55 +0,0 @@
2016-03-25 Florian Weimer <fweimer@redhat.com>
[BZ #19868]
* resolv/nss_dns/dns-network.c (getanswer_r): Implement additional
DNS packet syntax checks (which were not needed before). Skip
over non-PTR records.
Index: glibc-2.23/resolv/nss_dns/dns-network.c
===================================================================
--- glibc-2.23.orig/resolv/nss_dns/dns-network.c
+++ glibc-2.23/resolv/nss_dns/dns-network.c
@@ -345,10 +345,23 @@ getanswer_r (const querybuf *answer, int
if (n < 0 || res_dnok (bp) == 0)
break;
cp += n;
+
+ if (end_of_message - cp < 10)
+ {
+ __set_h_errno (NO_RECOVERY);
+ return NSS_STATUS_UNAVAIL;
+ }
+
GETSHORT (type, cp);
GETSHORT (class, cp);
cp += INT32SZ; /* TTL */
- GETSHORT (n, cp);
+ uint16_t rdatalen;
+ GETSHORT (rdatalen, cp);
+ if (end_of_message - cp < rdatalen)
+ {
+ __set_h_errno (NO_RECOVERY);
+ return NSS_STATUS_UNAVAIL;
+ }
if (class == C_IN && type == T_PTR)
{
@@ -370,7 +383,7 @@ getanswer_r (const querybuf *answer, int
cp += n;
return NSS_STATUS_UNAVAIL;
}
- cp += n;
+ cp += rdatalen;
if (alias_pointer + 2 < &net_data->aliases[MAX_NR_ALIASES])
{
*alias_pointer++ = bp;
@@ -381,6 +394,9 @@ getanswer_r (const querybuf *answer, int
++have_answer;
}
}
+ else
+ /* Skip over unknown record data. */
+ cp += rdatalen;
}
if (have_answer)

@ -1,113 +0,0 @@
2016-04-27 Florian Weimer <fweimer@redhat.com>
[BZ #19825]
* resolv/res_send.c (send_vc): Remove early *resplen2
initialization. Set *resplen2 on socket error. Call
close_and_return_error for other errors.
Index: glibc-2.23/resolv/res_send.c
===================================================================
--- glibc-2.23.orig/resolv/res_send.c
+++ glibc-2.23/resolv/res_send.c
@@ -762,8 +762,6 @@ send_vc(res_state statp,
u_short len2;
u_char *cp;
- if (resplen2 != NULL)
- *resplen2 = 0;
connreset = 0;
same_ns:
truncating = 0;
@@ -789,6 +787,8 @@ send_vc(res_state statp,
if (statp->_vcsock < 0) {
*terrno = errno;
Perror(statp, stderr, "socket(vc)", errno);
+ if (resplen2 != NULL)
+ *resplen2 = 0;
return (-1);
}
__set_errno (0);
@@ -798,8 +798,7 @@ send_vc(res_state statp,
: sizeof (struct sockaddr_in6)) < 0) {
*terrno = errno;
Aerror(statp, stderr, "connect/vc", errno, nsap);
- __res_iclose(statp, false);
- return (0);
+ return close_and_return_error (statp, resplen2);
}
statp->_flags |= RES_F_VC;
}
@@ -822,8 +821,7 @@ send_vc(res_state statp,
if (TEMP_FAILURE_RETRY (writev(statp->_vcsock, iov, niov)) != explen) {
*terrno = errno;
Perror(statp, stderr, "write failed", errno);
- __res_iclose(statp, false);
- return (0);
+ return close_and_return_error (statp, resplen2);
}
/*
* Receive length & response
@@ -845,7 +843,6 @@ send_vc(res_state statp,
if (n <= 0) {
*terrno = errno;
Perror(statp, stderr, "read failed", errno);
- __res_iclose(statp, false);
/*
* A long running process might get its TCP
* connection reset if the remote server was
@@ -855,11 +852,13 @@ send_vc(res_state statp,
* instead of failing. We only allow one reset
* per query to prevent looping.
*/
- if (*terrno == ECONNRESET && !connreset) {
- connreset = 1;
- goto same_ns;
- }
- return (0);
+ if (*terrno == ECONNRESET && !connreset)
+ {
+ __res_iclose (statp, false);
+ connreset = 1;
+ goto same_ns;
+ }
+ return close_and_return_error (statp, resplen2);
}
int rlen = ntohs (rlen16);
@@ -891,11 +890,11 @@ send_vc(res_state statp,
/* Always allocate MAXPACKET, callers expect
this specific size. */
u_char *newp = malloc (MAXPACKET);
- if (newp == NULL) {
- *terrno = ENOMEM;
- __res_iclose(statp, false);
- return (0);
- }
+ if (newp == NULL)
+ {
+ *terrno = ENOMEM;
+ return close_and_return_error (statp, resplen2);
+ }
*thisanssizp = MAXPACKET;
*thisansp = newp;
if (thisansp == ansp2)
@@ -922,8 +921,7 @@ send_vc(res_state statp,
Dprint(statp->options & RES_DEBUG,
(stdout, ";; undersized: %d\n", len));
*terrno = EMSGSIZE;
- __res_iclose(statp, false);
- return (0);
+ return close_and_return_error (statp, resplen2);
}
cp = *thisansp;
@@ -934,8 +932,7 @@ send_vc(res_state statp,
if (__glibc_unlikely (n <= 0)) {
*terrno = errno;
Perror(statp, stderr, "read(vc)", errno);
- __res_iclose(statp, false);
- return (0);
+ return close_and_return_error (statp, resplen2);
}
if (__glibc_unlikely (truncating)) {
/*

@ -1,274 +0,0 @@
2016-03-07 Florian Weimer <fweimer@redhat.com>
[BZ #19269]
* sysdeps/x86_64/Makefile (tst-audit4): Depend on
tst-audit4-aux.o.
(tst-audit10): Depend on tst-audit10-aux.o.
(CFLAGS-tst-audit4-aux.c): Compile with AVX enabled.
(CFLAGS-tst-audit10-aux.c): Compile with AVX512 enabled.
* sysdeps/x86_64/tst-audit4.c (do_test): Call tst_audit4_aux
instead of inline AVX code.
* sysdeps/x86_64/tst-audit10.c (do_test): Call tst_audit10_aux
instead of inline AVX512 code.
* sysdeps/x86_64/tst-audit4-aux.c: New file
* sysdeps/x86_64/tst-audit10-aux.c: New file
Index: glibc-2.23/sysdeps/x86_64/Makefile
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/Makefile
+++ glibc-2.23/sysdeps/x86_64/Makefile
@@ -60,7 +60,7 @@ $(objpfx)tst-audit3: $(objpfx)tst-auditm
$(objpfx)tst-audit3.out: $(objpfx)tst-auditmod3b.so
tst-audit3-ENV = LD_AUDIT=$(objpfx)tst-auditmod3b.so
-$(objpfx)tst-audit4: $(objpfx)tst-auditmod4a.so
+$(objpfx)tst-audit4: $(objpfx)tst-audit4-aux.o $(objpfx)tst-auditmod4a.so
$(objpfx)tst-audit4.out: $(objpfx)tst-auditmod4b.so
tst-audit4-ENV = LD_AUDIT=$(objpfx)tst-auditmod4b.so
@@ -77,12 +77,12 @@ $(objpfx)tst-audit7: $(objpfx)tst-auditm
$(objpfx)tst-audit7.out: $(objpfx)tst-auditmod7b.so
tst-audit7-ENV = LD_AUDIT=$(objpfx)tst-auditmod7b.so
-$(objpfx)tst-audit10: $(objpfx)tst-auditmod10a.so
+$(objpfx)tst-audit10: $(objpfx)tst-audit10-aux.o $(objpfx)tst-auditmod10a.so
$(objpfx)tst-audit10.out: $(objpfx)tst-auditmod10b.so
tst-audit10-ENV = LD_AUDIT=$(objpfx)tst-auditmod10b.so
AVX-CFLAGS=-mavx -mno-vzeroupper
-CFLAGS-tst-audit4.c += $(AVX-CFLAGS)
+CFLAGS-tst-audit4-aux.c += $(AVX-CFLAGS)
CFLAGS-tst-auditmod4a.c += $(AVX-CFLAGS)
CFLAGS-tst-auditmod4b.c += $(AVX-CFLAGS)
CFLAGS-tst-auditmod6b.c += $(AVX-CFLAGS)
@@ -90,7 +90,7 @@ CFLAGS-tst-auditmod6c.c += $(AVX-CFLAGS)
CFLAGS-tst-auditmod7b.c += $(AVX-CFLAGS)
ifeq (yes,$(config-cflags-avx512))
AVX512-CFLAGS = -mavx512f
-CFLAGS-tst-audit10.c += $(AVX512-CFLAGS)
+CFLAGS-tst-audit10-aux.c += $(AVX512-CFLAGS)
CFLAGS-tst-auditmod10a.c += $(AVX512-CFLAGS)
CFLAGS-tst-auditmod10b.c += $(AVX512-CFLAGS)
endif
Index: glibc-2.23/sysdeps/x86_64/tst-audit10-aux.c
===================================================================
--- /dev/null
+++ glibc-2.23/sysdeps/x86_64/tst-audit10-aux.c
@@ -0,0 +1,41 @@
+/* Test case for preserved AVX512 registers in dynamic linker, -mavx512f part.
+ Copyright (C) 2012-2016 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 <immintrin.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i,
+ __m512i, __m512i, __m512i, __m512i);
+
+int
+tst_audit10_aux (void)
+{
+#ifdef __AVX512F__
+ __m512i zmm = _mm512_setzero_si512 ();
+ __m512i ret = audit_test (zmm, zmm, zmm, zmm, zmm, zmm, zmm, zmm);
+
+ zmm = _mm512_set1_epi64 (0x12349876);
+
+ if (memcmp (&zmm, &ret, sizeof (ret)))
+ abort ();
+ return 0;
+#else /* __AVX512F__ */
+ return 77;
+#endif /* __AVX512F__ */
+}
Index: glibc-2.23/sysdeps/x86_64/tst-audit10.c
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/tst-audit10.c
+++ glibc-2.23/sysdeps/x86_64/tst-audit10.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 2012-2016 Free Software Foundation, Inc.
+/* Test case for preserved AVX512 registers in dynamic linker.
+ Copyright (C) 2012-2016 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
@@ -15,13 +16,9 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-/* Test case for x86-64 preserved registers in dynamic linker. */
-
-#ifdef __AVX512F__
-#include <stdlib.h>
-#include <string.h>
#include <cpuid.h>
-#include <immintrin.h>
+
+int tst_audit10_aux (void);
static int
avx512_enabled (void)
@@ -42,32 +39,15 @@ avx512_enabled (void)
return (eax & 0xe6) == 0xe6;
}
-
-extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i,
- __m512i, __m512i, __m512i, __m512i);
static int
do_test (void)
{
/* Run AVX512 test only if AVX512 is supported. */
if (avx512_enabled ())
- {
- __m512i zmm = _mm512_setzero_si512 ();
- __m512i ret = audit_test (zmm, zmm, zmm, zmm, zmm, zmm, zmm, zmm);
-
- zmm = _mm512_set1_epi64 (0x12349876);
-
- if (memcmp (&zmm, &ret, sizeof (ret)))
- abort ();
- }
- return 0;
-}
-#else
-static int
-do_test (void)
-{
- return 0;
+ return tst_audit10_aux ();
+ else
+ return 77;
}
-#endif
#define TEST_FUNCTION do_test ()
#include "../../test-skeleton.c"
Index: glibc-2.23/sysdeps/x86_64/tst-audit4-aux.c
===================================================================
--- /dev/null
+++ glibc-2.23/sysdeps/x86_64/tst-audit4-aux.c
@@ -0,0 +1,39 @@
+/* Test case for preserved AVX registers in dynamic linker, -mavx part.
+ Copyright (C) 2009-2016 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 <immintrin.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i,
+ __m256i, __m256i, __m256i, __m256i);
+
+int
+tst_audit4_aux (void)
+{
+#ifdef __AVX__
+ __m256i ymm = _mm256_setzero_si256 ();
+ __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm);
+ ymm = _mm256_set1_epi32 (0x12349876);
+ if (memcmp (&ymm, &ret, sizeof (ret)))
+ abort ();
+ return 0;
+#else /* __AVX__ */
+ return 77;
+#endif /* __AVX__ */
+}
Index: glibc-2.23/sysdeps/x86_64/tst-audit4.c
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/tst-audit4.c
+++ glibc-2.23/sysdeps/x86_64/tst-audit4.c
@@ -1,11 +1,24 @@
-/* Test case for x86-64 preserved registers in dynamic linker. */
+/* Test case for preserved AVX registers in dynamic linker.
+ Copyright (C) 2009-2016 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/>. */
-#ifdef __AVX__
-#include <stdlib.h>
-#include <string.h>
#include <cpuid.h>
-#include <immintrin.h>
+int tst_audit4_aux (void);
static int
avx_enabled (void)
@@ -22,31 +35,15 @@ avx_enabled (void)
return (eax & 6) == 6;
}
-
-extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i,
- __m256i, __m256i, __m256i, __m256i);
static int
do_test (void)
{
/* Run AVX test only if AVX is supported. */
if (avx_enabled ())
- {
- __m256i ymm = _mm256_setzero_si256 ();
- __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm);
-
- ymm = _mm256_set1_epi32 (0x12349876);
- if (memcmp (&ymm, &ret, sizeof (ret)))
- abort ();
- }
- return 0;
-}
-#else
-static int
-do_test (void)
-{
- return 0;
+ return tst_audit4_aux ();
+ else
+ return 77;
}
-#endif
#define TEST_FUNCTION do_test ()
#include "../../test-skeleton.c"

@ -1,39 +0,0 @@
2016-03-08 Roland McGrath <roland@hack.frob.com>
* sysdeps/x86_64/tst-audit10.c: #include <cpu-features.h>.
* sysdeps/x86_64/tst-audit10-aux.c: Move audit_test extern decl ...
(tst_audit10_aux) [__AVX512F__]: ... here.
Index: glibc-2.23/sysdeps/x86_64/tst-audit10-aux.c
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/tst-audit10-aux.c
+++ glibc-2.23/sysdeps/x86_64/tst-audit10-aux.c
@@ -20,13 +20,13 @@
#include <stdlib.h>
#include <string.h>
-extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i,
- __m512i, __m512i, __m512i, __m512i);
-
int
tst_audit10_aux (void)
{
#ifdef __AVX512F__
+ extern __m512i audit_test (__m512i, __m512i, __m512i, __m512i,
+ __m512i, __m512i, __m512i, __m512i);
+
__m512i zmm = _mm512_setzero_si512 ();
__m512i ret = audit_test (zmm, zmm, zmm, zmm, zmm, zmm, zmm, zmm);
Index: glibc-2.23/sysdeps/x86_64/tst-audit10.c
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/tst-audit10.c
+++ glibc-2.23/sysdeps/x86_64/tst-audit10.c
@@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <cpuid.h>
+#include <cpu-features.h>
int tst_audit10_aux (void);

@ -1,35 +0,0 @@
2016-03-25 Florian Weimer <fweimer@redhat.com>
[BZ# 19860]
* sysdeps/x86_64/tst-audit10.c (avx512_enabled): Always return
zero if the compiler does not provide the AVX512F bit.
Index: glibc-2.23/sysdeps/x86_64/tst-audit10.c
===================================================================
--- glibc-2.23.orig/sysdeps/x86_64/tst-audit10.c
+++ glibc-2.23/sysdeps/x86_64/tst-audit10.c
@@ -17,13 +17,13 @@
<http://www.gnu.org/licenses/>. */
#include <cpuid.h>
-#include <cpu-features.h>
int tst_audit10_aux (void);
static int
avx512_enabled (void)
{
+#ifdef bit_AVX512F
unsigned int eax, ebx, ecx, edx;
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
@@ -38,6 +38,9 @@ avx512_enabled (void)
/* Verify that ZMM, YMM and XMM states are enabled. */
return (eax & 0xe6) == 0xe6;
+#else
+ return 0;
+#endif
}
static int

@ -1,465 +0,0 @@
2016-04-04 Florian Weimer <fweimer@redhat.com>
[BZ #19633]
Use specified locale for number formatting in strfmon_l.
* locale/localeinfo.h (__nl_lookup, _nl_lookup_wstr)
(__nl_lookup_word): New inline functions.
* include/printf.h (__print_fp_l): Declare.
* stdio-common/printf_fp.c (___printf_fp_l): Renamed from
___printf_fp. Add locale argument. Replace _NL_CURRENT with
_nl_lookup and _NL_CURRENT_WORD with _nl_lookup_word.
(___printf_fp): New function.
* stdlib/strfmon_l.c (__printf_fp): Remove declaration.
(__vstrfmon_l): Call __printf_fp_l instead of printf_fp.
* stdlib/tst-strfmon_l.c (do_test): New test.
* stdlib/Makefile (tests): Add kt.
(LOCALES): Build additional locales.
(tst-strfmon_l.out): Require locales.
Index: glibc-2.23/include/printf.h
===================================================================
--- glibc-2.23.orig/include/printf.h
+++ glibc-2.23/include/printf.h
@@ -1,6 +1,7 @@
#ifndef _PRINTF_H
#include <stdio-common/printf.h>
+#include <xlocale.h>
/* Now define the internal interfaces. */
extern int __printf_fphex (FILE *, const struct printf_info *,
@@ -8,5 +9,8 @@ extern int __printf_fphex (FILE *, const
extern int __printf_fp (FILE *, const struct printf_info *,
const void *const *);
libc_hidden_proto (__printf_fp)
+extern int __printf_fp_l (FILE *, locale_t, const struct printf_info *,
+ const void *const *);
+libc_hidden_proto (__printf_fp_l)
#endif
Index: glibc-2.23/locale/localeinfo.h
===================================================================
--- glibc-2.23.orig/locale/localeinfo.h
+++ glibc-2.23/locale/localeinfo.h
@@ -299,6 +299,27 @@ extern __thread struct __locale_data *co
#endif
+/* Extract CATEGORY locale's string for ITEM. */
+static inline const char *
+_nl_lookup (locale_t l, int category, int item)
+{
+ return l->__locales[category]->values[_NL_ITEM_INDEX (item)].string;
+}
+
+/* Extract CATEGORY locale's wide string for ITEM. */
+static inline const wchar_t *
+_nl_lookup_wstr (locale_t l, int category, int item)
+{
+ return (wchar_t *) l->__locales[category]
+ ->values[_NL_ITEM_INDEX (item)].wstr;
+}
+
+/* Extract the CATEGORY locale's word for ITEM. */
+static inline uint32_t
+_nl_lookup_word (locale_t l, int category, int item)
+{
+ return l->__locales[category]->values[_NL_ITEM_INDEX (item)].word;
+}
/* Default search path if no LOCPATH environment variable. */
extern const char _nl_default_locale_path[] attribute_hidden;
Index: glibc-2.23/stdio-common/printf_fp.c
===================================================================
--- glibc-2.23.orig/stdio-common/printf_fp.c
+++ glibc-2.23/stdio-common/printf_fp.c
@@ -209,9 +209,9 @@ hack_digit (struct hack_digit_param *p)
}
int
-___printf_fp (FILE *fp,
- const struct printf_info *info,
- const void *const *args)
+___printf_fp_l (FILE *fp, locale_t loc,
+ const struct printf_info *info,
+ const void *const *args)
{
/* The floating-point value to output. */
union
@@ -263,18 +263,19 @@ ___printf_fp (FILE *fp,
/* Figure out the decimal point character. */
if (info->extra == 0)
{
- decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
- decimalwc = _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_DECIMAL_POINT_WC);
+ decimal = _nl_lookup (loc, LC_NUMERIC, DECIMAL_POINT);
+ decimalwc = _nl_lookup_word
+ (loc, LC_NUMERIC, _NL_NUMERIC_DECIMAL_POINT_WC);
}
else
{
- decimal = _NL_CURRENT (LC_MONETARY, MON_DECIMAL_POINT);
+ decimal = _nl_lookup (loc, LC_MONETARY, MON_DECIMAL_POINT);
if (*decimal == '\0')
- decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
- decimalwc = _NL_CURRENT_WORD (LC_MONETARY,
+ decimal = _nl_lookup (loc, LC_NUMERIC, DECIMAL_POINT);
+ decimalwc = _nl_lookup_word (loc, LC_MONETARY,
_NL_MONETARY_DECIMAL_POINT_WC);
if (decimalwc == L'\0')
- decimalwc = _NL_CURRENT_WORD (LC_NUMERIC,
+ decimalwc = _nl_lookup_word (loc, LC_NUMERIC,
_NL_NUMERIC_DECIMAL_POINT_WC);
}
/* The decimal point character must not be zero. */
@@ -284,9 +285,9 @@ ___printf_fp (FILE *fp,
if (info->group)
{
if (info->extra == 0)
- grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
+ grouping = _nl_lookup (loc, LC_NUMERIC, GROUPING);
else
- grouping = _NL_CURRENT (LC_MONETARY, MON_GROUPING);
+ grouping = _nl_lookup (loc, LC_MONETARY, MON_GROUPING);
if (*grouping <= 0 || *grouping == CHAR_MAX)
grouping = NULL;
@@ -296,19 +297,20 @@ ___printf_fp (FILE *fp,
if (wide)
{
if (info->extra == 0)
- thousands_sepwc =
- _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_THOUSANDS_SEP_WC);
+ thousands_sepwc = _nl_lookup_word
+ (loc, LC_NUMERIC, _NL_NUMERIC_THOUSANDS_SEP_WC);
else
thousands_sepwc =
- _NL_CURRENT_WORD (LC_MONETARY,
+ _nl_lookup_word (loc, LC_MONETARY,
_NL_MONETARY_THOUSANDS_SEP_WC);
}
else
{
if (info->extra == 0)
- thousands_sep = _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
+ thousands_sep = _nl_lookup (loc, LC_NUMERIC, THOUSANDS_SEP);
else
- thousands_sep = _NL_CURRENT (LC_MONETARY, MON_THOUSANDS_SEP);
+ thousands_sep = _nl_lookup
+ (loc, LC_MONETARY, MON_THOUSANDS_SEP);
}
if ((wide && thousands_sepwc == L'\0')
@@ -1171,9 +1173,11 @@ ___printf_fp (FILE *fp,
size_t decimal_len;
size_t thousands_sep_len;
wchar_t *copywc;
- size_t factor = (info->i18n
- ? _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX)
- : 1);
+ size_t factor;
+ if (info->i18n)
+ factor = _nl_lookup_word (loc, LC_CTYPE, _NL_CTYPE_MB_CUR_MAX);
+ else
+ factor = 1;
decimal_len = strlen (decimal);
@@ -1244,8 +1248,18 @@ ___printf_fp (FILE *fp,
}
return done;
}
+ldbl_hidden_def (___printf_fp_l, __printf_fp_l)
+ldbl_strong_alias (___printf_fp_l, __printf_fp_l)
+
+int
+___printf_fp (FILE *fp, const struct printf_info *info,
+ const void *const *args)
+{
+ return ___printf_fp_l (fp, _NL_CURRENT_LOCALE, info, args);
+}
ldbl_hidden_def (___printf_fp, __printf_fp)
ldbl_strong_alias (___printf_fp, __printf_fp)
+
/* Return the number of extra grouping characters that will be inserted
into a number with INTDIG_MAX integer digits. */
Index: glibc-2.23/stdlib/Makefile
===================================================================
--- glibc-2.23.orig/stdlib/Makefile
+++ glibc-2.23/stdlib/Makefile
@@ -76,7 +76,7 @@ tests := tst-strtol tst-strtod testmb t
tst-secure-getenv tst-strtod-overflow tst-strtod-round \
tst-tininess tst-strtod-underflow tst-tls-atexit \
tst-setcontext3 tst-tls-atexit-nodelete \
- tst-strtol-locale tst-strtod-nan-locale
+ tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l
tests-static := tst-secure-getenv
modules-names = tst-tls-atexit-lib
@@ -126,7 +126,8 @@ include ../Rules
ifeq ($(run-built-tests),yes)
LOCALES := cs_CZ.UTF-8 de_DE.UTF-8 en_US.ISO-8859-1 tr_TR.UTF-8 \
- tr_TR.ISO-8859-9
+ tr_TR.ISO-8859-9 tg_TJ.UTF-8 te_IN.UTF-8 bn_IN.UTF-8 \
+ el_GR.UTF-8
include ../gen-locales.mk
$(objpfx)bug-strtod2.out: $(gen-locales)
@@ -137,6 +138,7 @@ $(objpfx)tst-strtod4.out: $(gen-locales)
$(objpfx)tst-strtod5.out: $(gen-locales)
$(objpfx)tst-strtol-locale.out: $(gen-locales)
$(objpfx)tst-strtod-nan-locale.out: $(gen-locales)
+$(objpfx)tst-strfmon_l.out: $(gen-locales)
endif
# Testdir has to be named stdlib and needs to be writable
Index: glibc-2.23/stdlib/strfmon_l.c
===================================================================
--- glibc-2.23.orig/stdlib/strfmon_l.c
+++ glibc-2.23/stdlib/strfmon_l.c
@@ -68,9 +68,6 @@
#define _NL_CURRENT(category, item) \
(current->values[_NL_ITEM_INDEX (item)].string)
-extern int __printf_fp (FILE *, const struct printf_info *,
- const void *const *);
-libc_hidden_proto (__printf_fp)
/* This function determines the number of digit groups in the output.
The definition is in printf_fp.c. */
extern unsigned int __guess_grouping (unsigned int intdig_max,
@@ -532,7 +529,7 @@ __vstrfmon_l (char *s, size_t maxsize, _
info.extra = 1; /* This means use values from LC_MONETARY. */
ptr = &fpnum;
- done = __printf_fp (&f._sbf._f, &info, &ptr);
+ done = __printf_fp_l (&f._sbf._f, loc, &info, &ptr);
if (done < 0)
return -1;
Index: glibc-2.23/stdlib/tst-strfmon_l.c
===================================================================
--- /dev/null
+++ glibc-2.23/stdlib/tst-strfmon_l.c
@@ -0,0 +1,220 @@
+/* Test locale dependence of strfmon_l.
+ Copyright (C) 2016 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 <stdbool.h>
+#include <stdio.h>
+#include <monetary.h>
+#include <string.h>
+#include <stdlib.h>
+#include <locale.h>
+
+static const char *const en_us_name = "en_US.ISO-8859-1";
+
+/* Locale value to be used by tests. */
+static locale_t loc;
+static const char *loc_name;
+
+/* Set the global locale to GLOBAL_NAME, and the locale referenced by
+ the loc variable above to LOCAL_NAME. */
+static void
+init_loc (const char *global_name, const char *local_name)
+{
+ loc = newlocale (LC_ALL_MASK, local_name, 0);
+ if (loc == 0)
+ {
+ printf ("error: newlocale (%s): %m\n", local_name);
+ abort ();
+ }
+ loc_name = local_name;
+
+ if (setlocale (LC_ALL, global_name) == NULL)
+ {
+ printf ("error: setlocale (%s): %m\n", global_name);
+ abort ();
+ }
+}
+
+/* Expected strings for a positive or negative value. */
+struct testcase
+{
+ const char *i; /* %i */
+ const char *n; /* %n */
+ const char *i_ungrouped; /* %^i */
+ const char *n_ungrouped; /* %^n */
+};
+
+/* Collected expected strings for both positive and negative
+ values. */
+struct testcase_pair
+{
+ struct testcase positive; /* 1234567.89 */
+ struct testcase negative; /* -1234567.89 */
+};
+
+static bool errors;
+
+/* Test one value using the locale loc. */
+static void
+test_one (const char *format, double value, const char *expected)
+{
+ static char actual[64];
+ int result = strfmon_l (actual, sizeof (actual), loc, format, value);
+ if (result < 0)
+ {
+ printf ("error: locale %s, format \"%s\", value %g: strfmon_l: %m\n",
+ loc_name, format, value);
+ errors = true;
+ }
+ else if (strcmp (actual, expected) != 0)
+ {
+ printf ("error: locale %s, format \"%s\", value %g: mismatch\n",
+ loc_name, format, value);
+ printf ("error: expected: \"%s\"\n", expected);
+ printf ("error: actual: \"%s\"\n", actual);
+ errors = true;
+ }
+}
+
+static void
+test_pair (const struct testcase_pair *pair)
+{
+ double positive = 1234567.89;
+ test_one ("%i", positive, pair->positive.i);
+ test_one ("%n", positive, pair->positive.n);
+ test_one ("%^i", positive, pair->positive.i_ungrouped);
+ test_one ("%^n", positive, pair->positive.n_ungrouped);
+ double negative = -1234567.89;
+ test_one ("%i", negative, pair->negative.i);
+ test_one ("%n", negative, pair->negative.n);
+ test_one ("%^i", negative, pair->negative.i_ungrouped);
+ test_one ("%^n", negative, pair->negative.n_ungrouped);
+}
+
+static const struct testcase_pair en_us =
+ {
+ {
+ "USD 1,234,567.89", "$1,234,567.89",
+ "USD 1234567.89", "$1234567.89"
+ },
+ {
+ "-USD 1,234,567.89", "-$1,234,567.89",
+ "-USD 1234567.89", "-$1234567.89"
+ }
+ };
+
+static void
+test_en_us (const char *other_name)
+{
+ init_loc (other_name, en_us_name);
+ test_pair (&en_us);
+ freelocale (loc);
+}
+
+struct locale_pair
+{
+ const char *locale_name;
+ struct testcase_pair pair;
+};
+
+static const struct locale_pair tests[] =
+ {
+ {
+ "de_DE.UTF-8",
+ {
+ {
+ "1.234.567,89 EUR", "1.234.567,89 \u20ac",
+ "1234567,89 EUR", "1234567,89 \u20ac"
+ },
+ {
+ "-1.234.567,89 EUR", "-1.234.567,89 \u20ac",
+ "-1234567,89 EUR", "-1234567,89 \u20ac"
+ }
+ },
+ },
+ {
+ "tg_TJ.UTF-8",
+ {
+ {
+ "1 234 567.89 TJS", "1 234 567.89 \u0440\u0443\u0431",
+ "1234567.89 TJS", "1234567.89 \u0440\u0443\u0431"
+ },
+ {
+ "-1 234 567.89 TJS", "-1 234 567.89 \u0440\u0443\u0431",
+ "-1234567.89 TJS", "-1234567.89 \u0440\u0443\u0431"
+ }
+ }
+ },
+ {
+ "te_IN.UTF-8",
+ {
+ {
+ "INR12,34,567.89", "\u20b912,34,567.89",
+ "INR1234567.89", "\u20b91234567.89"
+ },
+ {
+ "-INR12,34,567.89", "-\u20b912,34,567.89",
+ "-INR1234567.89", "-\u20b91234567.89"
+ }
+ }
+ },
+ {
+ "bn_IN.UTF-8",
+ {
+ {
+ "INR 12,345,67.89", "\u20b9 12,345,67.89",
+ "INR 1234567.89", "\u20b9 1234567.89"
+ },
+ {
+ "-INR 12,345,67.89", "-\u20b9 12,345,67.89",
+ "-INR 1234567.89", "-\u20b9 1234567.89"
+ }
+ }
+ },
+ {
+ "el_GR.UTF-8",
+ {
+ {
+ "1.234.567,89EUR", "1.234.567,89\u20ac",
+ "1234567,89EUR", "1234567,89\u20ac"
+ },
+ {
+ "-EUR1.234.567,89", "-\u20ac1.234.567,89",
+ "-EUR1234567,89", "-\u20ac1234567,89",
+ }
+ }
+ },
+ {}
+ };
+
+static int
+do_test (void)
+{
+ for (const struct locale_pair *test = tests;
+ test->locale_name != NULL; ++test)
+ {
+ init_loc (en_us_name, test->locale_name);
+ test_pair (&test->pair);
+ freelocale (loc);
+ test_en_us (test->locale_name);
+ }
+
+ return errors;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

@ -1,212 +0,0 @@
2016-04-29 Florian Weimer <fweimer@redhat.com>
glob: Simplify and document the interface for the GLOB_ALTDIRFUNC
callback function gl_readdir.
* posix/glob.c (NAMELEN, CONVERT_D_NAMLEN): Remove.
(CONVERT_DIRENT_DIRENT64): Use strcpy instead of memcpy.
(glob_in_dir): Remove len. Use strdup instead of malloc and
memcpy to copy the name.
* manual/pattern.texi (Calling Glob): Document requirements for
implementations of the gl_readdir callback function.
* manual/examples/mkdirent.c: New example.
* posix/bug-glob2.c (my_readdir): Set d_ino to 1 unconditionally,
per the manual guidance.
* posix/tst-gnuglob.c (my_readdir): Likewise.
Index: glibc-2.23/manual/examples/mkdirent.c
===================================================================
--- /dev/null
+++ glibc-2.23/manual/examples/mkdirent.c
@@ -0,0 +1,42 @@
+/* Example for creating a struct dirent object for use with glob.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <dirent.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct dirent *
+mkdirent (const char *name)
+{
+ size_t dirent_size = offsetof (struct dirent, d_name) + 1;
+ size_t name_length = strlen (name);
+ size_t total_size = dirent_size + name_length;
+ if (total_size < dirent_size)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ struct dirent *result = malloc (total_size);
+ if (result == NULL)
+ return NULL;
+ result->d_type = DT_UNKNOWN;
+ result->d_ino = 1; /* Do not skip this entry. */
+ memcpy (result->d_name, name, name_length + 1);
+ return result;
+}
Index: glibc-2.23/manual/pattern.texi
===================================================================
--- glibc-2.23.orig/manual/pattern.texi
+++ glibc-2.23/manual/pattern.texi
@@ -237,7 +237,44 @@ function used to read the contents of a
@code{GLOB_ALTDIRFUNC} bit is set in the flag parameter. The type of
this field is @w{@code{struct dirent *(*) (void *)}}.
-This is a GNU extension.
+An implementation of @code{gl_readdir} needs to initialize the following
+members of the @code{struct dirent} object:
+
+@table @code
+@item d_type
+This member should be set to the file type of the entry if it is known.
+Otherwise, the value @code{DT_UNKNOWN} can be used. The @code{glob}
+function may use the specified file type to avoid callbacks in cases
+where the file type indicates that the data is not required.
+
+@item d_ino
+This member needs to be non-zero, otherwise @code{glob} may skip the
+current entry and call the @code{gl_readdir} callback function again to
+retrieve another entry.
+
+@item d_name
+This member must be set to the name of the entry. It must be
+null-terminated.
+@end table
+
+The example below shows how to allocate a @code{struct dirent} object
+containing a given name.
+
+@smallexample
+@include mkdirent.c.texi
+@end smallexample
+
+The @code{glob} function reads the @code{struct dirent} members listed
+above and makes a copy of the file name in the @code{d_name} member
+immediately after the @code{gl_readdir} callback function returns.
+Future invocations of any of the callback functions may dealloacte or
+reuse the buffer. It is the responsibility of the caller of the
+@code{glob} function to allocate and deallocate the buffer, around the
+call to @code{glob} or using the callback functions. For example, an
+application could allocate the buffer in the @code{gl_readdir} callback
+function, and deallocate it in the @code{gl_closedir} callback function.
+
+The @code{gl_readdir} member is a GNU extension.
@item gl_opendir
The address of an alternative implementation of the @code{opendir}
Index: glibc-2.23/posix/bug-glob2.c
===================================================================
--- glibc-2.23.orig/posix/bug-glob2.c
+++ glibc-2.23/posix/bug-glob2.c
@@ -193,7 +193,7 @@ my_readdir (void *gdir)
return NULL;
}
- dir->d.d_ino = dir->idx;
+ dir->d.d_ino = 1; /* glob should not skip this entry. */
#ifdef _DIRENT_HAVE_D_TYPE
dir->d.d_type = filesystem[dir->idx].type;
Index: glibc-2.23/posix/glob.c
===================================================================
--- glibc-2.23.orig/posix/glob.c
+++ glibc-2.23/posix/glob.c
@@ -57,10 +57,8 @@
#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
# include <dirent.h>
-# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
-# define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
@@ -76,12 +74,6 @@
#endif
-/* In GNU systems, <dirent.h> defines this macro for us. */
-#ifdef _D_NAMLEN
-# undef NAMLEN
-# define NAMLEN(d) _D_NAMLEN(d)
-#endif
-
/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
if the `d_type' member for `struct dirent' is available.
HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
@@ -105,12 +97,6 @@
/* If the system has the `struct dirent64' type we use it internally. */
#if defined _LIBC && !defined COMPILE_GLOB64
-# if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
-# define CONVERT_D_NAMLEN(d64, d32)
-# else
-# define CONVERT_D_NAMLEN(d64, d32) \
- (d64)->d_namlen = (d32)->d_namlen;
-# endif
# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
# define CONVERT_D_INO(d64, d32)
@@ -127,8 +113,7 @@
# endif
# define CONVERT_DIRENT_DIRENT64(d64, d32) \
- memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \
- CONVERT_D_NAMLEN (d64, d32) \
+ strcpy ((d64)->d_name, (d32)->d_name); \
CONVERT_D_INO (d64, d32) \
CONVERT_D_TYPE (d64, d32)
#endif
@@ -1554,7 +1539,6 @@ glob_in_dir (const char *pattern, const
while (1)
{
const char *name;
- size_t len;
#if defined _LIBC && !defined COMPILE_GLOB64
struct dirent64 *d;
union
@@ -1622,12 +1606,10 @@ glob_in_dir (const char *pattern, const
names = newnames;
cur = 0;
}
- len = NAMLEN (d);
- names->name[cur] = (char *) malloc (len + 1);
+ names->name[cur] = strdup (d->d_name);
if (names->name[cur] == NULL)
goto memory_error;
- *((char *) mempcpy (names->name[cur++], name, len))
- = '\0';
+ ++cur;
++nfound;
}
}
Index: glibc-2.23/posix/tst-gnuglob.c
===================================================================
--- glibc-2.23.orig/posix/tst-gnuglob.c
+++ glibc-2.23/posix/tst-gnuglob.c
@@ -211,7 +211,7 @@ my_readdir (void *gdir)
return NULL;
}
- dir->d.d_ino = dir->idx;
+ dir->d.d_ino = 1; /* glob should not skip this entry. */
#ifdef _DIRENT_HAVE_D_TYPE
dir->d.d_type = filesystem[dir->idx].type;

@ -1,396 +0,0 @@
2016-05-04 Florian Weimer <fweimer@redhat.com>
[BZ #19779]
CVE-2016-1234
Avoid copying names of directory entries.
* posix/glob.c (DIRENT_MUST_BE, DIRENT_MIGHT_BE_SYMLINK)
(DIRENT_MIGHT_BE_DIR, CONVERT_D_INO, CONVERT_D_TYPE)
(CONVERT_DIRENT_DIRENT64, REAL_DIR_ENTRY): Remove macros.
(struct readdir_result): New type.
(D_TYPE_TO_RESULT, D_INO_TO_RESULT, READDIR_RESULT_INITIALIZER)
(GL_READDIR): New macros.
(readdir_result_might_be_symlink, readdir_result_might_be_dir)
(convert_dirent, convert_dirent64): New functions.
(glob_in_dir): Use struct readdir_result. Call convert_dirent or
convert_dirent64. Adjust references to the readdir result.
* sysdeps/unix/sysv/linux/i386/glob64.c:
(convert_dirent, GL_READDIR): Redefine for second file inclusion.
* posix/bug-glob2.c (LONG_NAME): Define.
(filesystem): Add LONG_NAME.
(my_DIR): Increase the size of room_for_dirent.
Index: glibc-2.23/NEWS
===================================================================
--- glibc-2.23.orig/NEWS
+++ glibc-2.23/NEWS
@@ -14,6 +14,10 @@ Security related changes:
overflow (stack exhaustion) and a crash if getnetbyname is invoked
on a very long name. (CVE-2016-3075)
+* The glob function suffered from a stack-based buffer overflow when it was
+ called with the GLOB_ALTDIRFUNC flag and encountered a long file name.
+ Reported by Alexander Cherepanov. (CVE-2016-1234)
+
The following bugs are resolved with this release:
[19679] gcc-4.9.3 C++ exception handling broken due to unaligned stack
Index: glibc-2.23/posix/bug-glob2.c
===================================================================
--- glibc-2.23.orig/posix/bug-glob2.c
+++ glibc-2.23/posix/bug-glob2.c
@@ -40,6 +40,17 @@
# define PRINTF(fmt, args...)
#endif
+#define LONG_NAME \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
static struct
{
@@ -58,6 +69,7 @@ static struct
{ ".", 3, DT_DIR, 0755 },
{ "..", 3, DT_DIR, 0755 },
{ "a", 3, DT_REG, 0644 },
+ { LONG_NAME, 3, DT_REG, 0644 },
{ "unreadable", 2, DT_DIR, 0111 },
{ ".", 3, DT_DIR, 0111 },
{ "..", 3, DT_DIR, 0755 },
@@ -75,7 +87,7 @@ typedef struct
int level;
int idx;
struct dirent d;
- char room_for_dirent[NAME_MAX];
+ char room_for_dirent[sizeof (LONG_NAME)];
} my_DIR;
Index: glibc-2.23/posix/glob.c
===================================================================
--- glibc-2.23.orig/posix/glob.c
+++ glibc-2.23/posix/glob.c
@@ -24,7 +24,9 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <stdbool.h>
#include <stddef.h>
+#include <stdint.h>
/* Outcomment the following line for production quality code. */
/* #define NDEBUG 1 */
@@ -73,69 +75,8 @@
# endif /* HAVE_VMSDIR_H */
#endif
-
-/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
- if the `d_type' member for `struct dirent' is available.
- HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
-#if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
-/* True if the directory entry D must be of type T. */
-# define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
-
-/* True if the directory entry D might be a symbolic link. */
-# define DIRENT_MIGHT_BE_SYMLINK(d) \
- ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
-
-/* True if the directory entry D might be a directory. */
-# define DIRENT_MIGHT_BE_DIR(d) \
- ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
-
-#else /* !HAVE_D_TYPE */
-# define DIRENT_MUST_BE(d, t) false
-# define DIRENT_MIGHT_BE_SYMLINK(d) true
-# define DIRENT_MIGHT_BE_DIR(d) true
-#endif /* HAVE_D_TYPE */
-
-/* If the system has the `struct dirent64' type we use it internally. */
-#if defined _LIBC && !defined COMPILE_GLOB64
-
-# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
-# define CONVERT_D_INO(d64, d32)
-# else
-# define CONVERT_D_INO(d64, d32) \
- (d64)->d_ino = (d32)->d_ino;
-# endif
-
-# ifdef _DIRENT_HAVE_D_TYPE
-# define CONVERT_D_TYPE(d64, d32) \
- (d64)->d_type = (d32)->d_type;
-# else
-# define CONVERT_D_TYPE(d64, d32)
-# endif
-
-# define CONVERT_DIRENT_DIRENT64(d64, d32) \
- strcpy ((d64)->d_name, (d32)->d_name); \
- CONVERT_D_INO (d64, d32) \
- CONVERT_D_TYPE (d64, d32)
-#endif
-
-
-#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
-/* Posix does not require that the d_ino field be present, and some
- systems do not provide it. */
-# define REAL_DIR_ENTRY(dp) 1
-#else
-# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
-#endif /* POSIX */
-
#include <stdlib.h>
#include <string.h>
-
-/* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
-#include <limits.h>
-#ifndef NAME_MAX
-# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
-#endif
-
#include <alloca.h>
#ifdef _LIBC
@@ -180,8 +121,111 @@
static const char *next_brace_sub (const char *begin, int flags) __THROWNL;
+/* A representation of a directory entry which does not depend on the
+ layout of struct dirent, or the size of ino_t. */
+struct readdir_result
+{
+ const char *name;
+# if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
+ uint8_t type;
+# endif
+ bool skip_entry;
+};
+
+# if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
+/* Initializer based on the d_type member of struct dirent. */
+# define D_TYPE_TO_RESULT(source) (source)->d_type,
+
+/* True if the directory entry D might be a symbolic link. */
+static bool
+readdir_result_might_be_symlink (struct readdir_result d)
+{
+ return d.type == DT_UNKNOWN || d.type == DT_LNK;
+}
+
+/* True if the directory entry D might be a directory. */
+static bool
+readdir_result_might_be_dir (struct readdir_result d)
+{
+ return d.type == DT_DIR || readdir_result_might_be_symlink (d);
+}
+# else /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */
+# define D_TYPE_TO_RESULT(source)
+
+/* If we do not have type information, symbolic links and directories
+ are always a possibility. */
+
+static bool
+readdir_result_might_be_symlink (struct readdir_result d)
+{
+ return true;
+}
+
+static bool
+readdir_result_might_be_dir (struct readdir_result d)
+{
+ return true;
+}
+
+# endif /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */
+
+# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+/* Initializer for skip_entry. POSIX does not require that the d_ino
+ field be present, and some systems do not provide it. */
+# define D_INO_TO_RESULT(source) false,
+# else
+# define D_INO_TO_RESULT(source) (source)->d_ino == 0,
+# endif
+
+/* Construct an initializer for a struct readdir_result object from a
+ struct dirent *. No copy of the name is made. */
+#define READDIR_RESULT_INITIALIZER(source) \
+ { \
+ source->d_name, \
+ D_TYPE_TO_RESULT (source) \
+ D_INO_TO_RESULT (source) \
+ }
+
#endif /* !defined _LIBC || !defined GLOB_ONLY_P */
+/* Call gl_readdir on STREAM. This macro can be overridden to reduce
+ type safety if an old interface version needs to be supported. */
+#ifndef GL_READDIR
+# define GL_READDIR(pglob, stream) ((pglob)->gl_readdir (stream))
+#endif
+
+/* Extract name and type from directory entry. No copy of the name is
+ made. If SOURCE is NULL, result name is NULL. Keep in sync with
+ convert_dirent64 below. */
+static struct readdir_result
+convert_dirent (const struct dirent *source)
+{
+ if (source == NULL)
+ {
+ struct readdir_result result = { NULL, };
+ return result;
+ }
+ struct readdir_result result = READDIR_RESULT_INITIALIZER (source);
+ return result;
+}
+
+#ifndef COMPILE_GLOB64
+/* Like convert_dirent, but works on struct dirent64 instead. Keep in
+ sync with convert_dirent above. */
+static struct readdir_result
+convert_dirent64 (const struct dirent64 *source)
+{
+ if (source == NULL)
+ {
+ struct readdir_result result = { NULL, };
+ return result;
+ }
+ struct readdir_result result = READDIR_RESULT_INITIALIZER (source);
+ return result;
+}
+#endif
+
+
#ifndef attribute_hidden
# define attribute_hidden
#endif
@@ -1538,55 +1582,36 @@ glob_in_dir (const char *pattern, const
while (1)
{
- const char *name;
-#if defined _LIBC && !defined COMPILE_GLOB64
- struct dirent64 *d;
- union
- {
- struct dirent64 d64;
- char room [offsetof (struct dirent64, d_name[0])
- + NAME_MAX + 1];
- }
- d64buf;
-
- if (__glibc_unlikely (flags & GLOB_ALTDIRFUNC))
- {
- struct dirent *d32 = (*pglob->gl_readdir) (stream);
- if (d32 != NULL)
- {
- CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
- d = &d64buf.d64;
- }
- else
- d = NULL;
- }
- else
- d = __readdir64 (stream);
+ struct readdir_result d;
+ {
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ d = convert_dirent (GL_READDIR (pglob, stream));
+ else
+ {
+#ifdef COMPILE_GLOB64
+ d = convert_dirent (__readdir (stream));
#else
- struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
- ? ((struct dirent *)
- (*pglob->gl_readdir) (stream))
- : __readdir (stream));
+ d = convert_dirent64 (__readdir64 (stream));
#endif
- if (d == NULL)
+ }
+ }
+ if (d.name == NULL)
break;
- if (! REAL_DIR_ENTRY (d))
+ if (d.skip_entry)
continue;
/* If we shall match only directories use the information
provided by the dirent call if possible. */
- if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
+ if ((flags & GLOB_ONLYDIR) && !readdir_result_might_be_dir (d))
continue;
- name = d->d_name;
-
- if (fnmatch (pattern, name, fnm_flags) == 0)
+ if (fnmatch (pattern, d.name, fnm_flags) == 0)
{
/* If the file we found is a symlink we have to
make sure the target file exists. */
- if (!DIRENT_MIGHT_BE_SYMLINK (d)
- || link_exists_p (dfd, directory, dirlen, name, pglob,
- flags))
+ if (!readdir_result_might_be_symlink (d)
+ || link_exists_p (dfd, directory, dirlen, d.name,
+ pglob, flags))
{
if (cur == names->count)
{
@@ -1606,7 +1631,7 @@ glob_in_dir (const char *pattern, const
names = newnames;
cur = 0;
}
- names->name[cur] = strdup (d->d_name);
+ names->name[cur] = strdup (d.name);
if (names->name[cur] == NULL)
goto memory_error;
++cur;
Index: glibc-2.23/sysdeps/unix/sysv/linux/i386/glob64.c
===================================================================
--- glibc-2.23.orig/sysdeps/unix/sysv/linux/i386/glob64.c
+++ glibc-2.23/sysdeps/unix/sysv/linux/i386/glob64.c
@@ -1,3 +1,21 @@
+/* Two glob variants with 64-bit support, for dirent64 and __olddirent64.
+ Copyright (C) 1998-2016 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 <dirent.h>
#include <glob.h>
#include <sys/stat.h>
@@ -38,11 +56,15 @@ int __old_glob64 (const char *__pattern,
#undef dirent
#define dirent __old_dirent64
+#undef GL_READDIR
+# define GL_READDIR(pglob, stream) \
+ ((struct __old_dirent64 *) (pglob)->gl_readdir (stream))
#undef __readdir
#define __readdir(dirp) __old_readdir64 (dirp)
#undef glob
#define glob(pattern, flags, errfunc, pglob) \
__old_glob64 (pattern, flags, errfunc, pglob)
+#define convert_dirent __old_convert_dirent
#define glob_in_dir __old_glob_in_dir
#define GLOB_ATTRIBUTE attribute_compat_text_section

@ -1,132 +0,0 @@
2016-03-07 Florian Weimer <fweimer@redhat.com>
[BZ #19610]
* elf/ldconfig.c (opt_link): Update comment.
(options): Update help string for option -X.
(search_dir): Unlink stale symbolic link only if updating symbolic
links.
* elf/tst-ldconfig-X.sh: New file.
* elf/Makefile (tests-special): Add tst-ldconfig-X.out.
(tst-ldconfig-X.out): New rule to run tst-ldconfig-X.sh.
Index: glibc-2.23/elf/Makefile
===================================================================
--- glibc-2.23.orig/elf/Makefile
+++ glibc-2.23/elf/Makefile
@@ -163,7 +163,8 @@ endif
endif
ifeq ($(run-built-tests),yes)
tests-special += $(objpfx)tst-leaks1-mem.out \
- $(objpfx)tst-leaks1-static-mem.out $(objpfx)noload-mem.out
+ $(objpfx)tst-leaks1-static-mem.out $(objpfx)noload-mem.out \
+ $(objpfx)tst-ldconfig-X.out
endif
tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
@@ -1252,3 +1253,7 @@ $(objpfx)tst-prelink-cmp.out: tst-prelin
$(objpfx)tst-prelink-conflict.out
cmp $^ > $@; \
$(evaluate-test)
+
+$(objpfx)tst-ldconfig-X.out : tst-ldconfig-X.sh $(objpfx)ldconfig
+ $(SHELL) $< '$(common-objpfx)' '$(test-wrapper)' '$(test-wrapper-env)' > $@; \
+ $(evaluate-test)
Index: glibc-2.23/elf/ldconfig.c
===================================================================
--- glibc-2.23.orig/elf/ldconfig.c
+++ glibc-2.23/elf/ldconfig.c
@@ -100,7 +100,8 @@ int opt_format = 1;
/* Build cache. */
static int opt_build_cache = 1;
-/* Generate links. */
+/* Enable symbolic link processing. If set, create or update symbolic
+ links, and remove stale symbolic links. */
static int opt_link = 1;
/* Only process directories specified on the command line. */
@@ -141,7 +142,7 @@ static const struct argp_option options[
{ "print-cache", 'p', NULL, 0, N_("Print cache"), 0},
{ "verbose", 'v', NULL, 0, N_("Generate verbose messages"), 0},
{ NULL, 'N', NULL, 0, N_("Don't build cache"), 0},
- { NULL, 'X', NULL, 0, N_("Don't generate links"), 0},
+ { NULL, 'X', NULL, 0, N_("Don't update symbolic links"), 0},
{ NULL, 'r', N_("ROOT"), 0, N_("Change to and use ROOT as root directory"), 0},
{ NULL, 'C', N_("CACHE"), 0, N_("Use CACHE as cache file"), 0},
{ NULL, 'f', N_("CONF"), 0, N_("Use CONF as configuration file"), 0},
@@ -800,7 +801,7 @@ search_dir (const struct dir_entry *entr
error (0, errno, _("Cannot stat %s"), file_name);
/* Remove stale symlinks. */
- if (strstr (direntry->d_name, ".so."))
+ if (opt_link && strstr (direntry->d_name, ".so."))
unlink (real_file_name);
continue;
}
Index: glibc-2.23/elf/tst-ldconfig-X.sh
===================================================================
--- /dev/null
+++ glibc-2.23/elf/tst-ldconfig-X.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+# Test that ldconfig -X does not remove stale symbolic links.
+# Copyright (C) 2000-2016 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/>.
+
+set -ex
+
+common_objpfx=$1
+test_wrapper_env=$2
+run_program_env=$3
+
+testroot="${common_objpfx}elf/bug19610-test-directory"
+cleanup () {
+ rm -rf "$testroot"
+}
+trap cleanup 0
+
+rm -rf "$testroot"
+mkdir -p $testroot/lib $testroot/etc
+
+# Relative symbolic link target.
+ln -s libdoesnotexist.so.1.1 $testroot/lib/libdoesnotexist.so.1
+
+# Absolute symbolic link target.
+ln -s $testroot/opt/sw/lib/libdoesnotexist2.so.1.1 $testroot/lib/
+
+errors=0
+check_files () {
+ for name in libdoesnotexist.so.1 libdoesnotexist2.so.1.1 ; do
+ path="$testroot/lib/$name"
+ if test ! -h $path ; then
+ echo "error: missing file: $path"
+ errors=1
+ fi
+ done
+}
+
+check_files
+
+${test_wrapper_env} \
+${run_program_env} \
+${common_objpfx}elf/ldconfig -X -f /dev/null \
+ -C $testroot/etc/ld.so.cache \
+ $testroot/lib
+
+check_files
+
+exit $errors

@ -1,158 +0,0 @@
2016-03-31 Florian Weimer <fweimer@redhat.com>
[BZ #19509]
* elf/dl-lookup.c (_dl_lookup_symbol_x): Report error even if
skip_map != NULL.
* elf/tst-dlsym-error.c: New file.
* elf/Makefile (tests): Add tst-dlsym-error.
(tst-dlsym-error): Link against libdl.
Index: glibc-2.23/elf/Makefile
===================================================================
--- glibc-2.23.orig/elf/Makefile
+++ glibc-2.23/elf/Makefile
@@ -149,7 +149,7 @@ tests += loadtest restest1 preloadtest l
tst-nodelete) \
tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
- tst-nodelete2 tst-audit11 tst-audit12
+ tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error
# reldep9
ifeq ($(build-hardcoded-path-in-tests),yes)
tests += tst-dlopen-aout
@@ -1257,3 +1257,5 @@ $(objpfx)tst-prelink-cmp.out: tst-prelin
$(objpfx)tst-ldconfig-X.out : tst-ldconfig-X.sh $(objpfx)ldconfig
$(SHELL) $< '$(common-objpfx)' '$(test-wrapper)' '$(test-wrapper-env)' > $@; \
$(evaluate-test)
+
+$(objpfx)tst-dlsym-error: $(libdl)
Index: glibc-2.23/elf/dl-lookup.c
===================================================================
--- glibc-2.23.orig/elf/dl-lookup.c
+++ glibc-2.23/elf/dl-lookup.c
@@ -858,7 +858,6 @@ _dl_lookup_symbol_x (const char *undef_n
if (__glibc_unlikely (current_value.s == NULL))
{
if ((*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
- && skip_map == NULL
&& !(GLRO(dl_debug_mask) & DL_DEBUG_UNUSED))
{
/* We could find no value for a strong reference. */
Index: glibc-2.23/elf/tst-dlsym-error.c
===================================================================
--- /dev/null
+++ glibc-2.23/elf/tst-dlsym-error.c
@@ -0,0 +1,113 @@
+/* Test error reporting for dlsym, dlvsym failures.
+ Copyright (C) 2016 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 <gnu/lib-names.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Used to disambiguate symbol names. */
+static int counter;
+
+static void
+test_one (void *handle, const char *name, void *(func) (void *, const char *),
+ const char *suffix)
+{
+ ++counter;
+ char symbol[32];
+ snprintf (symbol, sizeof (symbol), "no_such_symbol_%d", counter);
+ char *expected_message;
+ if (asprintf (&expected_message, ": undefined symbol: %s%s",
+ symbol, suffix) < 0)
+ {
+ printf ("error: asprintf: %m\n");
+ abort ();
+ }
+
+ void *addr = func (handle, symbol);
+ if (addr != NULL)
+ {
+ printf ("error: %s: found symbol \"no_such_symbol\"\n", name);
+ abort ();
+ }
+ const char *message = dlerror ();
+ if (message == NULL)
+ {
+ printf ("error: %s: missing error message\n", name);
+ abort ();
+ }
+ const char *message_without_path = strchrnul (message, ':');
+ if (strcmp (message_without_path, expected_message) != 0)
+ {
+ printf ("error: %s: unexpected error message: %s\n", name, message);
+ abort ();
+ }
+ free (expected_message);
+
+ message = dlerror ();
+ if (message != NULL)
+ {
+ printf ("error: %s: unexpected error message: %s\n", name, message);
+ abort ();
+ }
+}
+
+static void
+test_handles (const char *name, void *(func) (void *, const char *),
+ const char *suffix)
+{
+ test_one (RTLD_DEFAULT, name, func, suffix);
+ test_one (RTLD_NEXT, name, func, suffix);
+
+ void *handle = dlopen (LIBC_SO, RTLD_LAZY);
+ if (handle == NULL)
+ {
+ printf ("error: cannot dlopen %s: %s\n", LIBC_SO, dlerror ());
+ abort ();
+ }
+ test_one (handle, name, func, suffix);
+ dlclose (handle);
+}
+
+static void *
+dlvsym_no_such_version (void *handle, const char *name)
+{
+ return dlvsym (handle, name, "NO_SUCH_VERSION");
+}
+
+static void *
+dlvsym_glibc_private (void *handle, const char *name)
+{
+ return dlvsym (handle, name, "GLIBC_PRIVATE");
+}
+
+static int
+do_test (void)
+{
+ test_handles ("dlsym", dlsym, "");
+ test_handles ("dlvsym", dlvsym_no_such_version,
+ ", version NO_SUCH_VERSION");
+ test_handles ("dlvsym", dlvsym_glibc_private,
+ ", version GLIBC_PRIVATE");
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

@ -1,16 +0,0 @@
2016-03-31 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* elf/tst-dlsym-error.c: Include <string.h> for strchrnul.
Index: glibc-2.23/elf/tst-dlsym-error.c
===================================================================
--- glibc-2.23.orig/elf/tst-dlsym-error.c
+++ glibc-2.23/elf/tst-dlsym-error.c
@@ -20,6 +20,7 @@
#include <gnu/lib-names.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
/* Used to disambiguate symbol names. */
static int counter;

@ -1,46 +0,0 @@
2016-02-19 Florian Weimer <fweimer@redhat.com>
[BZ #19581]
* locales/sr_ME (date_fmt): Remove newline.
* locales/sr_RS (date_fmt): Likewise.
* locales/sr_RS@latin (date_fmt): Likewise.
Index: glibc-2.23/localedata/locales/sr_ME
===================================================================
--- glibc-2.23.orig/localedata/locales/sr_ME
+++ glibc-2.23/localedata/locales/sr_ME
@@ -119,7 +119,7 @@ am_pm "";""
t_fmt_ampm "<U0025><U0054>"
date_fmt "<U0025><U0061><U002c><U0020><U0025><U0065><U002E><U0020>/
<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
-<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
+<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A>"
week 7;19971130;4
first_weekday 2
first_workday 2
Index: glibc-2.23/localedata/locales/sr_RS
===================================================================
--- glibc-2.23.orig/localedata/locales/sr_RS
+++ glibc-2.23/localedata/locales/sr_RS
@@ -300,7 +300,7 @@ am_pm "";""
t_fmt_ampm "<U0025><U0054>"
date_fmt "<U0025><U0061><U002C><U0020><U0025><U0065><U002E><U0020>/
<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
-<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
+<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A>"
week 7;19971130;4
first_weekday 2
first_workday 2
Index: glibc-2.23/localedata/locales/sr_RS@latin
===================================================================
--- glibc-2.23.orig/localedata/locales/sr_RS@latin
+++ glibc-2.23/localedata/locales/sr_RS@latin
@@ -120,7 +120,7 @@ am_pm "";""
t_fmt_ampm "<U0025><U0054>"
date_fmt "<U0025><U0061><U002c><U0020><U0025><U0065><U002E><U0020>/
<U0025><U0062><U0020><U0025><U0059><U002E><U0020><U0020><U0025><U0048>/
-<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A><U000A>"
+<U003A><U0025><U004D><U003A><U0025><U0053><U0020><U0025><U005A>"
week 7;19971130;4
first_weekday 2
first_workday 2

@ -1,150 +0,0 @@
Index: glibc-2.23/elf/Makefile
===================================================================
--- glibc-2.23.orig/elf/Makefile
+++ glibc-2.23/elf/Makefile
@@ -149,7 +149,7 @@ tests += loadtest restest1 preloadtest l
tst-nodelete) \
tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
- tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error
+ tst-nodelete2 tst-audit11 tst-audit12
# reldep9
ifeq ($(build-hardcoded-path-in-tests),yes)
tests += tst-dlopen-aout
@@ -1257,5 +1257,3 @@ $(objpfx)tst-prelink-cmp.out: tst-prelin
$(objpfx)tst-ldconfig-X.out : tst-ldconfig-X.sh $(objpfx)ldconfig
$(SHELL) $< '$(common-objpfx)' '$(test-wrapper)' '$(test-wrapper-env)' > $@; \
$(evaluate-test)
-
-$(objpfx)tst-dlsym-error: $(libdl)
Index: glibc-2.23/elf/dl-lookup.c
===================================================================
--- glibc-2.23.orig/elf/dl-lookup.c
+++ glibc-2.23/elf/dl-lookup.c
@@ -858,6 +858,7 @@ _dl_lookup_symbol_x (const char *undef_n
if (__glibc_unlikely (current_value.s == NULL))
{
if ((*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
+ && skip_map == NULL
&& !(GLRO(dl_debug_mask) & DL_DEBUG_UNUSED))
{
/* We could find no value for a strong reference. */
Index: glibc-2.23/elf/tst-dlsym-error.c
===================================================================
--- glibc-2.23.orig/elf/tst-dlsym-error.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Test error reporting for dlsym, dlvsym failures.
- Copyright (C) 2016 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 <gnu/lib-names.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Used to disambiguate symbol names. */
-static int counter;
-
-static void
-test_one (void *handle, const char *name, void *(func) (void *, const char *),
- const char *suffix)
-{
- ++counter;
- char symbol[32];
- snprintf (symbol, sizeof (symbol), "no_such_symbol_%d", counter);
- char *expected_message;
- if (asprintf (&expected_message, ": undefined symbol: %s%s",
- symbol, suffix) < 0)
- {
- printf ("error: asprintf: %m\n");
- abort ();
- }
-
- void *addr = func (handle, symbol);
- if (addr != NULL)
- {
- printf ("error: %s: found symbol \"no_such_symbol\"\n", name);
- abort ();
- }
- const char *message = dlerror ();
- if (message == NULL)
- {
- printf ("error: %s: missing error message\n", name);
- abort ();
- }
- const char *message_without_path = strchrnul (message, ':');
- if (strcmp (message_without_path, expected_message) != 0)
- {
- printf ("error: %s: unexpected error message: %s\n", name, message);
- abort ();
- }
- free (expected_message);
-
- message = dlerror ();
- if (message != NULL)
- {
- printf ("error: %s: unexpected error message: %s\n", name, message);
- abort ();
- }
-}
-
-static void
-test_handles (const char *name, void *(func) (void *, const char *),
- const char *suffix)
-{
- test_one (RTLD_DEFAULT, name, func, suffix);
- test_one (RTLD_NEXT, name, func, suffix);
-
- void *handle = dlopen (LIBC_SO, RTLD_LAZY);
- if (handle == NULL)
- {
- printf ("error: cannot dlopen %s: %s\n", LIBC_SO, dlerror ());
- abort ();
- }
- test_one (handle, name, func, suffix);
- dlclose (handle);
-}
-
-static void *
-dlvsym_no_such_version (void *handle, const char *name)
-{
- return dlvsym (handle, name, "NO_SUCH_VERSION");
-}
-
-static void *
-dlvsym_glibc_private (void *handle, const char *name)
-{
- return dlvsym (handle, name, "GLIBC_PRIVATE");
-}
-
-static int
-do_test (void)
-{
- test_handles ("dlsym", dlsym, "");
- test_handles ("dlvsym", dlvsym_no_such_version,
- ", version NO_SUCH_VERSION");
- test_handles ("dlvsym", dlvsym_glibc_private,
- ", version GLIBC_PRIVATE");
-
- return 0;
-}
-
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"

@ -1,175 +0,0 @@
2016-04-29 Florian Weimer <fweimer@redhat.com>
[BZ #20010]
CVE-2016-3706
* sysdeps/posix/getaddrinfo.c
(convert_hostent_to_gaih_addrtuple): New function.
(gethosts): Call convert_hostent_to_gaih_addrtuple.
(gaih_inet): Use convert_hostent_to_gaih_addrtuple to convert
AF_INET data.
Index: glibc-2.23/sysdeps/posix/getaddrinfo.c
===================================================================
--- glibc-2.23.orig/sysdeps/posix/getaddrinfo.c
+++ glibc-2.23/sysdeps/posix/getaddrinfo.c
@@ -168,9 +168,58 @@ gaih_inet_serv (const char *servicename,
return 0;
}
+/* Convert struct hostent to a list of struct gaih_addrtuple objects.
+ h_name is not copied, and the struct hostent object must not be
+ deallocated prematurely. *RESULT must be NULL or a pointer to an
+ object allocated using malloc, which is freed. */
+static bool
+convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
+ int family,
+ struct hostent *h,
+ struct gaih_addrtuple **result)
+{
+ free (*result);
+ *result = NULL;
+
+ /* Count the number of addresses in h->h_addr_list. */
+ size_t count = 0;
+ for (char **p = h->h_addr_list; *p != NULL; ++p)
+ ++count;
+
+ /* Report no data if no addresses are available, or if the incoming
+ address size is larger than what we can store. */
+ if (count == 0 || h->h_length > sizeof (((struct gaih_addrtuple) {}).addr))
+ return true;
+
+ struct gaih_addrtuple *array = calloc (count, sizeof (*array));
+ if (array == NULL)
+ return false;
+
+ for (size_t i = 0; i < count; ++i)
+ {
+ if (family == AF_INET && req->ai_family == AF_INET6)
+ {
+ /* Perform address mapping. */
+ array[i].family = AF_INET6;
+ memcpy(array[i].addr + 3, h->h_addr_list[i], sizeof (uint32_t));
+ array[i].addr[2] = htonl (0xffff);
+ }
+ else
+ {
+ array[i].family = family;
+ memcpy (array[i].addr, h->h_addr_list[i], h->h_length);
+ }
+ array[i].next = array + i + 1;
+ }
+ array[0].name = h->h_name;
+ array[count - 1].next = NULL;
+
+ *result = array;
+ return true;
+}
+
#define gethosts(_family, _type) \
{ \
- int i; \
int herrno; \
struct hostent th; \
struct hostent *h; \
@@ -219,36 +268,23 @@ gaih_inet_serv (const char *servicename,
} \
else if (h != NULL) \
{ \
- for (i = 0; h->h_addr_list[i]; i++) \
+ /* Make sure that addrmem can be freed. */ \
+ if (!malloc_addrmem) \
+ addrmem = NULL; \
+ if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \
{ \
- if (*pat == NULL) \
- { \
- *pat = __alloca (sizeof (struct gaih_addrtuple)); \
- (*pat)->scopeid = 0; \
- } \
- uint32_t *addr = (*pat)->addr; \
- (*pat)->next = NULL; \
- (*pat)->name = i == 0 ? strdupa (h->h_name) : NULL; \
- if (_family == AF_INET && req->ai_family == AF_INET6) \
- { \
- (*pat)->family = AF_INET6; \
- addr[3] = *(uint32_t *) h->h_addr_list[i]; \
- addr[2] = htonl (0xffff); \
- addr[1] = 0; \
- addr[0] = 0; \
- } \
- else \
- { \
- (*pat)->family = _family; \
- memcpy (addr, h->h_addr_list[i], sizeof(_type)); \
- } \
- pat = &((*pat)->next); \
+ _res.options |= old_res_options & RES_USE_INET6; \
+ result = -EAI_SYSTEM; \
+ goto free_and_return; \
} \
+ *pat = addrmem; \
+ /* The conversion uses malloc unconditionally. */ \
+ malloc_addrmem = true; \
\
if (localcanon != NULL && canon == NULL) \
canon = strdupa (localcanon); \
\
- if (_family == AF_INET6 && i > 0) \
+ if (_family == AF_INET6 && *pat != NULL) \
got_ipv6 = true; \
} \
}
@@ -612,44 +648,16 @@ gaih_inet (const char *name, const struc
{
if (h != NULL)
{
- int i;
- /* We found data, count the number of addresses. */
- for (i = 0; h->h_addr_list[i]; ++i)
- ;
- if (i > 0 && *pat != NULL)
- --i;
-
- if (__libc_use_alloca (alloca_used
- + i * sizeof (struct gaih_addrtuple)))
- addrmem = alloca_account (i * sizeof (struct gaih_addrtuple),
- alloca_used);
- else
+ /* We found data, convert it. */
+ if (!convert_hostent_to_gaih_addrtuple
+ (req, AF_INET, h, &addrmem))
{
- addrmem = malloc (i
- * sizeof (struct gaih_addrtuple));
- if (addrmem == NULL)
- {
- result = -EAI_MEMORY;
- goto free_and_return;
- }
- malloc_addrmem = true;
- }
-
- /* Now convert it into the list. */
- struct gaih_addrtuple *addrfree = addrmem;
- for (i = 0; h->h_addr_list[i]; ++i)
- {
- if (*pat == NULL)
- {
- *pat = addrfree++;
- (*pat)->scopeid = 0;
- }
- (*pat)->next = NULL;
- (*pat)->family = AF_INET;
- memcpy ((*pat)->addr, h->h_addr_list[i],
- h->h_length);
- pat = &((*pat)->next);
+ result = -EAI_MEMORY;
+ goto free_and_return;
}
+ *pat = addrmem;
+ /* The conversion uses malloc unconditionally. */
+ malloc_addrmem = true;
}
}
else

@ -1,41 +0,0 @@
2016-04-14 Stefan Liebler <stli@linux.vnet.ibm.com>
* stdio-common/printf_fp.c (__printf_fp_l):
Rename ___printf_fp_l to __printf_fp_l and
remove strong alias. Use libc_hidden_def instead
of ldbl_hidden_def macro.
Index: glibc-2.23/stdio-common/printf_fp.c
===================================================================
--- glibc-2.23.orig/stdio-common/printf_fp.c
+++ glibc-2.23/stdio-common/printf_fp.c
@@ -209,9 +209,9 @@ hack_digit (struct hack_digit_param *p)
}
int
-___printf_fp_l (FILE *fp, locale_t loc,
- const struct printf_info *info,
- const void *const *args)
+__printf_fp_l (FILE *fp, locale_t loc,
+ const struct printf_info *info,
+ const void *const *args)
{
/* The floating-point value to output. */
union
@@ -1248,14 +1248,13 @@ ___printf_fp_l (FILE *fp, locale_t loc,
}
return done;
}
-ldbl_hidden_def (___printf_fp_l, __printf_fp_l)
-ldbl_strong_alias (___printf_fp_l, __printf_fp_l)
+libc_hidden_def (__printf_fp_l)
int
___printf_fp (FILE *fp, const struct printf_info *info,
const void *const *args)
{
- return ___printf_fp_l (fp, _NL_CURRENT_LOCALE, info, args);
+ return __printf_fp_l (fp, _NL_CURRENT_LOCALE, info, args);
}
ldbl_hidden_def (___printf_fp, __printf_fp)
ldbl_strong_alias (___printf_fp, __printf_fp)

@ -1,6 +1,6 @@
<services>
<service name="obs_scm" mode="disabled">
<param name="versionformat">2.23.90.%cd.g%h</param>
<param name="versionformat">2.24.90.%cd.g%h</param>
<param name="url">git://sourceware.org/git/glibc</param>
<param name="scm">git</param>
</service>

@ -1,41 +0,0 @@
2016-05-23 Florian Weimer <fweimer@redhat.com>
CVE-2016-4429
[BZ #20112]
* sunrpc/clnt_udp.c (clntudp_call): Use malloc/free for the error
payload.
Index: glibc-2.23/sunrpc/clnt_udp.c
===================================================================
--- glibc-2.23.orig/sunrpc/clnt_udp.c
+++ glibc-2.23/sunrpc/clnt_udp.c
@@ -391,9 +391,15 @@ send_again:
struct sock_extended_err *e;
struct sockaddr_in err_addr;
struct iovec iov;
- char *cbuf = (char *) alloca (outlen + 256);
+ char *cbuf = malloc (outlen + 256);
int ret;
+ if (cbuf == NULL)
+ {
+ cu->cu_error.re_errno = errno;
+ return (cu->cu_error.re_status = RPC_CANTRECV);
+ }
+
iov.iov_base = cbuf + 256;
iov.iov_len = outlen;
msg.msg_name = (void *) &err_addr;
@@ -418,10 +424,12 @@ send_again:
cmsg = CMSG_NXTHDR (&msg, cmsg))
if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
{
+ free (cbuf);
e = (struct sock_extended_err *) CMSG_DATA(cmsg);
cu->cu_error.re_errno = e->ee_errno;
return (cu->cu_error.re_status = RPC_CANTRECV);
}
+ free (cbuf);
}
#endif
do

@ -29,16 +29,14 @@ Index: glibc-2.22/posix/Makefile
===================================================================
--- glibc-2.22.orig/posix/Makefile
+++ glibc-2.22/posix/Makefile
@@ -87,7 +87,8 @@ tests := tstgetopt testfnm runtests run
bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \
@@ -87,6 +87,7 @@ tests := tstgetopt testfnm runtests run
bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \
tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \
- tst-fnmatch3 bug-regex36 tst-getaddrinfo5
+ tst-fnmatch3 bug-regex36 tst-fnmatch4 tst-fnmatch5 \
+ tst-getaddrinfo5
tst-fnmatch3 bug-regex36 tst-getaddrinfo5 \
+ tst-fnmatch4 tst-fnmatch5 \
tst-posix_spawn-fd
xtests := bug-ga2
ifeq (yes,$(build-shared))
test-srcs := globtest
Index: glibc-2.22/posix/fnmatch.c
===================================================================
--- glibc-2.22.orig/posix/fnmatch.c

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:94efeb00e4603c8546209cefb3e1a50a5315c86fa9b078b6fad758e187ce13e9
size 13455260

@ -1,11 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQEcBAABAgAGBQJWxqmXAAoJECXvCkNsKkr/RAcIALXtkYD/eJ2DM+PBWv+/8UD6
iT2PAjaEhWWbSOu+u9DonCm9FjVjwXZSxOhtNt5x4l4SQfNVMnYc+/m6O30JKhrq
5spaVhL3v0aqxWaIqLapAlG3JuQFc2ItOW+W191MYSPANB366pUW0Z28//ccCifq
8q/hLiB6KXBdHkDX7odtYNkUQY5Ql+Ikkjcxt5tS8JOmBHX6ZJ9aACFeX7AuxxfE
l9DFnYLDzpNdxXJpOEZRprSDJizV84JiaN9XvuWjQHd1W2IeRYiwTxI0EmOO8cOD
ldHkzmkABkfOfswcYlp294IYXp3a+Rvn+wNHQFLwxdnIbeUZ/bd4t49UWDgBp1w=
=DBf0
-----END PGP SIGNATURE-----

3
glibc-2.24.tar.xz Normal file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:99d4a3e8efd144d71488e478f62587578c0f4e1fa0b4eed47ee3d4975ebeb5d3
size 13554048

17
glibc-2.24.tar.xz.sig Normal file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQIcBAABAgAGBQJXo1gPAAoJEBZ5K06iU0D4XQcP/3979bgeQZFIzdhhW9qDGf8y
3Zkij6WyytpSM0xm80bZCTD/4fkVYkiDOhgzfghrI0T3BQWitrQIUS4q94VtbeRk
i0QbPdYZ6xmnS56OcyxK+hdqr8XpGxRwfCZH+hCEbXjGblYiViXY54VSL2oWj6q9
Lolyi7LoZZg3nM7Hf7/yEqa38eKq0N6654MXaVZi9wz31YHweJHsI1rdUkYEpWxp
YIc6eCmhZpyj09Vk7s4qriNqBXmBLZbAcqOAL7hzc1H4aRVGLWdR6JQAClOQtQ6b
SrW4/MO4re5coz1EYWJLpzkDOnH/pkhA0gPeM7PDm+3t2DJa/6k01Jljxjswfujf
EflmRw/FRG08/QADaBrtmu8s79/07xJUjf/qLhg0YIJL2aBqaVNkxSZhE+aOIOXD
FrqX+fVhG4FX2YlQ5twDSU+7Uc370Gh7b8QIEOVvd5Tllg52i200aMB2wlVO+Rl5
oKN21dhbMzzQvJM9IxrBcWoymEE3kQXid+IBZxShg6JOEv9ZKpHKJGRtueJ1EM3R
V44rfJ5hVYn+U872lEgf2jf0w1A0aSMCVAX8N/8BO9NAZ9waM6IBgc3v1ng6uWdn
o4CdOHK6WP+GrbJ8Rbva8co16UHd9Ae1Vcwe5tDU7TxfFFkJ0RPVzVgTdl65+arX
VU1J1Kp1fBvbgwEacwxC
=yUZV
-----END PGP SIGNATURE-----

@ -2,16 +2,16 @@ Index: glibc-2.17.90/localedata/locales/zh_TW
===================================================================
--- glibc-2.17.90.orig/localedata/locales/zh_TW
+++ glibc-2.17.90/localedata/locales/zh_TW
@@ -1,7 +1,7 @@
comment_char %
escape_char /
%
@@ -8,7 +8,7 @@
% exempt you from the conditions of the license if your use would
% otherwise be governed by that license.
-% Chinese language locale for Taiwan R.O.C.
+% Chinese language locale for Taiwan
% charmap: BIG5-CP950
%
% Original Author:
@@ -17,7 +17,7 @@ escape_char /
@@ -24,7 +24,7 @@ escape_char /
% Reference: http://wwwold.dkuug.dk/JTC1/SC22/WG20/docs/n690.pdf
LC_IDENTIFICATION
@ -20,12 +20,3 @@ Index: glibc-2.17.90/localedata/locales/zh_TW
source ""
address ""
contact ""
@@ -25,7 +25,7 @@ email "bug-glibc-locales@gnu.org"
tel ""
fax ""
language "Chinese"
-territory "Taiwan R.O.C."
+territory "Taiwan"
revision "0.2"
date "2000-08-02"
%

@ -1,40 +0,0 @@
Fix for bnc #868622, slow memset for large block sizes.
diff --git a/sysdeps/x86_64/memset.S b/sysdeps/x86_64/memset.S
index db4fb84..9c42018 100644
--- a/sysdeps/x86_64/memset.S
+++ b/sysdeps/x86_64/memset.S
@@ -84,6 +84,9 @@ L(loop_start):
movdqu %xmm0, -48(%rdi,%rdx)
movdqu %xmm0, 48(%rdi)
movdqu %xmm0, -64(%rdi,%rdx)
+ mov __x86_shared_cache_size(%rip),%r9d # The largest cache size
+ cmp %r9,%rdx
+ ja L(nt_move)
addq %rdi, %rdx
andq $-64, %rdx
cmpq %rdx, %rcx
@@ -99,6 +102,23 @@ L(loop):
jne L(loop)
rep
ret
+L(nt_move):
+ addq %rdi, %rdx
+ andq $-64, %rdx
+ cmpq %rdx, %rcx
+ je L(return)
+ .p2align 4
+L(nt_loop):
+ movntdq %xmm0, (%rcx)
+ movntdq %xmm0, 16(%rcx)
+ movntdq %xmm0, 32(%rcx)
+ movntdq %xmm0, 48(%rcx)
+ addq $64, %rcx
+ cmpq %rcx, %rdx
+ jne L(nt_loop)
+ sfence
+ rep
+ ret
L(less_16_bytes):
movq %xmm0, %rcx
testb $24, %dl

@ -76,15 +76,14 @@ Index: glibc-2.17.90/resolv/res_libc.c
===================================================================
--- glibc-2.17.90.orig/resolv/res_libc.c
+++ glibc-2.17.90/resolv/res_libc.c
@@ -22,7 +22,7 @@
@@ -22,6 +22,7 @@
#include <arpa/nameser.h>
#include <resolv.h>
#include <libc-lock.h>
-
+#include <sys/stat.h>
/* The following bit is copied from res_data.c (where it is #ifdef'ed
out) since res_init() should go into libc.so but the rest of that
extern unsigned long long int __res_initstamp attribute_hidden;
/* We have atomic increment operations on 64-bit platforms. */
@@ -89,12 +89,34 @@ res_init(void) {
return (__res_vinit(&_res, 1));
}

@ -1,3 +1,99 @@
-------------------------------------------------------------------
Tue Aug 2 13:55:44 UTC 2016 - schwab@suse.de
- Update to glibc 2.24
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 3.2
* The pap_AN locale has been deleted
* The readdir_r and readdir64_r functions have been deprecated
* The type `union wait' has been removed
* A new NSS action is added to facilitate large distributed system
administration
* The deprecated __malloc_initialize_hook variable has been removed from
the API
* The long unused localedef --old-style option has been removed
* nextupl, nextup, nextupf, nextdownl, nextdown and nextdownf are added
to libm
* An unnecessary stack copy in _nss_dns_getnetbyname_r was removed
(CVE-2016-3075)
* Previously, getaddrinfo copied large amounts of address data to the
stack, even after the fix for CVE-2013-4458 has been applied,
potentially resulting in a stack overflow. getaddrinfo now uses a
heap allocation instead (CVE-2016-3706)
* The glob function suffered from a stack-based buffer overflow when it
was called with the GLOB_ALTDIRFUNC flag and encountered a long file
name (CVE-2016-1234)
* The Sun RPC UDP client could exhaust all available stack space when
flooded with crafted ICMP and UDP messages (CVE-2016-4429)
* The IPv6 name server management code in libresolv could result in a
memory leak for each thread which is created, performs a failing
naming lookup, and exits (CVE-2016-5417)
- startcontext-cantunwind.patch: mark __startcontext as .cantunwind
(bsc#974800, BZ #20435)
- Removed patches:
* 0001-Updated-translations-for-2.23.patch
* 0002-Regenerate-libc.pot-for-2.23.patch
* 0003-Regenerated-configure-scripts.patch
* 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
* 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
* 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
* 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
* 0008-Update-NEWS.patch
* 0009-sln-use-stat64.patch
* 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
* 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
* 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
* 0013-Mention-BZ-19762-in-NEWS.patch
* 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
* 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
* 0016-Fix-resource-leak-in-resolver-bug-19257.patch
* 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
* 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
* 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
* 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
* 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
* 0022-configure-fix-test-usage.patch
* 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
* 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
* 0025-getnameinfo-Do-not-preserve-errno.patch
* 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
* 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
* 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
* 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
* 0030-hesiod-Remove-RCS-keywords.patch
* 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
* 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
* 0033-malloc-Remove-NO_THREADS.patch
* 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
* 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
* 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
* 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
* 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
* 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
* 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
* 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
* 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
* 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
* 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
* 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
* 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
* 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
* 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
* 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
* 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
* 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
* 0052-Fix-tst-dlsym-error-build.patch
* 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
* 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
* 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
* 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
* clntudp-call-alloca.patch
* glibc-memset-nontemporal.diff
* nis-initgroups-status.patch
* nscd-gc-crash.patch
* robust-mutex-deadlock.patch
* strncat-avoid-array-bounds-warning.patch
-------------------------------------------------------------------
Wed Jun 29 12:50:21 UTC 2016 - schwab@suse.de

@ -105,10 +105,10 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
Version: 2.23
Version: 2.24
Release: 0
%if !%{build_snapshot}
%define git_id 10ed3a0ffbb4
%define git_id beb0f59498c3
%define libversion %version
%else
%define git_id %(echo %version | sed 's/.*\.g//')
@ -249,73 +249,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
# PATCH-FIX-UPSTREAM Patches from 2.23 branch
Patch1000: 0001-Updated-translations-for-2.23.patch
Patch1001: 0002-Regenerate-libc.pot-for-2.23.patch
Patch1002: 0003-Regenerated-configure-scripts.patch
Patch1003: 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
Patch1004: 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
Patch1005: 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
Patch1006: 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
Patch1007: 0008-Update-NEWS.patch
Patch1008: 0009-sln-use-stat64.patch
Patch1009: 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
Patch1010: 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
Patch1011: 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
Patch1012: 0013-Mention-BZ-19762-in-NEWS.patch
Patch1013: 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
Patch1014: 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
Patch1015: 0016-Fix-resource-leak-in-resolver-bug-19257.patch
Patch1016: 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
Patch1017: 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
Patch1018: 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
Patch1019: 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
Patch1020: 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
Patch1021: 0022-configure-fix-test-usage.patch
Patch1022: 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
Patch1023: 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
Patch1024: 0025-getnameinfo-Do-not-preserve-errno.patch
Patch1025: 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
Patch1026: 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
Patch1027: 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
Patch1028: 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
Patch1029: 0030-hesiod-Remove-RCS-keywords.patch
Patch1030: 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
Patch1031: 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
Patch1032: 0033-malloc-Remove-NO_THREADS.patch
Patch1033: 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
Patch1034: 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
Patch1035: 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
Patch1036: 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
Patch1037: 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
Patch1038: 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
Patch1039: 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
Patch1040: 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
Patch1041: 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
Patch1042: 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
Patch1043: 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
Patch1044: 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
Patch1045: 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
Patch1046: 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
Patch1047: 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
Patch1048: 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
Patch1049: 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
Patch1050: 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
Patch1051: 0052-Fix-tst-dlsym-error-build.patch
Patch1052: 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
Patch1053: 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
Patch1054: 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
Patch1055: 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
# PATCH-FIX-UPSTREAM sunrpc: Do not use alloca in clntudp_call (CVE-2016-4429, BZ #20112)
Patch1056: clntudp-call-alloca.patch
# PATCH-FIX-UPSTREAM Fix nscd assertion failure in gc (BZ #19755)
Patch1057: nscd-gc-crash.patch
# PATCH-FIX-UPSTREAM Return proper status from _nss_nis_initgroups_dyn (BZ #20262)
Patch1058: nis-initgroups-status.patch
# PATCH-FIX-UPSTREAM Fix generic __lll_robust_timedlock_wait to check for timeout (BZ #20263)
Patch1059: robust-mutex-deadlock.patch
# PATCH-FIX-UPSTREAM Avoid array-bounds warning for strncat on i586 (BZ #20260)
Patch1060: strncat-avoid-array-bounds-warning.patch
###
# Patches awaiting upstream approval
@ -326,8 +259,6 @@ Patch2000: fix-locking-in-_IO_cleanup.patch
Patch2001: ldd-system-interp.patch
# PATCH-FIX-UPSTREAM Don't close or flush stdio streams on abort (BZ #15436)
Patch2002: abort-no-flush.patch
# PATCH-FIX-UPSTREAM Speedup memset on x86-64 for large block sizes (BZ #16830)
Patch2003: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Fix fnmatch handling of collating elements (BZ #17396, BZ #16976)
Patch2004: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
@ -336,6 +267,8 @@ Patch2005: nss-files-long-lines-2.patch
Patch2006: iconv-reset-input-buffer.patch
# PATCH-FIX-UPSTREAM Reinitialize dl_load_write_lock on fork (BZ #19282)
Patch2008: reinitialize-dl_load_write_lock.patch
# PATCH-FIX-UPSTREAM ARM: mark __startcontext as .cantunwind (BZ #20435)
Patch2009: startcontext-cantunwind.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -538,76 +471,14 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
%patch1000 -p1
%patch1001 -p1
%patch1002 -p1
%patch1003 -p1
%patch1004 -p1
%patch1005 -p1
%patch1006 -p1
%patch1007 -p1
%patch1008 -p1
%patch1009 -p1
%patch1010 -p1
%patch1011 -p1
%patch1012 -p1
%patch1013 -p1
%patch1014 -p1
%patch1015 -p1
%patch1016 -p1
%patch1017 -p1
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch1022 -p1
%patch1023 -p1
%patch1024 -p1
%patch1025 -p1
%patch1026 -p1
%patch1027 -p1
%patch1028 -p1
%patch1029 -p1
%patch1030 -p1
%patch1031 -p1
%patch1032 -p1
%patch1033 -p1
%patch1034 -p1
%patch1035 -p1
%patch1036 -p1
%patch1037 -p1
%patch1038 -p1
%patch1039 -p1
%patch1040 -p1
%patch1041 -p1
%patch1042 -p1
%patch1043 -p1
%patch1044 -p1
%patch1045 -p1
%patch1046 -p1
%patch1047 -p1
%patch1048 -p1
%patch1049 -p1
%patch1050 -p1
%patch1051 -p1
%patch1052 -p1
%patch1053 -p1
%patch1054 -p1
%patch1055 -p1
%patch1056 -p1
%patch1057 -p1
%patch1058 -p1
%patch1059 -p1
%patch1060 -p1
%patch2000 -p1
%patch2001 -p1
%patch2002 -p1
%patch2003 -p1
%patch2004 -p1
%patch2005 -p1
%patch2006 -p1
%patch2008 -p1
%patch2009 -p1
%patch3000

@ -1,3 +1,99 @@
-------------------------------------------------------------------
Tue Aug 2 13:55:44 UTC 2016 - schwab@suse.de
- Update to glibc 2.24
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 3.2
* The pap_AN locale has been deleted
* The readdir_r and readdir64_r functions have been deprecated
* The type `union wait' has been removed
* A new NSS action is added to facilitate large distributed system
administration
* The deprecated __malloc_initialize_hook variable has been removed from
the API
* The long unused localedef --old-style option has been removed
* nextupl, nextup, nextupf, nextdownl, nextdown and nextdownf are added
to libm
* An unnecessary stack copy in _nss_dns_getnetbyname_r was removed
(CVE-2016-3075)
* Previously, getaddrinfo copied large amounts of address data to the
stack, even after the fix for CVE-2013-4458 has been applied,
potentially resulting in a stack overflow. getaddrinfo now uses a
heap allocation instead (CVE-2016-3706)
* The glob function suffered from a stack-based buffer overflow when it
was called with the GLOB_ALTDIRFUNC flag and encountered a long file
name (CVE-2016-1234)
* The Sun RPC UDP client could exhaust all available stack space when
flooded with crafted ICMP and UDP messages (CVE-2016-4429)
* The IPv6 name server management code in libresolv could result in a
memory leak for each thread which is created, performs a failing
naming lookup, and exits (CVE-2016-5417)
- startcontext-cantunwind.patch: mark __startcontext as .cantunwind
(bsc#974800, BZ #20435)
- Removed patches:
* 0001-Updated-translations-for-2.23.patch
* 0002-Regenerate-libc.pot-for-2.23.patch
* 0003-Regenerated-configure-scripts.patch
* 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
* 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
* 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
* 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
* 0008-Update-NEWS.patch
* 0009-sln-use-stat64.patch
* 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
* 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
* 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
* 0013-Mention-BZ-19762-in-NEWS.patch
* 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
* 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
* 0016-Fix-resource-leak-in-resolver-bug-19257.patch
* 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
* 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
* 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
* 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
* 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
* 0022-configure-fix-test-usage.patch
* 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
* 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
* 0025-getnameinfo-Do-not-preserve-errno.patch
* 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
* 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
* 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
* 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
* 0030-hesiod-Remove-RCS-keywords.patch
* 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
* 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
* 0033-malloc-Remove-NO_THREADS.patch
* 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
* 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
* 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
* 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
* 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
* 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
* 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
* 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
* 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
* 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
* 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
* 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
* 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
* 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
* 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
* 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
* 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
* 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
* 0052-Fix-tst-dlsym-error-build.patch
* 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
* 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
* 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
* 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
* clntudp-call-alloca.patch
* glibc-memset-nontemporal.diff
* nis-initgroups-status.patch
* nscd-gc-crash.patch
* robust-mutex-deadlock.patch
* strncat-avoid-array-bounds-warning.patch
-------------------------------------------------------------------
Wed Jun 29 12:50:21 UTC 2016 - schwab@suse.de

@ -104,10 +104,10 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
Version: 2.23
Version: 2.24
Release: 0
%if !%{build_snapshot}
%define git_id 10ed3a0ffbb4
%define git_id beb0f59498c3
%define libversion %version
%else
%define git_id %(echo %version | sed 's/.*\.g//')
@ -248,73 +248,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
# PATCH-FIX-UPSTREAM Patches from 2.23 branch
Patch1000: 0001-Updated-translations-for-2.23.patch
Patch1001: 0002-Regenerate-libc.pot-for-2.23.patch
Patch1002: 0003-Regenerated-configure-scripts.patch
Patch1003: 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
Patch1004: 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
Patch1005: 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
Patch1006: 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
Patch1007: 0008-Update-NEWS.patch
Patch1008: 0009-sln-use-stat64.patch
Patch1009: 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
Patch1010: 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
Patch1011: 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
Patch1012: 0013-Mention-BZ-19762-in-NEWS.patch
Patch1013: 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
Patch1014: 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
Patch1015: 0016-Fix-resource-leak-in-resolver-bug-19257.patch
Patch1016: 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
Patch1017: 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
Patch1018: 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
Patch1019: 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
Patch1020: 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
Patch1021: 0022-configure-fix-test-usage.patch
Patch1022: 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
Patch1023: 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
Patch1024: 0025-getnameinfo-Do-not-preserve-errno.patch
Patch1025: 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
Patch1026: 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
Patch1027: 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
Patch1028: 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
Patch1029: 0030-hesiod-Remove-RCS-keywords.patch
Patch1030: 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
Patch1031: 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
Patch1032: 0033-malloc-Remove-NO_THREADS.patch
Patch1033: 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
Patch1034: 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
Patch1035: 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
Patch1036: 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
Patch1037: 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
Patch1038: 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
Patch1039: 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
Patch1040: 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
Patch1041: 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
Patch1042: 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
Patch1043: 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
Patch1044: 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
Patch1045: 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
Patch1046: 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
Patch1047: 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
Patch1048: 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
Patch1049: 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
Patch1050: 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
Patch1051: 0052-Fix-tst-dlsym-error-build.patch
Patch1052: 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
Patch1053: 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
Patch1054: 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
Patch1055: 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
# PATCH-FIX-UPSTREAM sunrpc: Do not use alloca in clntudp_call (CVE-2016-4429, BZ #20112)
Patch1056: clntudp-call-alloca.patch
# PATCH-FIX-UPSTREAM Fix nscd assertion failure in gc (BZ #19755)
Patch1057: nscd-gc-crash.patch
# PATCH-FIX-UPSTREAM Return proper status from _nss_nis_initgroups_dyn (BZ #20262)
Patch1058: nis-initgroups-status.patch
# PATCH-FIX-UPSTREAM Fix generic __lll_robust_timedlock_wait to check for timeout (BZ #20263)
Patch1059: robust-mutex-deadlock.patch
# PATCH-FIX-UPSTREAM Avoid array-bounds warning for strncat on i586 (BZ #20260)
Patch1060: strncat-avoid-array-bounds-warning.patch
###
# Patches awaiting upstream approval
@ -325,8 +258,6 @@ Patch2000: fix-locking-in-_IO_cleanup.patch
Patch2001: ldd-system-interp.patch
# PATCH-FIX-UPSTREAM Don't close or flush stdio streams on abort (BZ #15436)
Patch2002: abort-no-flush.patch
# PATCH-FIX-UPSTREAM Speedup memset on x86-64 for large block sizes (BZ #16830)
Patch2003: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Fix fnmatch handling of collating elements (BZ #17396, BZ #16976)
Patch2004: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
@ -335,6 +266,8 @@ Patch2005: nss-files-long-lines-2.patch
Patch2006: iconv-reset-input-buffer.patch
# PATCH-FIX-UPSTREAM Reinitialize dl_load_write_lock on fork (BZ #19282)
Patch2008: reinitialize-dl_load_write_lock.patch
# PATCH-FIX-UPSTREAM ARM: mark __startcontext as .cantunwind (BZ #20435)
Patch2009: startcontext-cantunwind.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -538,76 +471,14 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
%patch1000 -p1
%patch1001 -p1
%patch1002 -p1
%patch1003 -p1
%patch1004 -p1
%patch1005 -p1
%patch1006 -p1
%patch1007 -p1
%patch1008 -p1
%patch1009 -p1
%patch1010 -p1
%patch1011 -p1
%patch1012 -p1
%patch1013 -p1
%patch1014 -p1
%patch1015 -p1
%patch1016 -p1
%patch1017 -p1
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch1022 -p1
%patch1023 -p1
%patch1024 -p1
%patch1025 -p1
%patch1026 -p1
%patch1027 -p1
%patch1028 -p1
%patch1029 -p1
%patch1030 -p1
%patch1031 -p1
%patch1032 -p1
%patch1033 -p1
%patch1034 -p1
%patch1035 -p1
%patch1036 -p1
%patch1037 -p1
%patch1038 -p1
%patch1039 -p1
%patch1040 -p1
%patch1041 -p1
%patch1042 -p1
%patch1043 -p1
%patch1044 -p1
%patch1045 -p1
%patch1046 -p1
%patch1047 -p1
%patch1048 -p1
%patch1049 -p1
%patch1050 -p1
%patch1051 -p1
%patch1052 -p1
%patch1053 -p1
%patch1054 -p1
%patch1055 -p1
%patch1056 -p1
%patch1057 -p1
%patch1058 -p1
%patch1059 -p1
%patch1060 -p1
%patch2000 -p1
%patch2001 -p1
%patch2002 -p1
%patch2003 -p1
%patch2004 -p1
%patch2005 -p1
%patch2006 -p1
%patch2008 -p1
%patch2009 -p1
%patch3000

@ -1,3 +1,99 @@
-------------------------------------------------------------------
Tue Aug 2 13:55:44 UTC 2016 - schwab@suse.de
- Update to glibc 2.24
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 3.2
* The pap_AN locale has been deleted
* The readdir_r and readdir64_r functions have been deprecated
* The type `union wait' has been removed
* A new NSS action is added to facilitate large distributed system
administration
* The deprecated __malloc_initialize_hook variable has been removed from
the API
* The long unused localedef --old-style option has been removed
* nextupl, nextup, nextupf, nextdownl, nextdown and nextdownf are added
to libm
* An unnecessary stack copy in _nss_dns_getnetbyname_r was removed
(CVE-2016-3075)
* Previously, getaddrinfo copied large amounts of address data to the
stack, even after the fix for CVE-2013-4458 has been applied,
potentially resulting in a stack overflow. getaddrinfo now uses a
heap allocation instead (CVE-2016-3706)
* The glob function suffered from a stack-based buffer overflow when it
was called with the GLOB_ALTDIRFUNC flag and encountered a long file
name (CVE-2016-1234)
* The Sun RPC UDP client could exhaust all available stack space when
flooded with crafted ICMP and UDP messages (CVE-2016-4429)
* The IPv6 name server management code in libresolv could result in a
memory leak for each thread which is created, performs a failing
naming lookup, and exits (CVE-2016-5417)
- startcontext-cantunwind.patch: mark __startcontext as .cantunwind
(bsc#974800, BZ #20435)
- Removed patches:
* 0001-Updated-translations-for-2.23.patch
* 0002-Regenerate-libc.pot-for-2.23.patch
* 0003-Regenerated-configure-scripts.patch
* 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
* 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
* 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
* 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
* 0008-Update-NEWS.patch
* 0009-sln-use-stat64.patch
* 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
* 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
* 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
* 0013-Mention-BZ-19762-in-NEWS.patch
* 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
* 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
* 0016-Fix-resource-leak-in-resolver-bug-19257.patch
* 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
* 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
* 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
* 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
* 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
* 0022-configure-fix-test-usage.patch
* 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
* 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
* 0025-getnameinfo-Do-not-preserve-errno.patch
* 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
* 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
* 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
* 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
* 0030-hesiod-Remove-RCS-keywords.patch
* 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
* 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
* 0033-malloc-Remove-NO_THREADS.patch
* 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
* 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
* 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
* 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
* 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
* 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
* 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
* 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
* 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
* 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
* 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
* 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
* 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
* 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
* 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
* 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
* 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
* 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
* 0052-Fix-tst-dlsym-error-build.patch
* 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
* 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
* 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
* 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
* clntudp-call-alloca.patch
* glibc-memset-nontemporal.diff
* nis-initgroups-status.patch
* nscd-gc-crash.patch
* robust-mutex-deadlock.patch
* strncat-avoid-array-bounds-warning.patch
-------------------------------------------------------------------
Wed Jun 29 12:50:21 UTC 2016 - schwab@suse.de

Binary file not shown.

@ -105,10 +105,10 @@ BuildRequires: gd-devel
# 3.1 is the openSUSE 12.1 kernel
%define enablekernel 3.0
Version: 2.23
Version: 2.24
Release: 0
%if !%{build_snapshot}
%define git_id 10ed3a0ffbb4
%define git_id beb0f59498c3
%define libversion %version
%else
%define git_id %(echo %version | sed 's/.*\.g//')
@ -249,73 +249,6 @@ Patch306: glibc-fix-double-loopback.diff
###
# Patches from upstream
###
# PATCH-FIX-UPSTREAM Patches from 2.23 branch
Patch1000: 0001-Updated-translations-for-2.23.patch
Patch1001: 0002-Regenerate-libc.pot-for-2.23.patch
Patch1002: 0003-Regenerated-configure-scripts.patch
Patch1003: 0004-x86_64-Set-DL_RUNTIME_UNALIGNED_VEC_SIZE-to-8.patch
Patch1004: 0005-Add-fts64_-to-sysdeps-arm-nacl-libc.abilist.patch
Patch1005: 0006-Don-t-use-long-double-math-functions-if-NO_LONG_DOUB.patch
Patch1006: 0007-NEWS-2.23-Fix-typo-in-bug-19048-text.patch
Patch1007: 0008-Update-NEWS.patch
Patch1008: 0009-sln-use-stat64.patch
Patch1009: 0010-Add-sys-auxv.h-wrapper-to-include-sys.patch
Patch1010: 0011-mips-terminate-the-FDE-before-the-return-trampoline-.patch
Patch1011: 0012-Use-HAS_ARCH_FEATURE-with-Fast_Rep_String.patch
Patch1012: 0013-Mention-BZ-19762-in-NEWS.patch
Patch1013: 0014-Define-_HAVE_STRING_ARCH_mempcpy-to-1-for-x86.patch
Patch1014: 0015-Or-bit_Prefer_MAP_32BIT_EXEC-in-EXTRA_LD_ENVVARS.patch
Patch1015: 0016-Fix-resource-leak-in-resolver-bug-19257.patch
Patch1016: 0017-math-don-t-clobber-old-libm.so-on-install-BZ-19822.patch
Patch1017: 0018-resolv-Always-set-resplen2-out-parameter-in-send_dg-.patch
Patch1018: 0019-S390-Save-and-restore-fprs-vrs-while-resolving-symbo.patch
Patch1019: 0020-S390-Extend-structs-La_s390_regs-La_s390_retval-with.patch
Patch1020: 0021-CVE-2016-3075-Stack-overflow-in-_nss_dns_getnetbynam.patch
Patch1021: 0022-configure-fix-test-usage.patch
Patch1022: 0023-Suppress-GCC-6-warning-about-ambiguous-else-with-Wpa.patch
Patch1023: 0024-nss_db-Propagate-ERANGE-error-if-parse_line-fails-BZ.patch
Patch1024: 0025-getnameinfo-Do-not-preserve-errno.patch
Patch1025: 0026-getnameinfo-Refactor-and-fix-memory-leak-BZ-19642.patch
Patch1026: 0027-getnameinfo-Reduce-line-length-and-add-missing-comme.patch
Patch1027: 0028-getnameinfo-Avoid-calling-strnlen-on-uninitialized-b.patch
Patch1028: 0029-getnameinfo-Return-EAI_OVERFLOW-in-more-cases-BZ-197.patch
Patch1029: 0030-hesiod-Remove-RCS-keywords.patch
Patch1030: 0031-hesiod-Always-use-thread-local-resolver-state-BZ-195.patch
Patch1031: 0032-hesiod-Avoid-heap-overflow-in-get_txt_records-BZ-200.patch
Patch1032: 0033-malloc-Remove-NO_THREADS.patch
Patch1033: 0034-Fix-malloc-threaded-tests-link-on-non-Linux.patch
Patch1034: 0035-malloc-Run-fork-handler-as-late-as-possible-BZ-19431.patch
Patch1035: 0036-malloc-Remove-malloc-hooks-from-fork-handler.patch
Patch1036: 0037-malloc-Add-missing-internal_function-attributes-on-f.patch
Patch1037: 0038-nss_dns-Fix-assertion-failure-in-_nss_dns_getcanonna.patch
Patch1038: 0039-nss_dns-Validate-RDATA-length-against-packet-length-.patch
Patch1039: 0040-resolv-nss_dns-Remove-remaining-syslog-logging-BZ-19.patch
Patch1040: 0041-nss_dns-Check-address-length-before-creating-addrinf.patch
Patch1041: 0042-nss_dns-Skip-over-non-PTR-records-in-the-netent-code.patch
Patch1042: 0043-resolv-Always-set-resplen2-out-parameter-in-send_vc-.patch
Patch1043: 0044-tst-audit4-tst-audit10-Compile-AVX-AVX-512-code-sepa.patch
Patch1044: 0045-Fix-tst-audit10-build-when-mavx512f-is-not-supported.patch
Patch1045: 0046-tst-audit10-Fix-compilation-on-compilers-without-bit.patch
Patch1046: 0047-strfmon_l-Use-specified-locale-for-number-formatting.patch
Patch1047: 0048-glob-Simplify-the-interface-for-the-GLOB_ALTDIRFUNC-.patch
Patch1048: 0049-CVE-2016-1234-glob-Do-not-copy-d_name-field-of-struc.patch
Patch1049: 0050-ldconfig-Do-not-remove-stale-symbolic-links-with-X-B.patch
Patch1050: 0051-Report-dlsym-dlvsym-lookup-errors-using-dlerror-BZ-1.patch
Patch1051: 0052-Fix-tst-dlsym-error-build.patch
Patch1052: 0053-Remove-trailing-newline-from-date_fmt-in-Serbian-loc.patch
Patch1053: 0054-Revert-Report-dlsym-dlvsym-lookup-errors-using-dlerr.patch
Patch1054: 0055-CVE-2016-3706-getaddrinfo-stack-overflow-in-hostent-.patch
Patch1055: 0056-Fix-strfmon_l-Use-specified-locale-for-number-format.patch
# PATCH-FIX-UPSTREAM sunrpc: Do not use alloca in clntudp_call (CVE-2016-4429, BZ #20112)
Patch1056: clntudp-call-alloca.patch
# PATCH-FIX-UPSTREAM Fix nscd assertion failure in gc (BZ #19755)
Patch1057: nscd-gc-crash.patch
# PATCH-FIX-UPSTREAM Return proper status from _nss_nis_initgroups_dyn (BZ #20262)
Patch1058: nis-initgroups-status.patch
# PATCH-FIX-UPSTREAM Fix generic __lll_robust_timedlock_wait to check for timeout (BZ #20263)
Patch1059: robust-mutex-deadlock.patch
# PATCH-FIX-UPSTREAM Avoid array-bounds warning for strncat on i586 (BZ #20260)
Patch1060: strncat-avoid-array-bounds-warning.patch
###
# Patches awaiting upstream approval
@ -326,8 +259,6 @@ Patch2000: fix-locking-in-_IO_cleanup.patch
Patch2001: ldd-system-interp.patch
# PATCH-FIX-UPSTREAM Don't close or flush stdio streams on abort (BZ #15436)
Patch2002: abort-no-flush.patch
# PATCH-FIX-UPSTREAM Speedup memset on x86-64 for large block sizes (BZ #16830)
Patch2003: glibc-memset-nontemporal.diff
# PATCH-FIX-UPSTREAM Fix fnmatch handling of collating elements (BZ #17396, BZ #16976)
Patch2004: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
@ -336,6 +267,8 @@ Patch2005: nss-files-long-lines-2.patch
Patch2006: iconv-reset-input-buffer.patch
# PATCH-FIX-UPSTREAM Reinitialize dl_load_write_lock on fork (BZ #19282)
Patch2008: reinitialize-dl_load_write_lock.patch
# PATCH-FIX-UPSTREAM ARM: mark __startcontext as .cantunwind (BZ #20435)
Patch2009: startcontext-cantunwind.patch
# Non-glibc patches
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -538,76 +471,14 @@ rm nscd/s-stamp
%patch304 -p1
%patch306 -p1
%patch1000 -p1
%patch1001 -p1
%patch1002 -p1
%patch1003 -p1
%patch1004 -p1
%patch1005 -p1
%patch1006 -p1
%patch1007 -p1
%patch1008 -p1
%patch1009 -p1
%patch1010 -p1
%patch1011 -p1
%patch1012 -p1
%patch1013 -p1
%patch1014 -p1
%patch1015 -p1
%patch1016 -p1
%patch1017 -p1
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch1022 -p1
%patch1023 -p1
%patch1024 -p1
%patch1025 -p1
%patch1026 -p1
%patch1027 -p1
%patch1028 -p1
%patch1029 -p1
%patch1030 -p1
%patch1031 -p1
%patch1032 -p1
%patch1033 -p1
%patch1034 -p1
%patch1035 -p1
%patch1036 -p1
%patch1037 -p1
%patch1038 -p1
%patch1039 -p1
%patch1040 -p1
%patch1041 -p1
%patch1042 -p1
%patch1043 -p1
%patch1044 -p1
%patch1045 -p1
%patch1046 -p1
%patch1047 -p1
%patch1048 -p1
%patch1049 -p1
%patch1050 -p1
%patch1051 -p1
%patch1052 -p1
%patch1053 -p1
%patch1054 -p1
%patch1055 -p1
%patch1056 -p1
%patch1057 -p1
%patch1058 -p1
%patch1059 -p1
%patch1060 -p1
%patch2000 -p1
%patch2001 -p1
%patch2002 -p1
%patch2003 -p1
%patch2004 -p1
%patch2005 -p1
%patch2006 -p1
%patch2008 -p1
%patch2009 -p1
%patch3000

@ -10,19 +10,20 @@ Fix iconv buffer handling with IGNORE error handler (bug #18830)
(internal_ucs4le_loop_unaligned, internal_ucs4le_loop_single)
(ucs4le_internal_loop, ucs4le_internal_loop_unaligned)
(ucs4le_internal_loop_single): Add const to outend.
* iconv/Makefile (tests): Add tst-iconv6.
* iconv/tst-iconv6.c: New file.
* iconv/Makefile (tests): Add tst-iconv7.
* iconv/tst-iconv7.c: New file.
Index: glibc-2.22/iconv/Makefile
===================================================================
--- glibc-2.22.orig/iconv/Makefile
+++ glibc-2.22/iconv/Makefile
@@ -42,7 +42,7 @@ CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i1
@@ -42,7 +42,8 @@ CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i1
CFLAGS-linereader.c = -DNO_TRANSLITERATION
CFLAGS-simple-hash.c = -I../locale
-tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5
+tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6
-tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6
+tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6 \
+ tst-iconv7
others = iconv_prog iconvconfig
install-others-programs = $(inst_bindir)/iconv
@ -126,7 +127,7 @@ Index: glibc-2.22/iconv/gconv_simple.c
size_t *irreversible)
{
int flags = step_data->__flags;
@@ -669,7 +675,8 @@ ucs4le_internal_loop_unaligned (struct _
@@ -671,7 +677,8 @@ ucs4le_internal_loop_unaligned (struct _
struct __gconv_step_data *step_data,
const unsigned char **inptrp,
const unsigned char *inend,
@ -136,7 +137,7 @@ Index: glibc-2.22/iconv/gconv_simple.c
size_t *irreversible)
{
int flags = step_data->__flags;
@@ -743,7 +750,8 @@ ucs4le_internal_loop_single (struct __gc
@@ -745,7 +752,8 @@ ucs4le_internal_loop_single (struct __gc
struct __gconv_step_data *step_data,
const unsigned char **inptrp,
const unsigned char *inend,
@ -223,10 +224,10 @@ Index: glibc-2.22/iconv/skeleton.c
/* Change the status. */
status = result;
}
Index: glibc-2.22/iconv/tst-iconv6.c
Index: glibc-2.22/iconv/tst-iconv7.c
===================================================================
--- /dev/null
+++ glibc-2.22/iconv/tst-iconv6.c
+++ glibc-2.22/iconv/tst-iconv7.c
@@ -0,0 +1,68 @@
+/* Test iconv buffer handling with the IGNORE error handler.
+ Copyright (C) 2015 Free Software Foundation, Inc.
@ -296,3 +297,34 @@ Index: glibc-2.22/iconv/tst-iconv6.c
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
Index: glibc-2.23.90/sysdeps/s390/multiarch/gconv_simple.c
===================================================================
--- glibc-2.23.90.orig/sysdeps/s390/multiarch/gconv_simple.c
+++ glibc-2.23.90/sysdeps/s390/multiarch/gconv_simple.c
@@ -403,7 +403,7 @@ ICONV_VX_NAME (internal_ucs4le_loop) (st
const unsigned char **inptrp,
const unsigned char *inend,
unsigned char **outptrp,
- unsigned char *outend,
+ const unsigned char *outend,
size_t *irreversible)
{
const unsigned char *inptr = *inptrp;
@@ -503,7 +503,7 @@ ICONV_VX_NAME (ucs4_internal_loop) (stru
const unsigned char **inptrp,
const unsigned char *inend,
unsigned char **outptrp,
- unsigned char *outend,
+ const unsigned char *outend,
size_t *irreversible)
{
int flags = step_data->__flags;
@@ -630,7 +630,7 @@ ICONV_VX_NAME (ucs4le_internal_loop) (st
const unsigned char **inptrp,
const unsigned char *inend,
unsigned char **outptrp,
- unsigned char *outend,
+ const unsigned char *outend,
size_t *irreversible)
{
int flags = step_data->__flags;

@ -1,53 +0,0 @@
[BZ #20262]
* nis/nss_nis/nis-initgroups.c (_nss_nis_initgroups_dyn): Return
NSS_STATUS_SUCCESS when done. Return NSS_STATUS_TRYAGAIN when out
of memory.
Index: glibc-2.23/nis/nss_nis/nis-initgroups.c
===================================================================
--- glibc-2.23.orig/nis/nss_nis/nis-initgroups.c
+++ glibc-2.23/nis/nss_nis/nis-initgroups.c
@@ -266,7 +266,7 @@ _nss_nis_initgroups_dyn (const char *use
tmpbuf = __alloca (buflen);
- do
+ while (1)
{
while ((status =
internal_getgrent_r (&grpbuf, tmpbuf, buflen, errnop,
@@ -275,8 +275,11 @@ _nss_nis_initgroups_dyn (const char *use
tmpbuf = extend_alloca (tmpbuf, buflen, 2 * buflen);
if (status != NSS_STATUS_SUCCESS)
- goto done;
-
+ {
+ if (status == NSS_STATUS_NOTFOUND)
+ status = NSS_STATUS_SUCCESS;
+ goto done;
+ }
g = &grpbuf;
if (g->gr_gid != group)
@@ -304,7 +307,11 @@ _nss_nis_initgroups_dyn (const char *use
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
- goto done;
+ {
+ status = NSS_STATUS_TRYAGAIN;
+ *errnop = errno;
+ goto done;
+ }
*groupsp = groups = newgroups;
*size = newsize;
}
@@ -316,7 +323,6 @@ _nss_nis_initgroups_dyn (const char *use
}
}
}
- while (status == NSS_STATUS_SUCCESS);
done:
while (intern.start != NULL)

@ -1,73 +0,0 @@
[BZ #19755]
* nscd/pwdcache.c (cache_addpw): Lock prune_run_lock while adding
new entries in auto-propagate mode.
* nscd/grpcache.c (cache_addgr): Likewise.
Index: glibc-2.23/nscd/grpcache.c
===================================================================
--- glibc-2.23.orig/nscd/grpcache.c
+++ glibc-2.23/nscd/grpcache.c
@@ -205,10 +205,19 @@ cache_addgr (struct database_dyn *db, in
dataset = NULL;
if (he == NULL)
- dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
+ {
+ /* Prevent an INVALIDATE request from pruning the data between
+ the two calls to cache_add. */
+ if (db->propagate)
+ pthread_mutex_lock (&db->prune_run_lock);
+ dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
+ }
if (dataset == NULL)
{
+ if (he == NULL && db->propagate)
+ pthread_mutex_unlock (&db->prune_run_lock);
+
/* We cannot permanently add the result in the moment. But
we can provide the result as is. Store the data in some
temporary memory. */
@@ -396,6 +405,8 @@ cache_addgr (struct database_dyn *db, in
out:
pthread_rwlock_unlock (&db->lock);
+ if (he == NULL && db->propagate)
+ pthread_mutex_unlock (&db->prune_run_lock);
}
}
Index: glibc-2.23/nscd/pwdcache.c
===================================================================
--- glibc-2.23.orig/nscd/pwdcache.c
+++ glibc-2.23/nscd/pwdcache.c
@@ -198,10 +198,19 @@ cache_addpw (struct database_dyn *db, in
dataset = NULL;
if (he == NULL)
- dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
+ {
+ /* Prevent an INVALIDATE request from pruning the data between
+ the two calls to cache_add. */
+ if (db->propagate)
+ pthread_mutex_lock (&db->prune_run_lock);
+ dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
+ }
if (dataset == NULL)
{
+ if (he == NULL && db->propagate)
+ pthread_mutex_unlock (&db->prune_run_lock);
+
/* We cannot permanently add the result in the moment. But
we can provide the result as is. Store the data in some
temporary memory. */
@@ -374,6 +383,8 @@ cache_addpw (struct database_dyn *db, in
out:
pthread_rwlock_unlock (&db->lock);
+ if (he == NULL && db->propagate)
+ pthread_mutex_unlock (&db->prune_run_lock);
}
}

@ -3,8 +3,8 @@ Index: glibc-2.22/sysdeps/nptl/fork.c
--- glibc-2.22.orig/sysdeps/nptl/fork.c
+++ glibc-2.22/sysdeps/nptl/fork.c
@@ -174,8 +174,9 @@ __libc_fork (void)
/* Reset locks in the I/O code. */
_IO_list_resetlock ();
}
- /* Reset the lock the dynamic loader uses to protect its data. */
+ /* Reset the locks the dynamic loader uses to protect its data. */

@ -1,152 +0,0 @@
[BZ #20263]
* nptl/lowlevelrobustlock.c (__lll_robust_timedlock_wait)
[__ASSUME_FUTEX_CLOCK_REALTIME]: Check for timeout from
lll_futex_timed_wait_bitset.
* nptl/tst-robust10.c: New test.
* nptl/Makefile (tests): Add tst-robust10.
Index: glibc-2.23/nptl/Makefile
===================================================================
--- glibc-2.23.orig/nptl/Makefile
+++ glibc-2.23/nptl/Makefile
@@ -288,7 +288,7 @@ tests = tst-typesizes \
tst-initializers1 $(addprefix tst-initializers1-,\
c89 gnu89 c99 gnu99 c11 gnu11) \
tst-bad-schedattr \
- tst-thread_local1 tst-mutex-errorcheck
+ tst-thread_local1 tst-mutex-errorcheck tst-robust10
xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
test-srcs = tst-oddstacklimit
Index: glibc-2.23/nptl/lowlevelrobustlock.c
===================================================================
--- glibc-2.23.orig/nptl/lowlevelrobustlock.c
+++ glibc-2.23/nptl/lowlevelrobustlock.c
@@ -118,8 +118,10 @@ __lll_robust_timedlock_wait (int *futex,
|| !defined lll_futex_timed_wait_bitset)
lll_futex_timed_wait (futex, newval, &rt, private);
#else
- lll_futex_timed_wait_bitset (futex, newval, abstime,
- FUTEX_CLOCK_REALTIME, private);
+ int err = lll_futex_timed_wait_bitset (futex, newval, abstime,
+ FUTEX_CLOCK_REALTIME, private);
+ if (err == -ETIMEDOUT)
+ return -err;
#endif
try:
Index: glibc-2.23/nptl/tst-robust10.c
===================================================================
--- /dev/null
+++ glibc-2.23/nptl/tst-robust10.c
@@ -0,0 +1,110 @@
+/* Test that pthread_mutex_timedlock properly times out.
+ Copyright (C) 2016 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 <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+pthread_mutex_t mutex;
+
+static void *
+thr (void *arg)
+{
+ struct timespec abstime;
+ clock_gettime (CLOCK_REALTIME, &abstime);
+ abstime.tv_sec += 1;
+ int ret = pthread_mutex_timedlock (&mutex, &abstime);
+ if (ret == 0)
+ {
+ puts ("mutex_timedlock didn't fail");
+ exit (1);
+ }
+ if (ret != ETIMEDOUT)
+ {
+ printf ("mutex_timedlock failed: %s\n", strerror (ret));
+ exit (1);
+ }
+
+ return 0;
+}
+
+static int
+do_test (void)
+{
+ pthread_t pt;
+ pthread_mutexattr_t ma;
+
+ if (pthread_mutexattr_init (&ma) != 0)
+ {
+ puts ("mutexattr_init failed");
+ return 0;
+ }
+ if (pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP) != 0)
+ {
+ puts ("mutexattr_setrobust failed");
+ return 1;
+ }
+ if (pthread_mutex_init (&mutex, &ma))
+ {
+ puts ("mutex_init failed");
+ return 1;
+ }
+
+ if (pthread_mutexattr_destroy (&ma))
+ {
+ puts ("mutexattr_destroy failed");
+ return 1;
+ }
+
+ if (pthread_mutex_lock (&mutex))
+ {
+ puts ("mutex_lock failed");
+ return 1;
+ }
+
+ if (pthread_create (&pt, NULL, thr, NULL))
+ {
+ puts ("pthread_create failed");
+ return 1;
+ }
+
+ if (pthread_join (pt, NULL))
+ {
+ puts ("pthread_join failed");
+ return 1;
+ }
+
+ if (pthread_mutex_unlock (&mutex))
+ {
+ puts ("mutex_unlock failed");
+ return 1;
+ }
+
+ if (pthread_mutex_destroy (&mutex))
+ {
+ puts ("mutex_destroy failed");
+ return 1;
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

@ -0,0 +1,42 @@
From 1061d6fe364ddac7458a872839ea9efe8f7600f0 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
Date: Mon, 8 Aug 2016 09:29:18 +0200
Subject: [PATCH] arm: mark __startcontext as .cantunwind
__startcontext marks the bottom of the call stack of the contexts created
by makecontext.
[BZ #20435]
* sysdeps/unix/sysv/linux/arm/setcontext.S (__startcontext): Mark
as .cantunwind.
---
sysdeps/unix/sysv/linux/arm/setcontext.S | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sysdeps/unix/sysv/linux/arm/setcontext.S b/sysdeps/unix/sysv/linux/arm/setcontext.S
index 603e508..d1f168f 100644
--- a/sysdeps/unix/sysv/linux/arm/setcontext.S
+++ b/sysdeps/unix/sysv/linux/arm/setcontext.S
@@ -86,12 +86,19 @@ weak_alias(__setcontext, setcontext)
/* Called when a makecontext() context returns. Start the
context in R4 or fall through to exit(). */
+ /* Unwind descriptors are looked up based on PC - 2, so we have to
+ make sure to mark the instruction preceding the __startcontext
+ label as .cantunwind. */
+ .fnstart
+ .cantunwind
+ nop
ENTRY(__startcontext)
movs r0, r4
bne PLTJMP(__setcontext)
@ New context was 0 - exit
b PLTJMP(HIDDEN_JUMPTARGET(exit))
+ .fnend
END(__startcontext)
#ifdef PIC
--
2.9.2

@ -1,31 +0,0 @@
Subject: [PATCH] Avoid array-bounds warning for strncat on i586
[BZ #20260]
* sysdeps/x86/bits/string.h (__strncat_g) [!__i686__]: Compute the
address before the beginning of the string as an integer to avoid
array-bounds warning.
diff --git a/sysdeps/x86/bits/string.h b/sysdeps/x86/bits/string.h
index 8dfce05..805d33f 100644
--- a/sysdeps/x86/bits/string.h
+++ b/sysdeps/x86/bits/string.h
@@ -1089,7 +1089,6 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
: "g" (__n), "0" (0), "1" (__tmp), "2" (__src), "3" (0xffffffff)
: "memory", "cc");
# else
- --__tmp;
__asm__ __volatile__
("1:\n\t"
"cmpb $0,1(%1)\n\t"
@@ -1108,7 +1107,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
"3:\n\t"
"movb $0,(%1)"
: "=&q" (__dummy), "=&r" (__tmp), "=&r" (__src), "=&r" (__n)
- : "1" (__tmp), "2" (__src), "3" (__n)
+ : "1" ((unsigned long) __tmp - 1), "2" (__src), "3" (__n)
: "memory", "cc");
#endif
return __dest;
--
2.9.0