]> git.ipfire.org Git - thirdparty/glibc.git/log
thirdparty/glibc.git
3 years agoAArch64: Rename IS_ARES to IS_NEOVERSE_N1
Wilco Dijkstra [Wed, 15 Jul 2020 15:58:07 +0000 (16:58 +0100)] 
AArch64: Rename IS_ARES to IS_NEOVERSE_N1

Rename IS_ARES to IS_NEOVERSE_N1 since that is a bit clearer.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoAArch64: Add optimized Q-register memcpy
Wilco Dijkstra [Wed, 15 Jul 2020 15:55:07 +0000 (16:55 +0100)] 
AArch64: Add optimized Q-register memcpy

Add a new memcpy using 128-bit Q registers - this is faster on modern
cores and reduces codesize.  Similar to the generic memcpy, small cases
include copies up to 32 bytes.  64-128 byte copies are split into two
cases to improve performance of 64-96 byte copies.  Large copies align
the source rather than the destination.

bench-memcpy-random is ~9% faster than memcpy_falkor on Neoverse N1,
so make this memcpy the default on N1 (on Centriq it is 15% faster than
memcpy_falkor).

Passes GLIBC regression tests.

Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
3 years agoAArch64: Align ENTRY to a cacheline
Wilco Dijkstra [Wed, 15 Jul 2020 15:50:02 +0000 (16:50 +0100)] 
AArch64: Align ENTRY to a cacheline

Given almost all uses of ENTRY are for string/memory functions,
align ENTRY to a cacheline to simplify things.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoCorrect timespec implementation [BZ #26232]
H.J. Lu [Mon, 13 Jul 2020 23:15:56 +0000 (16:15 -0700)] 
Correct timespec implementation [BZ #26232]

commit 04deeaa9ea74b0679dfc9d9155a37b6425f19a9f
Author: Lucas A. M. Magalhaes <lamm@linux.ibm.com>
Date:   Fri Jul 10 19:41:06 2020 -0300

    Fix time/tst-cpuclock1 intermitent failures

has 2 issues:

1. It assumes time_t == long which is false on x32.
2. tst-timespec.c is compiled without -fexcess-precision=standard which
generates incorrect results on i686 in support_timespec_check_in_range:

  double ratio = (double)observed_norm / expected_norm;
  return (lower_bound <= ratio && ratio <= upper_bound);

This patch does

1. Compile tst-timespec.c with -fexcess-precision=standard.
2. Replace long with time_t.
3. Replace LONG_MIN and LONG_MAX with TYPE_MINIMUM (time_t) and
TYPE_MAXIMUM (time_t).

3 years agoRemove --enable-obsolete-rpc configure flag
Petr Vorel [Mon, 13 Jul 2020 17:36:35 +0000 (19:36 +0200)] 
Remove --enable-obsolete-rpc configure flag

Sun RPC was removed from glibc. This includes rpcgen program, librpcsvc,
and Sun RPC headers. Also test for bug #20790 was removed
(test for rpcgen).

Backward compatibility for old programs is kept only for architectures
and ABIs that have been added in or before version 2.28.

libtirpc is mature enough, librpcsvc and rpcgen are provided in
rpcsvc-proto project.

NOTE: libnsl code depends on Sun RPC (installed libnsl headers use
installed Sun RPC headers), thus --enable-obsolete-rpc was a dependency
for --enable-obsolete-nsl (removed in a previous commit).

The arc ABI list file has to be updated because the port was added
with the sunrpc symbols

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agohurd: Fix build-many-glibcs.py
Adhemerval Zanella [Fri, 10 Jul 2020 17:48:17 +0000 (14:48 -0300)] 
hurd: Fix build-many-glibcs.py

It fixes the issue report by Joseph [1].

Checked with a build-many-glibcs.py build for i686-gnu.

[1] https://sourceware.org/pipermail/libc-alpha/2020-July/116134.html

3 years agox86: Support usable check for all CPU features
H.J. Lu [Mon, 29 Jun 2020 23:36:08 +0000 (16:36 -0700)] 
x86: Support usable check for all CPU features

Support usable check for all CPU features with the following changes:

1. Change struct cpu_features to

struct cpuid_features
{
  struct cpuid_registers cpuid;
  struct cpuid_registers usable;
};

struct cpu_features
{
  struct cpu_features_basic basic;
  struct cpuid_features features[COMMON_CPUID_INDEX_MAX];
  unsigned int preferred[PREFERRED_FEATURE_INDEX_MAX];
...
};

so that there is a usable bit for each cpuid bit.
2. After the cpuid bits have been initialized, copy the known bits to the
usable bits.  EAX/EBX from INDEX_1 and EAX from INDEX_7 aren't used for
CPU feature detection.
3. Clear the usable bits which require OS support.
4. If the feature is supported by OS, copy its cpuid bit to its usable
bit.
5. Replace HAS_CPU_FEATURE and CPU_FEATURES_CPU_P with CPU_FEATURE_USABLE
and CPU_FEATURE_USABLE_P to check if a feature is usable.
6. Add DEPR_FPU_CS_DS for INDEX_7_EBX_13.
7. Unset MPX feature since it has been deprecated.

The results are

1. If the feature is known and doesn't requre OS support, its usable bit
is copied from the cpuid bit.
2. Otherwise, its usable bit is copied from the cpuid bit only if the
feature is known to supported by OS.
3. CPU_FEATURE_USABLE/CPU_FEATURE_USABLE_P are used to check if the
feature can be used.
4. HAS_CPU_FEATURE/CPU_FEATURE_CPU_P are used to check if CPU supports
the feature.

3 years agostring: Make tst-strerror/tst-strsignal unsupported if msgfmt is not installed
Adhemerval Zanella [Thu, 9 Jul 2020 16:24:04 +0000 (13:24 -0300)] 
string: Make tst-strerror/tst-strsignal unsupported if msgfmt is not installed

Without msgfmt libc.mo files are not generated and its loading failure
is silent ignored with xsetlocale.

Also unset LANGUAGE environment variable to avoid it taking precedence
when loading the message catalog.  Although not strictly required
(since the test is issued with test-container and it sets a strict
environment variable) it follows other tests that deal with
translation.

Checked on x86_64-linux-gnu.

3 years agomalloc: Deprecate more hook-related functionality
Florian Weimer [Mon, 13 Jul 2020 07:58:37 +0000 (09:58 +0200)] 
malloc: Deprecate more hook-related functionality

__morecore, __after_morecore_hook, and __default_morecore had not
been deprecated in commit 7d17596c198f11fa85cbcf9587443f262e63b616
("Mark malloc hook variables as deprecated"), probably by accident.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoelf: Support at least 32-byte alignment in static dlopen
Florian Weimer [Sun, 12 Jul 2020 15:53:58 +0000 (17:53 +0200)] 
elf: Support at least 32-byte alignment in static dlopen

Otherwise loading a dynamically linked libc with rseq support fails,
as result of the __rseq_abi TLS variable, which has an alignment
of 32 bytes.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Vineet Gupta <vgupta@synopsys.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
3 years agox86: Remove __ASSEMBLER__ check in init-arch.h
H.J. Lu [Sat, 11 Jul 2020 17:03:05 +0000 (10:03 -0700)] 
x86: Remove __ASSEMBLER__ check in init-arch.h

Since

commit 430388d5dc0e1861b869096f4f5d946d7d74232a
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Aug 3 08:04:49 2018 -0700

    x86: Don't include <init-arch.h> in assembly codes

removed all usages of <init-arch.h> from assembly codes, we can remove
__ASSEMBLER__ check in init-arch.h.

3 years agox86: Remove the unused __x86_prefetchw
H.J. Lu [Sat, 11 Jul 2020 16:04:34 +0000 (09:04 -0700)] 
x86: Remove the unused __x86_prefetchw

Since

commit c867597bff2562180a18da4b8dba89d24e8b65c4
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Jun 8 13:57:50 2016 -0700

    X86-64: Remove previous default/SSE2/AVX2 memcpy/memmove

removed the only usage of __x86_prefetchw, we can remove the unused
__x86_prefetchw.

3 years agoDocumentation for ARC port
Vineet Gupta [Mon, 20 Nov 2017 20:46:17 +0000 (12:46 -0800)] 
Documentation for ARC port

(a) ABI doc:
    https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/wiki/files/ARCv2_ABI.pdf

(b) Programmer's Reference Manual (PRM) : needs a download request to be filled
    https://www.synopsys.com/dw/ipdir.php?ds=arc-hs44-hs46-hs48
    https://www.synopsys.com/dw/doc.php/ds/cc/programmers-reference-manual-ARC-HS.pdf

As of port merge (and Florian's patch to fix static TLS), glibc testsuite
(cross-test setup) has following failures:

FAIL: elf/tst-audit14
FAIL: elf/tst-audit15
FAIL: elf/tst-audit16
FAIL: elf/tst-ldconfig-ld_so_conf-update
FAIL: elf/tst-libc_dlvsym
FAIL: elf/tst-libc_dlvsym-static
FAIL: iconv/test-iconvconfig # Needs gconv installed
FAIL: io/ftwtest # Requires execution by non-root
FAIL: io/tst-lockf
FAIL: libio/tst-wfile-sync
FAIL: locale/tst-localedef-path-norm
FAIL: nptl/test-cond-printers # needs Python3 and target GDB on target
FAIL: nptl/test-condattr-printers #    ditto
FAIL: nptl/test-mutex-printers #    ditto
FAIL: nptl/test-mutexattr-printers #    ditto
FAIL: nptl/test-rwlock-printers #    ditto
FAIL: nptl/test-rwlockattr-printers #    ditto
FAIL: nptl/tst-umask1 # passes if run natively on target (NFS ACLv3 support needed)
FAIL: nss/bug-erange
FAIL: nss/tst-nss-files-hosts-getent
FAIL: nss/tst-nss-files-hosts-multi
FAIL: posix/bug-ga2
FAIL: posix/globtest # require same user on target and host
FAIL: posix/tst-getaddrinfo5
FAIL: stdio-common/tst-vfprintf-width-prec
FAIL: stdio-common/tst-vfprintf-width-prec-alloc
FAIL: stdio-common/tst-vfprintf-width-prec-mem
FAIL: string/tst-strerror
FAIL: string/tst-strsignal
FAIL: sunrpc/bug20790 # missing cpp on target
FAIL: timezone/tst-tzset

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agobuild-many-glibcs.py: Enable ARC builds
Vineet Gupta [Fri, 13 Mar 2020 01:29:59 +0000 (18:29 -0700)] 
build-many-glibcs.py: Enable ARC builds

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Build Infrastructure
Vineet Gupta [Tue, 23 Oct 2018 22:39:50 +0000 (15:39 -0700)] 
ARC: Build Infrastructure

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: ABI lists
Vineet Gupta [Tue, 23 Oct 2018 22:37:08 +0000 (15:37 -0700)] 
ARC: ABI lists

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Linux Startup and Dynamic Loading
Vineet Gupta [Tue, 23 Oct 2018 21:58:39 +0000 (14:58 -0700)] 
ARC: Linux Startup and Dynamic Loading

A big shoutout to Cupertino Miranda <cmiranda@synopsys.com> for his
valuable contribution in initial bringup and debugging on Linux and
later in solving pesky unwinding/cancelation failures in testsuite.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Linux ABI
Vineet Gupta [Tue, 23 Oct 2018 21:56:39 +0000 (14:56 -0700)] 
ARC: Linux ABI

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Linux Syscall Interface
Vineet Gupta [Tue, 23 Oct 2018 21:44:30 +0000 (14:44 -0700)] 
ARC: Linux Syscall Interface

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: hardware floating point support
Vineet Gupta [Tue, 5 Nov 2019 00:20:37 +0000 (16:20 -0800)] 
ARC: hardware floating point support

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: math soft float support
Vineet Gupta [Wed, 24 Oct 2018 21:22:54 +0000 (14:22 -0700)] 
ARC: math soft float support

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Atomics and Locking primitives
Vineet Gupta [Tue, 23 Oct 2018 21:36:39 +0000 (14:36 -0700)] 
ARC: Atomics and Locking primitives

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: Thread Local Storage support
Vineet Gupta [Tue, 23 Oct 2018 21:18:04 +0000 (14:18 -0700)] 
ARC: Thread Local Storage support

This includes all 4 TLS addressing models

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: startup and dynamic linking code
Vineet Gupta [Tue, 23 Oct 2018 19:36:32 +0000 (12:36 -0700)] 
ARC: startup and dynamic linking code

Code for C runtime startup and dynamic loading including PLT layout.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoARC: ABI Implementation
Vineet Gupta [Tue, 23 Oct 2018 18:38:32 +0000 (11:38 -0700)] 
ARC: ABI Implementation

This code deals with the ARC ABI.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoFix time/tst-cpuclock1 intermitent failures
Lucas A. M. Magalhaes [Fri, 10 Jul 2020 22:41:06 +0000 (19:41 -0300)] 
Fix time/tst-cpuclock1 intermitent failures

This test fails intermittently in systems with heavy load as
CLOCK_PROCESS_CPUTIME_ID is subject to scheduler pressure.  Thus the
test boundaries were relaxed to keep it from failing on such systems.

A refactor of the spent time checking was made with some support
functions.  With the advantage to representing time jitter in percent
of the target.

The values used by the test boundaries are all empirical.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agopowerpc64: Fix calls when r2 is not used [BZ #26173]
Tulio Magno Quites Machado Filho [Fri, 10 Jul 2020 22:41:06 +0000 (19:41 -0300)] 
powerpc64: Fix calls when r2 is not used [BZ #26173]

Teach the linker that __mcount_internal, __sigjmp_save_symbol,
__syscall_error and __GI_exit do not use r2, so that it does not need to
recover r2 after the call.

Test at configure time if the assembler supports @notoc and define
USE_PPC64_NOTOC.

3 years agoAdd NEWS entry for Update to Unicode 13.0.0 [BZ #25819]
Mike FABIAN [Wed, 8 Jul 2020 12:41:23 +0000 (14:41 +0200)] 
Add NEWS entry for Update to Unicode 13.0.0 [BZ #25819]

Unicode 13.0.0 Support: Character encoding, character type info, and
transliteration tables are all updated to Unicode 13.0.0, using
the generator scripts contributed by Mike FABIAN (Red Hat).

Total added characters in newly generated CHARMAP: 5930
Total added characters in newly generated WIDTH: 5536

3 years agoUpdate i686 libm-test-ulps
Patsy Franklin [Thu, 9 Jul 2020 20:06:17 +0000 (16:06 -0400)] 
Update i686 libm-test-ulps

Without my ULP patch these 18 tests fail on i686:
 https://koji.fedoraproject.org/koji/taskinfo?taskID=46467301

+ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel Xeon Processor (Cascadelake)

FAIL: math/test-double-j0
FAIL: math/test-double-y0
FAIL: math/test-float-erfc
FAIL: math/test-float-j0
FAIL: math/test-float-j1
FAIL: math/test-float-lgamma
FAIL: math/test-float-tgamma
FAIL: math/test-float-y0
FAIL: math/test-float32-erfc
FAIL: math/test-float32-j0
FAIL: math/test-float32-j1
FAIL: math/test-float32-lgamma
FAIL: math/test-float32-tgamma
FAIL: math/test-float32-y0
FAIL: math/test-float32x-j0
FAIL: math/test-float32x-y0
FAIL: math/test-float64-j0
FAIL: math/test-float64-y0

With my ULP patch applied these tests now pass:
 https://koji.fedoraproject.org/koji/taskinfo?taskID=46436310

3 years agoFix memory leak in __printf_fp_l (bug 26215).
Joseph Myers [Thu, 9 Jul 2020 21:52:24 +0000 (21:52 +0000)] 
Fix memory leak in __printf_fp_l (bug 26215).

__printf_fp_l has a memory leak in the case of some I/O errors, where
both buffer and wbuffer have been malloced but the handling of I/O
errors only frees wbuffer.  This patch fixes this by moving the
declaration of buffer to an outer scope and ensuring that it is freed
when wbuffer is freed.

Tested for x86_64 and x86.

3 years agoFix double free in __printf_fp_l (bug 26214).
Joseph Myers [Thu, 9 Jul 2020 21:51:49 +0000 (21:51 +0000)] 
Fix double free in __printf_fp_l (bug 26214).

__printf_fp_l has a double free bug in the case where it allocates
memory with malloc internally, then has an I/O error while outputting
trailing padding and tries to free that already-freed memory when the
error occurs.  This patch fixes this by setting the relevant pointer
to NULL after the first free (the only free of this pointer that isn't
immediately followed by returning from the function).

Tested for x86_64 and x86.

3 years agolinux: Fix syscall list generation instructions
Maciej W. Rozycki [Thu, 9 Jul 2020 16:43:57 +0000 (17:43 +0100)] 
linux: Fix syscall list generation instructions

Make the instructions for syscall list generation match Makefile and
refer to `update-syscall-lists'; there has been no `update-arch-syscall'
target.  Also use single quotes around the command to stick to the ASCII
character set.

Fixes 4cf0d223052d ("Linux: Add tables with system call numbers").

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
3 years agosysv: linux: Add 64-bit time_t variant for shmctl
Adhemerval Zanella [Tue, 30 Jun 2020 17:08:22 +0000 (14:08 -0300)] 
sysv: linux: Add 64-bit time_t variant for shmctl

To provide a y2038 safe interface a new symbol __shmctl64 is added
and __shmctl is change to call it instead (it adds some extra buffer
copying for the 32 bit time_t implementation).

Two new structures are added:

  1. kernel_shmid64_ds: used internally only on 32-bit architectures
     to issue the syscall.  A handful of architectures (hppa, i386,
     mips, powerpc32, and sparc32) require specific implementations
     due to their kernel ABI.

  2. shmid_ds64: this is only for __TIMESIZE != 64 to use along with
     the 64-bit shmctl.  It is different than the kernel struct because
     the exported 64-bit time_t might require different alignment
     depending on the architecture ABI.

So the resulting implementation does:

  1. For 64-bit architectures it assumes shmid_ds already contains
     64-bit time_t fields and will result in just the __shmctl symbol
     using the __shmctl64 code.  The shmid_ds argument is passed as-is
     to the syscall.

  2. For 32-bit architectures with default 64-bit time_t (newer ABIs
     such riscv32 or arc), it will also result in only one exported
     symbol but with the required high/low time handling.

  3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t
     support we follow the already set way to provide one symbol with
     64-bit time_t support and implement the 32-bit time_t support
     using of the 64-bit one.

     The default 32-bit symbol will allocate and copy the shmid_ds
     over multiple buffers, but this should be deprecated in favor
     of the __shmctl64 anyway.

Checked on i686-linux-gnu and x86_64-linux-gnu.  I also did some sniff
tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and
sparc64.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosysvipc: Remove the linux shm-pad.h file
Adhemerval Zanella [Tue, 30 Jun 2020 14:02:52 +0000 (11:02 -0300)] 
sysvipc: Remove the linux shm-pad.h file

Each architecture overrides the struct msqid_ds which its required
kernel ABI one.

Checked on x86_64-linux-gnu and some bases sysvipc tests on hppa,
mips, mipsle, mips64, mips64le, sparc64, sparcv9, powerpc64le,
powerpc64, and powerpc.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosysvipc: Split out linux struct shmid_ds
Adhemerval Zanella [Tue, 30 Jun 2020 13:30:14 +0000 (10:30 -0300)] 
sysvipc: Split out linux struct shmid_ds

This will allow us to have architectures specify their own version.

Not semantic changes expected.  Checked with a build against the
all affected ABIs.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosysv: linux: Add 64-bit time_t variant for msgctl
Adhemerval Zanella [Tue, 30 Jun 2020 12:20:48 +0000 (09:20 -0300)] 
sysv: linux: Add 64-bit time_t variant for msgctl

To provide a y2038 safe interface a new symbol __msgctl64 is added
and __msgctl is change to call it instead (it adds some extra buffer
coping for the 32 bit time_t implementation).

Two new structures are added:

  1. kernel_msqid64_ds: used internally only on 32-bit architectures
     to issue the syscall.  A handful of architectures (hppa, i386, mips,
     powerpc32, and sparc32) require specific implementations due to
     their kernel ABI.

  2. msqid_ds64: this is only for __TIMESIZE != 64 to use along with
     the 64-bit msgctl.  It is different than the kernel struct because
     the exported 64-bit time_t might require different alignment
     depending on the architecture ABI.

So the resulting implementation does:

  1. For 64-bit architectures it assumes msqid_ds already contains
     64-bit time_t fields and will result in just the __msgctl symbol
     using the __msgctl64 code.  The msgid_ds argument is passed as-is
     to the syscall.

  2. For 32-bit architectures with default 64-bit time_t (newer ABIs
     such riscv32 or arc), it will also result in only one exported
     symbol but with the required high/low time handling.

  3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t
     support we follow the already set way to provide one symbol with
     64-bit time_t support and implement the 32-bit time_t support using
     the 64-bit time_t.

     The default 32-bit symbol will allocate and copy the msqid_ds
     over multiple buffers, but this should be deprecated in favor
     of the __msgctl64 anyway.

Checked on i686-linux-gnu and x86_64-linux-gnu.  I also did some sniff
tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and
sparc64.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
3 years agosysvipc: Remove the linux msq-pad.h file
Adhemerval Zanella [Tue, 30 Jun 2020 00:33:14 +0000 (21:33 -0300)] 
sysvipc: Remove the linux msq-pad.h file

Each architecture overrides the struct msqid_ds which its required
kernel ABI one.

Checked on x86_64-linux-gnu and some bases sysvipc tests on hppa,
mips, mipsle, mips64, mips64le, sparc64, sparcv9, powerpc64le,
powerpc64, and powerpc.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
3 years agosysvipc: Split out linux struct semid_ds
Adhemerval Zanella [Mon, 29 Jun 2020 21:21:14 +0000 (18:21 -0300)] 
sysvipc: Split out linux struct semid_ds

This will allow us to have architectures specify their own version.

Not semantic changes expected.  Checked with a build against the
all affected ABIs.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
3 years agosysv: linux: Add 64-bit time_t variant for semctl
Adhemerval Zanella [Mon, 29 Jun 2020 16:35:50 +0000 (13:35 -0300)] 
sysv: linux: Add 64-bit time_t variant for semctl

Different than others 64-bit time_t syscalls, the SysIPC interface
does not provide a new set of syscall for y2038 safeness.  Instead it
uses unused fields in semid_ds structure to return the high bits for
the timestamps.

To provide a y2038 safe interface a new symbol __semctl64 is added
and __semctl is change to call it instead (it adds some extra buffer
copying for the 32 bit time_t implementation).

Two new structures are added:

  1. kernel_semid64_ds: used internally only on 32-bit architectures
     to issue the syscall.  A handful of architectures (hppa, i386,
     mips, powerpc32, sparc32) require specific implementations due
     their kernel ABI.

  2. semid_ds64: this is only for __TIMESIZE != 64 to use along with
     the 64-bit semctl.  It is different than the kernel struct because
     the exported 64-bit time_t might require different alignment
     depending on the architecture ABI.

So the resulting implementation does:

  1. For 64-bit architectures it assumes semid_ds already contains
     64-bit time_t fields and will result in just the __semctl symbol
     using the __semctl64 code.  The semid_ds argument is passed as-is
     to the syscall.

  2. For 32-bit architectures with default 64-bit time_t (newer ABIs
     such riscv32 or arc), it will also result in only one exported
     symbol but with the required high/low handling.

     It might be possible to optimize it further to avoid the
     kernel_semid64_ds to semun transformation if the exported ABI
     for the architectures matches the expected kernel ABI, but the
     implementation is already complex enough and don't think this
     should be a hotspot in any case.

  3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t
     support we follow the already set way to provide one symbol with
     64-bit time_t support and implement the 32-bit time_t support
     using the 64-bit one.

     The default 32-bit symbol will allocate and copy the semid_ds
     over multiple buffers, but this should be deprecated in favor
     of the __semctl64 anyway.

Checked on i686-linux-gnu and x86_64-linux-gnu.  I also did some sniff
tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and
sparc64.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Vineet Gupta <vgupta@synopsys.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
3 years agortld: Avoid using up static TLS surplus for optimizations [BZ #25051]
Szabolcs Nagy [Wed, 10 Jun 2020 12:40:40 +0000 (13:40 +0100)] 
rtld: Avoid using up static TLS surplus for optimizations [BZ #25051]

On some targets static TLS surplus area can be used opportunistically
for dynamically loaded modules such that the TLS access then becomes
faster (TLSDESC and powerpc TLS optimization). However we don't want
all surplus TLS to be used for this optimization because dynamically
loaded modules with initial-exec model TLS can only use surplus TLS.

The new contract for surplus static TLS use is:

- libc.so can have up to 192 bytes of IE TLS,
- other system libraries together can have up to 144 bytes of IE TLS.
- Some "optional" static TLS is available for opportunistic use.

The optional TLS is now tunable: rtld.optional_static_tls, so users
can directly affect the allocated static TLS size. (Note that module
unloading with dlclose does not reclaim static TLS. After the optional
TLS runs out, TLS access is no longer optimized to use static TLS.)

The default setting of rtld.optional_static_tls is 512 so the surplus
TLS is 3*192 + 4*144 + 512 = 1664 by default, the same as before.

Fixes BZ #25051.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agortld: Account static TLS surplus for audit modules
Szabolcs Nagy [Tue, 7 Jul 2020 09:49:11 +0000 (10:49 +0100)] 
rtld: Account static TLS surplus for audit modules

The new static TLS surplus size computation is

  surplus_tls = 192 * (nns-1) + 144 * nns + 512

where nns is controlled via the rtld.nns tunable. This commit
accounts audit modules too so nns = rtld.nns + audit modules.

rtld.nns should only include the namespaces required by the
application, namespaces for audit modules are accounted on top
of that so audit modules don't use up the static TLS that is
reserved for the application. This allows loading many audit
modules without tuning rtld.nns or using up static TLS, and it
fixes

FAIL: elf/tst-auditmany

Note that DL_NNS is currently a hard upper limit for nns, and
if rtld.nns + audit modules go over the limit that's a fatal
error. By default rtld.nns is 4 which allows 12 audit modules.

Counting the audit modules is based on existing audit string
parsing code, we cannot use GLRO(dl_naudit) before the modules
are actually loaded.

3 years agortld: Add rtld.nns tunable for the number of supported namespaces
Szabolcs Nagy [Tue, 9 Jun 2020 08:57:28 +0000 (09:57 +0100)] 
rtld: Add rtld.nns tunable for the number of supported namespaces

TLS_STATIC_SURPLUS is 1664 bytes currently which is not enough to
support DL_NNS (== 16) number of dynamic link namespaces, if we
assume 192 bytes of TLS are reserved for libc use and 144 bytes
are reserved for other system libraries that use IE TLS.

A new tunable is introduced to control the number of supported
namespaces and to adjust the surplus static TLS size as follows:

surplus_tls = 192 * (rtld.nns-1) + 144 * rtld.nns + 512

The default is rtld.nns == 4 and then the surplus TLS size is the
same as before, so the behaviour is unchanged by default. If an
application creates more namespaces than the rtld.nns setting
allows, then it is not guaranteed to work, but the limit is not
checked. So existing usage will continue to work, but in the
future if an application creates more than 4 dynamic link
namespaces then the tunable will need to be set.

In this patch DL_NNS is a fixed value and provides a maximum to
the rtld.nns setting.

Static linking used fixed 2048 bytes surplus TLS, this is changed
so the same contract is used as for dynamic linking.  With static
linking DL_NNS == 1 so rtld.nns tunable is forced to 1, so by
default the surplus TLS is reduced to 144 + 512 = 656 bytes. This
change is not expected to cause problems.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoRemove --enable-obsolete-nsl configure flag
Petr Vorel [Wed, 8 Jul 2020 11:06:55 +0000 (13:06 +0200)] 
Remove --enable-obsolete-nsl configure flag

this means that *always* libnsl is only built as shared library for
backward compatibility and the NSS modules libnss_nis and libnss_nisplus
are not built at all, libnsl's headers aren't installed.

This compatibility is kept only for architectures and ABIs that have
been added in or before version 2.28.

Replacement implementations based on TIRPC, which additionally support
IPv6, are available from <https://github.com/thkukuk/>.

This change does not affect libnss_compat which does not depended
on libnsl since 2.27 and thus can be used without NIS.

libnsl code depends on Sun RPC, e.g. on --enable-obsolete-rpc (installed
libnsl headers use installed Sun RPC headers), which will be removed in
the following commit.

3 years agoMove non-deprecated RPC-related functions from sunrpc to inet
Florian Weimer [Wed, 8 Jul 2020 10:15:23 +0000 (12:15 +0200)] 
Move non-deprecated RPC-related functions from sunrpc to inet

This includes bindresvport and the NSS-related RPC functions.  This will
simplify the removal of the sunrpc functionality because these functions
no longer have to be treated specially.

3 years agoaarch64: add NEWS entry about branch protection support
Szabolcs Nagy [Thu, 11 Jun 2020 17:19:40 +0000 (18:19 +0100)] 
aarch64: add NEWS entry about branch protection support

This is a new security feature that relies on architecture
extensions and needs glibc to be built with a gcc configured
with branch protection.

3 years agoaarch64: redefine RETURN_ADDRESS to strip PAC
Szabolcs Nagy [Wed, 15 Apr 2020 16:40:45 +0000 (17:40 +0100)] 
aarch64: redefine RETURN_ADDRESS to strip PAC

RETURN_ADDRESS is used at several places in glibc to mean a valid
code address of the call site, but with pac-ret it may contain a
pointer authentication code (PAC), so its definition is adjusted.

This is gcc PR target/94891: __builtin_return_address should not
expose signed pointers to user code where it can cause ABI issues.
In glibc RETURN_ADDRESS is only changed if it is built with pac-ret.
There is no detection for the specific gcc issue because it is
hard to test and the additional xpac does not cause problems.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: fix pac-ret support in _mcount
Szabolcs Nagy [Wed, 13 May 2020 11:10:13 +0000 (12:10 +0100)] 
aarch64: fix pac-ret support in _mcount

Currently gcc -pg -mbranch-protection=pac-ret passes signed return
address to _mcount, so _mcount now has to always strip pac from the
frompc since that's from user code that may be built with pac-ret.

This is gcc PR target/94791: signed pointers should not escape and get
passed across extern call boundaries, since that's an ABI break, but
because existing gcc has this issue we work it around in glibc until
that is resolved. This is compatible with a fixed gcc and it is a nop
on systems without PAuth support. The bug was introduced in gcc-7 with
-msign-return-address=non-leaf|all support which in gcc-9 got renamed
to -mbranch-protection=pac-ret|pac-ret+leaf|standard.

strip_pac uses inline asm instead of __builtin_aarch64_xpaclri since
that is not a documented api and not available in all supported gccs.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: Add pac-ret support to assembly files
Szabolcs Nagy [Wed, 29 Apr 2020 10:49:20 +0000 (11:49 +0100)] 
aarch64: Add pac-ret support to assembly files

Use return address signing in assembly files for functions that save
LR when pac-ret is enabled in the compiler.

The GNU property note for PAC-RET is not meaningful to the dynamic
linker so it is not strictly required, but it may be used to track
the security property of binaries. (The PAC-RET property is only set
if BTI is set too because BTI implies working GNU property support.)

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: configure check for pac-ret code generation
Szabolcs Nagy [Thu, 7 May 2020 17:30:12 +0000 (18:30 +0100)] 
aarch64: configure check for pac-ret code generation

Return address signing requires unwinder support, which is
present in libgcc since >=gcc-7, however due to bugs the
support may be broken in <gcc-10 (and similarly there may
be issues in custom unwinders), so pac-ret is not always
safe to use. So in assembly code glibc should only use
pac-ret if the compiler uses it too. Unfortunately there
is no predefined feature macro for it set by the compiler
so pac-ret is inferred from the code generation.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: ensure objects are BTI compatible
Szabolcs Nagy [Tue, 30 Jun 2020 10:12:40 +0000 (11:12 +0100)] 
aarch64: ensure objects are BTI compatible

When glibc is built with branch protection (i.e. with a gcc configured
with --enable-standard-branch-protection), all glibc binaries should
be BTI compatible and marked as such.

It is easy to link BTI incompatible objects by accident and this is
silent currently which is usually not the expectation, so this is
changed into a link error. (There is no linker flag for failing on
BTI incompatible inputs so all warnings are turned into fatal errors
outside the test system when building glibc with branch protection.)

Unfortunately, outlined atomic functions are not BTI compatible in
libgcc (PR libgcc/96001), so to build glibc with current gcc use
'CC=gcc -mno-outline-atomics', this should be fixed in libgcc soon
and then glibc can be built and tested without such workarounds.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: enable BTI at runtime
Sudakshina Das [Mon, 22 Jun 2020 09:57:20 +0000 (10:57 +0100)] 
aarch64: enable BTI at runtime

Binaries can opt-in to using BTI via an ELF object file marking.
The dynamic linker has to then mprotect the executable segments
with PROT_BTI. In case of static linked executables or in case
of the dynamic linker itself, PROT_BTI protection is done by the
operating system.

On AArch64 glibc uses PT_GNU_PROPERTY instead of PT_NOTE to check
the properties of a binary because PT_NOTE can be unreliable with
old linkers (old linkers just append the notes of input objects
together and add them to the output without checking them for
consistency which means multiple incompatible GNU property notes
can be present in PT_NOTE).

BTI property is handled in the loader even if glibc is not built
with BTI support, so in theory user code can be BTI protected
independently of glibc. In practice though user binaries are not
marked with the BTI property if glibc has no support because the
static linked libc objects (crt files, libc_nonshared.a) are
unmarked.

This patch relies on Linux userspace API that is not yet in a
linux release but in v5.8-rc1 so scheduled to be in Linux 5.8.

Co-authored-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: fix RTLD_START for BTI
Szabolcs Nagy [Tue, 31 Mar 2020 16:32:14 +0000 (17:32 +0100)] 
aarch64: fix RTLD_START for BTI

Tailcalls must use x16 or x17 for the indirect branch instruction
to be compatible with code that uses BTI c at function entries.
(Other forms of indirect branches can only land on BTI j.)

Also added a BTI c at the ELF entry point of rtld, this is not
strictly necessary since the kernel does not use indirect branch
to get there, but it seems safest once building glibc itself with
BTI is supported.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: fix swapcontext for BTI
Szabolcs Nagy [Wed, 1 Apr 2020 09:31:41 +0000 (10:31 +0100)] 
aarch64: fix swapcontext for BTI

setcontext returns to the specified context via an indirect jump,
so there should be a BTI j.

In case of getcontext (and all other returns_twice functions) the
compiler adds BTI j at the call site, but swapcontext is a normal
c call that is currently not handled specially by the compiler.

So we change swapcontext such that the saved context returns to a
local address that has BTI j and then swapcontext returns to the
caller via a normal RET. For this we save the original return
address in the slot for x1 of the context because x1 need not be
preserved by swapcontext but it is restored when the context saved
by swapcontext is resumed.

The alternative fix (which is done on x86) would make swapcontext
special in the compiler so BTI j is emitted at call sites, on
x86 there is an indirect_return attribute for this, on AArch64
we would have to use returns_twice. It was decided against because
such fix may need user code updates: the attribute has to be added
when swapcontext is called via a function pointer and it breaks
always_inline functions with swapcontext.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: Add BTI support to assembly files
Sudakshina Das [Tue, 17 Mar 2020 15:44:18 +0000 (15:44 +0000)] 
aarch64: Add BTI support to assembly files

To enable building glibc with branch protection, assembly code
needs BTI landing pads and ELF object file markings in the form
of a GNU property note.

The landing pads are unconditionally added to all functions that
may be indirectly called. When the code segment is not mapped
with PROT_BTI these instructions are nops. They are kept in the
code when BTI is not supported so that the layout of performance
critical code is unchanged across configurations.

The GNU property notes are only added when there is support for
BTI in the toolchain, because old binutils does not handle the
notes right. (Does not know how to merge them nor to put them in
PT_GNU_PROPERTY segment instead of PT_NOTE, and some versions
of binutils emit warnings about the unknown GNU property. In
such cases the produced libc binaries would not have valid
ELF marking so BTI would not be enabled.)

Note: functions using ENTRY or ENTRY_ALIGN now start with an
additional BTI c, so alignment of the following code changes,
but ENTRY_ALIGN_AND_PAD was fixed so there is no change to the
existing code layout. Some string functions may need to be
tuned for optimal performance after this commit.

Co-authored-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: Rename place holder .S files to .c
Szabolcs Nagy [Wed, 1 Apr 2020 08:52:37 +0000 (09:52 +0100)] 
aarch64: Rename place holder .S files to .c

The compiler can add required elf markings based on CFLAGS
but the assembler cannot, so using C code for empty files
creates less of a maintenance problem.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: configure test for BTI support
Szabolcs Nagy [Wed, 6 May 2020 19:22:16 +0000 (20:22 +0100)] 
aarch64: configure test for BTI support

Check BTI support in the compiler and linker.  The check also
requires READELF that understands the BTI GNU property note.
It is expected to succeed with gcc >=gcc-9 configured with
--enable-standard-branch-protection and binutils >=binutils-2.33.

Note: passing -mbranch-protection=bti in CFLAGS when building glibc
may not be enough to get a glibc that supports BTI because crtbegin*
and crtend* provided by the compiler needs to be BTI compatible too.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoRewrite abi-note.S in C.
Szabolcs Nagy [Wed, 1 Apr 2020 15:02:03 +0000 (16:02 +0100)] 
Rewrite abi-note.S in C.

Using C code allows the compiler to add target specific object file
markings based on CFLAGS.

The arm specific abi-note.S is removed and similar object file fix
up will be avoided on AArch64 with standard branch protection.

3 years agortld: Clean up PT_NOTE and add PT_GNU_PROPERTY handling
Szabolcs Nagy [Mon, 22 Jun 2020 09:56:38 +0000 (10:56 +0100)] 
rtld: Clean up PT_NOTE and add PT_GNU_PROPERTY handling

Add generic code to handle PT_GNU_PROPERTY notes. Invalid
content is ignored, _dl_process_pt_gnu_property is always called
after PT_LOAD segments are mapped and it has no failure modes.
Currently only one NT_GNU_PROPERTY_TYPE_0 note is handled, which
contains target specific properties: the _dl_process_gnu_property
hook is called for each property.

The old _dl_process_pt_note and _rtld_process_pt_note differ in how
the program header is read.  The old _dl_process_pt_note is called
before PT_LOAD segments are mapped and _rtld_process_pt_note is called
after PT_LOAD segments are mapped. The old _rtld_process_pt_note is
removed and _dl_process_pt_note is always called after PT_LOAD
segments are mapped and now it has no failure modes.

The program headers are scanned backwards so that PT_NOTE can be
skipped if PT_GNU_PROPERTY exists.

Co-Authored-By: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agostring: Move tst-strsignal tst-strerror to tests-container
Adhemerval Zanella [Wed, 8 Jul 2020 13:23:14 +0000 (10:23 -0300)] 
string: Move tst-strsignal tst-strerror to tests-container

Both tests require libc.mo translation files which might not be
installed on the system.

Checked on x86_64-linux-gnu.

3 years agostring: Fix prototype mismatch in sigabbrev_np, __sigdescr_np
Florian Weimer [Wed, 8 Jul 2020 12:19:58 +0000 (14:19 +0200)] 
string: Fix prototype mismatch in sigabbrev_np, __sigdescr_np

GCC 6 does not ignore the const specifier on the return type.

3 years agoarm: CVE-2020-6096: Fix multiarch memcpy for negative length [BZ #25620]
Alexander Anisimov [Wed, 8 Jul 2020 12:18:31 +0000 (14:18 +0200)] 
arm: CVE-2020-6096: Fix multiarch memcpy for negative length [BZ #25620]

Unsigned branch instructions could be used for r2 to fix the wrong
behavior when a negative length is passed to memcpy.
This commit fixes the armv7 version.

3 years agoarm: CVE-2020-6096: fix memcpy and memmove for negative length [BZ #25620]
Evgeny Eremin [Wed, 8 Jul 2020 12:18:19 +0000 (14:18 +0200)] 
arm: CVE-2020-6096: fix memcpy and memmove for negative length [BZ #25620]

Unsigned branch instructions could be used for r2 to fix the wrong
behavior when a negative length is passed to memcpy and memmove.
This commit fixes the generic arm implementation of memcpy amd memmove.

3 years agosunrpc: Remove hidden aliases for global data symbols (bug 26210)
Florian Weimer [Wed, 8 Jul 2020 05:58:51 +0000 (07:58 +0200)] 
sunrpc: Remove hidden aliases for global data symbols (bug 26210)

It is generally not possible to add hidden aliases for global data
symbols: If the main executable contains a copy relocation against
the symbol, the hidden aliases keep pointing to the glibc-internal
copy of the symbol, instead of the symbol actually used by the
application.

Fixes commit 89aacb513eb77549a29df2638913a0f8178cf3f5 ("sunrpc:
Remove stray exports without --enable-obsolete-rpc [BZ #23166]").

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agohurd: Fix strerror not setting errno
Samuel Thibault [Tue, 7 Jul 2020 21:46:53 +0000 (21:46 +0000)] 
hurd: Fix strerror not setting errno

* sysdeps/mach/strerror_l.c: Include <errno.h>.
(__strerror_l): Save errno on entry and restore it on exit.

3 years agotst-strsignal: fix checking for RT signals support
Samuel Thibault [Tue, 7 Jul 2020 21:24:48 +0000 (21:24 +0000)] 
tst-strsignal: fix checking for RT signals support

* string/tst-strsignal.c (do_test): Actually check that RT signals are
available by comparing SIGRTMAX to SIGRTMIN. Check that SIGRTMAX is 64
before testing for a message reporting 65 for SIGRTMAX+1.

3 years agohurd: Evaluate fd before entering the critical section
Samuel Thibault [Tue, 7 Jul 2020 20:09:29 +0000 (22:09 +0200)] 
hurd: Evaluate fd before entering the critical section

* sysdeps/hurd/include/hurd/fd.h (HURD_FD_PORT_USE_CANCEL): Evaluate fd
before calling _hurd_critical_section_lock.

3 years agoRewrite iconv option parsing [BZ #19519]
Arjun Shankar [Tue, 7 Jul 2020 18:31:48 +0000 (20:31 +0200)] 
Rewrite iconv option parsing [BZ #19519]

This commit replaces string manipulation during `iconv_open' and iconv_prog
option parsing with a structured, flag based conversion specification.  In
doing so, it alters the internal `__gconv_open' interface and accordingly
adjusts its uses.

This change fixes several hangs in the iconv program and therefore includes
a new test to exercise iconv_prog options that originally led to these hangs.
It also includes a new regression test for option handling in the iconv
function.

Reviewed-by: Florian Weimer <fweimer@redhat.com>
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agonss: Remove cryptographic key support from nss_files, nss_nis, nss_nisplus
Florian Weimer [Mon, 6 Jul 2020 18:20:44 +0000 (20:20 +0200)] 
nss: Remove cryptographic key support from nss_files, nss_nis, nss_nisplus

The interface has hard-coded buffer sizes and is therefore tied to
DES.  It also does not match current practice where different
services on the same host use different key material.

This change simplifies removal of the sunrpc code.

3 years agosunrpc: Do not export getrpcport by default
Florian Weimer [Mon, 6 Jul 2020 17:19:24 +0000 (19:19 +0200)] 
sunrpc: Do not export getrpcport by default

This function looks like an NSS function, but is actually a wrapper
around pmap_getport, so it should only be exported with
--enable-obsolete-rpc.

3 years agosunrpc: Do not export key handling hooks by default
Florian Weimer [Mon, 6 Jul 2020 15:59:26 +0000 (17:59 +0200)] 
sunrpc: Do not export key handling hooks by default

__key_encryptsession_pk_LOCAL, __key_decryptsession_pk_LOCAL,
__key_gendes_LOCAL had a default version symbol even without
--enable-obsolete-rpc.

3 years agosunrpc: Turn clnt_sperrno into a libc_hidden_nolink_sunrpc symbol
Florian Weimer [Mon, 6 Jul 2020 15:43:09 +0000 (17:43 +0200)] 
sunrpc: Turn clnt_sperrno into a libc_hidden_nolink_sunrpc symbol

Before this change, the function had a default symbol version even
without --enable-obsolete-rpc.

3 years agostring: Add strerrorname_np and strerrordesc_np
Adhemerval Zanella [Mon, 18 May 2020 20:41:25 +0000 (17:41 -0300)] 
string: Add strerrorname_np and strerrordesc_np

The strerrorname_np returns error number name (e.g. "EINVAL" for EINVAL)
while strerrordesc_np returns string describing error number (e.g
"Invalid argument" for EINVAL).  Different than strerror,
strerrordesc_np does not attempt to translate the return description,
both functions return NULL for an invalid error number.

They should be used instead of sys_errlist and sys_nerr, both are
thread and async-signal safe.  These functions are GNU extensions.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Add sigabbrev_np and sigdescr_np
Adhemerval Zanella [Mon, 18 May 2020 20:05:05 +0000 (17:05 -0300)] 
string: Add sigabbrev_np and sigdescr_np

The sigabbrev_np returns the abbreviated signal name (e.g. "HUP" for
SIGHUP) while sigdescr_np returns the string describing the error
number (e.g "Hangup" for SIGHUP).  Different than strsignal,
sigdescr_np does not attempt to translate the return description and
both functions return NULL for an invalid signal number.

They should be used instead of sys_siglist or sys_sigabbrev and they
are both thread and async-signal safe.  They are added as GNU
extensions on string.h header (same as strsignal).

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Add strerror_l on test-strerror-errno
Adhemerval Zanella [Mon, 18 May 2020 17:36:45 +0000 (14:36 -0300)] 
string: Add strerror_l on test-strerror-errno

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Add strerror, strerror_r, and strerror_l test
Adhemerval Zanella [Mon, 18 May 2020 17:36:19 +0000 (14:36 -0300)] 
string: Add strerror, strerror_r, and strerror_l test

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Add strsignal test
Adhemerval Zanella [Mon, 18 May 2020 13:16:48 +0000 (10:16 -0300)] 
string: Add strsignal test

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Simplify strerror_r
Adhemerval Zanella [Thu, 14 May 2020 21:14:43 +0000 (18:14 -0300)] 
string: Simplify strerror_r

Use snprintf instead of mempcpy plus itoa_word and remove unused
definitions.  There is no potential for infinite recursion because
snprintf only use strerror_r for the %m specifier.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Use tls-internal on strerror_l
Adhemerval Zanella [Thu, 14 May 2020 20:56:25 +0000 (17:56 -0300)] 
string: Use tls-internal on strerror_l

The buffer allocation uses the same strategy of strsignal.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Implement strerror in terms of strerror_l
Adhemerval Zanella [Thu, 14 May 2020 20:44:15 +0000 (17:44 -0300)] 
string: Implement strerror in terms of strerror_l

If the thread is terminated then __libc_thread_freeres will free the
storage via __glibc_tls_internal_free.

It is only within the calling thread that this matters.  It makes
strerror MT-safe.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agostring: Remove old TLS usage on strsignal
Adhemerval Zanella [Thu, 14 May 2020 20:02:38 +0000 (17:02 -0300)] 
string: Remove old TLS usage on strsignal

The per-thread state is refactored two use two strategies:

  1. The default one uses a TLS structure, which will be placed in the
     static TLS space (using __thread keyword).

  2. Linux allocates via struct pthread and access it through THREAD_*
     macros.

The default strategy has the disadvantage of increasing libc.so static
TLS consumption and thus decreasing the possible surplus used in
some scenarios (which might be mitigated by BZ#25051 fix).

It is used only on Hurd, where accessing the thread storage in the in
single thread case is not straightforward (afaiu, Hurd developers could
correct me here).

The fallback static allocation used for allocation failure is also
removed: defining its size is problematic without synchronizing with
translated messages (to avoid partial translation) and the resulting
usage is not thread-safe.

Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agolinux: Fix __NSIG_WORDS and add __NSIG_BYTES
Adhemerval Zanella [Thu, 23 Apr 2020 13:58:01 +0000 (10:58 -0300)] 
linux: Fix __NSIG_WORDS and add __NSIG_BYTES

The __NSIG_WORDS value is based on minimum number of words to hold
the maximum number of signals supported by the architecture.

This patch also adds __NSIG_BYTES, which is the number of bytes
required to represent the supported number of signals.  It is used in
syscalls which takes a sigset_t.

Checked on x86_64-linux-gnu and i686-linux-gnu.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosignal: Move sys_errlist to a compat symbol
Adhemerval Zanella [Sat, 25 Apr 2020 00:25:31 +0000 (21:25 -0300)] 
signal: Move sys_errlist to a compat symbol

The symbol is deprecated by strerror since its usage imposes some issues
such as copy relocations.

Its internal name is also changed to _sys_errlist_internal to avoid
static linking usage.  The compat code is also refactored by removing
the over enginered errlist-compat.c generation from manual entried and
extra comment token in linker script file.  It disantangle the code
generation from manual and simplify both Linux and Hurd compat code.

The definitions from errlist.c are moved to errlist.h and a new test
is added to avoid a new errno entry without an associated one in manual.

Checked on x86_64-linux-gnu and i686-linux-gnu. I also run a check-abi
on all affected platforms.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosignal: Move sys_siglist to a compat symbol
Adhemerval Zanella [Fri, 24 Apr 2020 14:09:00 +0000 (11:09 -0300)] 
signal: Move sys_siglist to a compat symbol

The symbol was deprecated by strsignal and its usage imposes issues
such as copy relocations.

Its internal name is changed to __sys_siglist and __sys_sigabbrev to
avoid static linking usage.  The compat code is also refactored, since
both Linux and Hurd usage the same strategy: export the same array with
different object sizes.

The libSegfault change avoids calling strsignal on the SIGFAULT signal
handler (the current usage is already sketchy, adding a call that
potentially issue locale internal function is even sketchier).

Checked on x86_64-linux-gnu and i686-linux-gnu. I also run a check-abi
on all affected platforms.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosignal: Add signum-{generic,arch}.h
Adhemerval Zanella [Wed, 22 Apr 2020 14:02:11 +0000 (11:02 -0300)] 
signal: Add signum-{generic,arch}.h

It refactor how signals are defined by each architecture.  Instead of
include a generic header (bits/signum-generic.h) and undef non-default
values in an arch specific header (bits/signum.h) the new scheme uses a
common definition (bits/signum-generic.h) and each architectures add
its specific definitions on a new header (bits/signum-arch.h).

For Linux it requires copy some system default definitions to alpha,
hppa, and sparc.  They are historical values and newer ports uses
the generic Linux signum-arch.h.

For Hurd the BSD signum is removed and moved to a new header (it is
used currently only on Hurd).

Checked on a build against all affected ABIs.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
3 years agoRemove most vfprintf width/precision-dependent allocations (bug 14231, bug 26211).
Joseph Myers [Tue, 7 Jul 2020 14:54:12 +0000 (14:54 +0000)] 
Remove most vfprintf width/precision-dependent allocations (bug 14231, bug 26211).

The vfprintf implementation (used for all printf-family functions)
contains complicated logic to allocate internal buffers of a size
depending on the width and precision used for a format, using either
malloc or alloca depending on that size, and with consequent checks
for size overflow and allocation failure.

As noted in bug 26211, the version of that logic used when '$' plus
argument number formats are in use is missing the overflow checks,
which can result in segfaults (quite possibly exploitable, I didn't
try to work that out) when the width or precision is in the range
0x7fffffe0 through 0x7fffffff (maybe smaller values as well in the
wprintf case on 32-bit systems, when the multiplication by sizeof
(CHAR_T) can overflow).

All that complicated logic in fact appears to be useless.  As far as I
can tell, there has been no need (outside the floating-point printf
code, which does its own allocations) for allocations depending on
width or precision since commit
3e95f6602b226e0de06aaff686dc47b282d7cc16 ("Remove limitation on size
of precision for integers", Sun Sep 12 21:23:32 1999 +0000).  Thus,
this patch removes that logic completely, thereby fixing both problems
with excessive allocations for large width and precision for
non-floating-point formats, and the problem with missing overflow
checks with such allocations.  Note that this does have the
consequence that width and precision up to INT_MAX are now allowed
where previously INT_MAX / sizeof (CHAR_T) - EXTSIZ or more would have
been rejected, so could potentially expose any other overflows where
the value would previously have been rejected by those removed checks.

I believe this completely fixes bugs 14231 and 26211.

Excessive allocations are still possible in the floating-point case
(bug 21127), as are other integer or buffer overflows (see bug 26201).
This does not address the cases where a precision larger than INT_MAX
(embedded in the format string) would be meaningful without printf's
return value overflowing (when it's used with a string format, or %g
without the '#' flag, so the actual output will be much smaller), as
mentioned in bug 17829 comment 8; using size_t internally for
precision to handle that case would be complicated by struct
printf_info being a public ABI.  Nor does it address the matter of an
INT_MIN width being negated (bug 17829 comment 7; the same logic
appears a second time in the file as well, in the form of multiplying
by -1).  There may be other sources of memory allocations with malloc
in printf functions as well (bug 24988, bug 16060).  From inspection,
I think there are also integer overflows in two copies of "if ((width
-= len) < 0)" logic (where width is int, len is size_t and a very long
string could result in spurious padding being output on a 32-bit
system before printf overflows the count of output characters).

Tested for x86-64 and x86.

3 years agoelf: Do not signal LA_ACT_CONSISTENT for an empty namespace [BZ #26076]
Florian Weimer [Tue, 7 Jul 2020 07:58:45 +0000 (09:58 +0200)] 
elf: Do not signal LA_ACT_CONSISTENT for an empty namespace [BZ #26076]

The auditing interface identifies namespaces by their first loaded
module.  Once the namespace is empty, it is no longer possible to signal
LA_ACT_CONSISTENT for it because the first loaded module is already gone
at that point.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoFix stringop-overflow errors from gcc 10 in iconv.
Stefan Liebler [Tue, 16 Jun 2020 12:24:20 +0000 (14:24 +0200)] 
Fix stringop-overflow errors from gcc 10 in iconv.

On s390x, I've recognize various -Werror=stringop-overflow messages
in iconv/loop.c and iconv/skeleton.c if build with gcc10 -O3.

With this commit gcc knows the size and do not raise those errors anymore.

3 years agox86: Add thresholds for "rep movsb/stosb" to tunables
H.J. Lu [Mon, 6 Jul 2020 18:48:09 +0000 (11:48 -0700)] 
x86: Add thresholds for "rep movsb/stosb" to tunables

Add x86_rep_movsb_threshold and x86_rep_stosb_threshold to tunables
to update thresholds for "rep movsb" and "rep stosb" at run-time.

Note that the user specified threshold for "rep movsb" smaller than
the minimum threshold will be ignored.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoUse C2x return value from getpayload of non-NaN (bug 26073).
Joseph Myers [Mon, 6 Jul 2020 16:18:02 +0000 (16:18 +0000)] 
Use C2x return value from getpayload of non-NaN (bug 26073).

In TS 18661-1, getpayload had an unspecified return value for a
non-NaN argument, while C2x requires the return value -1 in that case.

This patch implements the return value of -1.  I don't think this is
worth having a new symbol version that's an alias of the old one,
although occasionally we do that in such cases where the new function
semantics are a refinement of the old ones (to avoid programs relying
on the new semantics running on older glibc versions but not behaving
as intended).

Tested for x86_64 and x86; also ran math/ tests for aarch64 and
powerpc.

3 years agox86: Detect Extended Feature Disable (XFD)
H.J. Lu [Mon, 6 Jul 2020 13:57:08 +0000 (06:57 -0700)] 
x86: Detect Extended Feature Disable (XFD)

An extension called extended feature disable (XFD) is an extension added
for Intel AMX to the XSAVE feature set that allows an operating system
to enable a feature while preventing specific user threads from using
the feature.

3 years agox86: Correct bit_cpu_CLFSH [BZ #26208]
H.J. Lu [Mon, 6 Jul 2020 13:38:05 +0000 (06:38 -0700)] 
x86: Correct bit_cpu_CLFSH [BZ #26208]

bit_cpu_CLFSH should be (1u << 19), not (1u << 20).

3 years agomanual: Document __libc_single_threaded
Florian Weimer [Wed, 24 Jun 2020 12:32:26 +0000 (14:32 +0200)] 
manual: Document __libc_single_threaded

Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoAdd the __libc_single_threaded variable
Florian Weimer [Wed, 20 May 2020 13:40:35 +0000 (15:40 +0200)] 
Add the __libc_single_threaded variable

The variable is placed in libc.so, and it can be true only in
an outer libc, not libcs loaded via dlmopen or static dlopen.
Since thread creation from inner namespaces does not work,
pthread_create can update __libc_single_threaded directly.

Using __libc_early_init and its initial flag, implementation of this
variable is very straightforward.  A future version may reset the flag
during fork (but not in an inner namespace), or after joining all
threads except one.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoLinux: rseq registration tests
Mathieu Desnoyers [Mon, 6 Jul 2020 08:21:35 +0000 (10:21 +0200)] 
Linux: rseq registration tests

These tests validate that rseq is registered from various execution
contexts (main thread, destructor, other threads, other threads created
from destructor, forked process (without exec), pthread_atfork handlers,
pthread setspecific destructors, signal handlers, atexit handlers).

tst-rseq.c only links against libc.so, testing registration of rseq in
a non-multithreaded environment.

tst-rseq-nptl.c also links against libpthread.so, testing registration
of rseq in a multithreaded environment.

See the Linux kernel selftests for extensive rseq stress-tests.

3 years agoLinux: Use rseq in sched_getcpu if available
Mathieu Desnoyers [Mon, 6 Jul 2020 08:21:31 +0000 (10:21 +0200)] 
Linux: Use rseq in sched_getcpu if available

When available, use the cpu_id field from __rseq_abi on Linux to
implement sched_getcpu().  Fall-back on the vgetcpu vDSO if unavailable.

Benchmarks:

x86-64: Intel E5-2630 v3@2.40GHz, 16-core, hyperthreading

glibc sched_getcpu():                     13.7 ns (baseline)
glibc sched_getcpu() using rseq:           2.5 ns (speedup:  5.5x)
inline load cpuid from __rseq_abi TLS:     0.8 ns (speedup: 17.1x)

3 years agoLinux: Perform rseq registration at C startup and thread creation
Mathieu Desnoyers [Mon, 6 Jul 2020 08:21:16 +0000 (10:21 +0200)] 
Linux: Perform rseq registration at C startup and thread creation

Register rseq TLS for each thread (including main), and unregister for
each thread (excluding main).  "rseq" stands for Restartable Sequences.

See the rseq(2) man page proposed here:
  https://lkml.org/lkml/2018/9/19/647

Those are based on glibc master branch commit 3ee1e0ec5c.
The rseq system call was merged into Linux 4.18.

The TLS_STATIC_SURPLUS define is increased to leave additional room for
dlopen'd initial-exec TLS, which keeps elf/tst-auditmany working.

The increase (76 bytes) is larger than 32 bytes because it has not been
increased in quite a while.  The cost in terms of additional TLS storage
is quite significant, but it will also obscure some initial-exec-related
dlopen failures.

3 years agotst-cancel4: deal with ENOSYS errors
Samuel Thibault [Sun, 5 Jul 2020 17:21:45 +0000 (19:21 +0200)] 
tst-cancel4: deal with ENOSYS errors

The Hurd port doesn't have support for sigwaitinfo, sigtimedwait, and msgget
yet, so let us ignore the test for these when they return ENOSYS.

* nptl/tst-cancel4.c (tf_sigwaitinfo): Fallback on sigwait when
sigwaitinfo returns ENOSYS.
(tf_sigtimedwait): Likewise with sigtimedwait.
(tf_msgrcv, tf_msgsnd): Fallback on tf_usleep when msgget returns ENOSYS.

3 years agomanual: Show copyright information not just in the printed manual
Florian Weimer [Fri, 3 Jul 2020 08:06:24 +0000 (10:06 +0200)] 
manual: Show copyright information not just in the printed manual

@insertcopying was not used at all in the Info and HTML versions.
As a result, the notices that need to be present according to the
GNU Free Documentation License were missing.

This commit shows these notices above the table of contents in the
HTML version, and as part of the Main Menu node in the Info version.

Remove the "This file documents" line because it is redundant with the
following line.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoFix typo in comment in bug 26137 fix.
Joseph Myers [Wed, 1 Jul 2020 14:53:30 +0000 (14:53 +0000)] 
Fix typo in comment in bug 26137 fix.

3 years agoFix strtod multiple-precision division bug (bug 26137).
Joseph Myers [Tue, 30 Jun 2020 23:04:06 +0000 (23:04 +0000)] 
Fix strtod multiple-precision division bug (bug 26137).

Bug 26137 reports spurious "inexact" exceptions from strtod, on 32-bit
systems only, for a decimal argument that is exactly 1 + 2^-32.  In
fact the same issue also appears for 1 + 2^-64 and 1 + 2^-96 as
arguments to strtof128 on 32-bit systems, and 1 + 2^-64 as an argument
to strtof128 on 64-bit systems.  In FE_DOWNWARD or FE_TOWARDZERO mode,
the return value is also incorrect.

The problem is in the multiple-precision division logic used in the
case of dividing by a denominator that occupies at least three GMP
limbs.  There was a comment "The division does not work if the upper
limb of the two-limb mumerator is greater than the denominator.", but
in fact there were problems for the case of equality (that is, where
the high limbs are equal, offset by some multiple of the GMP limb
size) as well.  In such cases, the code used "quot = ~(mp_limb_t) 0;"
(with subsequent correction if that is an overestimate), because
udiv_qrnnd does not support the case of equality, but it's possible
for the shifted numerator to be greater than or equal to the
denominator, in which case that is an underestimate.  To avoid that,
this patch changes the ">" condition to ">=", meaning the first
division is done with a zero high word.

The tests added are all 1 + 2^-n for n from 1 to 113 except for those
that were already present in tst-strtod-round-data.

Tested for x86_64 and x86.