platform/upstream/glibc.git
3 years agosetrlimit/getrlimit: Use __nonnull to avoid null pointer
Xiaoming Ni [Mon, 4 Jan 2021 04:07:38 +0000 (12:07 +0800)]
setrlimit/getrlimit: Use __nonnull to avoid null pointer

Add __nonnull((2)) to the setrlimit()/getrlimit() function declaration
to avoid null pointer access.

-----
v2
  According to the suggestions of the Adhemerval Zanella and Zack Weinberg:
    use __nonnull() to check null pointers in the compilation phase.
    do not add pointer check code to setrlimit()/getrlimit().
    The validity of the "resource" parameter is checked in the syscall.
v1
  https://public-inbox.org/libc-alpha/20201230114131.47589-1-nixiaoming@huawei.com/
-----
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agobenchtests: Updated json bench-variant attribute
Naohiro Tamura [Mon, 8 Feb 2021 07:59:53 +0000 (07:59 +0000)]
benchtests: Updated json bench-variant attribute

This patch updates json "bench-variant" attribute of "bench-memset.c"
to "default" so that the script "benchtests/scripts/plot_strings.py"
can generate a file "memset_time_default_linear.png".
Without this patch, the script "benchtests/scripts/plot_strings.py"
generates a file "memset_time__linear.png" which has inconsistent form
with "memcpy_time_default_linear.png" and
"memmove_time_default_linear.png".

3 years agoregex: stop using alloca
Adhemerval Zanella [Mon, 16 Jul 2018 20:39:23 +0000 (17:39 -0300)]
regex: stop using alloca

It syncs with gnulib version 87ed1f9c4.  No functional changes is
expected.

Checked on x86_64-linux-gnu.

3 years agoregexec: remove alloca usage in build_trtable
Adhemerval Zanella [Mon, 11 Jan 2021 15:23:00 +0000 (12:23 -0300)]
regexec: remove alloca usage in build_trtable

It syncs with gnulib version 1731fef3d.  On build_trtable prevent
inlining, so that it doesn't bloat the caller's stack and use auto
variables instead of alloca/malloc.

After these changes, build_trtable's total stack allocation is
only 20 KiB on a 64-bit machine, and this is less than glibc's 64
KiB cutoff so there's little point to using alloca to shrink it.

Checked on x86_64-linux-gnu.

3 years agoregex: remove alloca usage on regex set_regs
Adhemerval Zanella [Mon, 16 Jul 2018 20:31:29 +0000 (17:31 -0300)]
regex: remove alloca usage on regex set_regs

It syncs with gnulib version b6207ab38.  It replaces the regmatch_t
with a dynarray list.

Checked on x86_64-linux-gnu.

3 years agomalloc: Sync dynarray with gnulib
Adhemerval Zanella [Mon, 11 Jan 2021 15:03:38 +0000 (12:03 -0300)]
malloc: Sync dynarray with gnulib

It syncs with gnulib version a8bac4d49.  The main changes are:

  - Remove the usage of anonymous union within DYNARRAY_STRUCT.
  - Use DYNARRAY_FREE instead of DYNARRAY_NAME (free) so that
    Gnulib does not change 'free' to 'rpl_free'.
  - Use __nonnull instead of __attribute__ ((nonnull ())).
  - Use __attribute_maybe_unused__ instead of
    __attribute__ ((unused, nonnull (1))).
  - Use of _Noreturn instead of _attribute__ ((noreturn)).

The only difference with gnulib is:

--- glibc
+++ gnulib
@@ -18,6 +18,7 @@

 #include <dynarray.h>
 #include <stdio.h>
+#include <stdlib.h>

 void
 __libc_dynarray_at_failure (size_t size, size_t index)
@@ -27,7 +28,6 @@
   __snprintf (buf, sizeof (buf), "Fatal glibc error: "
               "array index %zu not less than array length %zu\n",
               index, size);
- __libc_fatal (buf);
 #else
  abort ();
 #endif

It seems a wrong sync from gnulib (the code is used on loader and
thus it requires __libc_fatal instead of abort).

Checked on x86_64-linux-gnu.

3 years agomisc: Sync cdefs.h with gnulib
Adhemerval Zanella [Mon, 11 Jan 2021 14:53:32 +0000 (11:53 -0300)]
misc: Sync cdefs.h with gnulib

It adds __glibc_has_builtin, __glibc_has_extension, and
__attribute_maybe_unused__ alongsize with some fixes.

The differences are:

--- glibc
+++ gnulib
@@ -259,7 +259,9 @@
 # define __attribute_const__ /* Ignore */
 #endif

-#if __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
+#if defined __STDC_VERSION__ && 201710L < __STDC_VERSION__
+# define __attribute_maybe_unused__ [[__maybe_unused__]]
+#elif __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
 # define __attribute_maybe_unused__ __attribute__ ((__unused__))
 #else
 # define __attribute_maybe_unused__ /* Ignore */
@@ -485,7 +487,7 @@

 /* The #ifndef lets Gnulib avoid including these on non-glibc
    platforms, where the includes typically do not exist.  */
-#ifdef __GLIBC__
+#ifndef __WORDSIZE
 # include <bits/wordsize.h>
 # include <bits/long-double.h>
 #endif

The [[__attribute_maybe_unused__]] attribute removal __ is due Joseph
questioning gcc support with -std=c2x or -std=gnu2x [1].

The _WORDSIZE replacement by __GLIBC__ is because it does not play
well with internal cdefs.h that also uses
__LDOUBLE_REDIRECTS_TO_FLOAT128_ABI.

Checked on x86_64-linux-gnu.

[1] https://sourceware.org/pipermail/libc-alpha/2021-January/121600.html

3 years agolinux: Fix __sem_check_add_mapping search_sem
Adhemerval Zanella [Tue, 9 Feb 2021 19:09:51 +0000 (16:09 -0300)]
linux: Fix __sem_check_add_mapping search_sem

Similar to __sem_check_add_mapping fix, take in consideration the
trailling NULL.

Checked x86_64-linux-gnu.

3 years agolinux: Fix __sem_check_add_mapping name length
Adhemerval Zanella [Tue, 9 Feb 2021 17:40:06 +0000 (14:40 -0300)]
linux: Fix __sem_check_add_mapping name length

Take in consideration the trailling NULL since sem_search uses
strcmp to compare entries.

Checked on x86_64-linux-gnu and powerpc-linux-gnu (where it triggered
a nptl/tst-sem7 regression).

3 years agoAdd more ptrace constants for AArch64 and PowerPC.
Joseph Myers [Mon, 8 Feb 2021 22:47:04 +0000 (22:47 +0000)]
Add more ptrace constants for AArch64 and PowerPC.

Linux 5.10 adds PTRACE_PEEKMTETAGS and PTRACE_POKEMTETAGS for AArch64.
Adding those shows up that glibc is also missing PTRACE_SYSEMU and
PTRACE_SYSEMU_SINGLESTEP, for AArch64 (where they were added to Linux
in 5.3) and for PowerPC (where they were added in Linux 4.20); it
already has those two defines for x86.  Add all those defines to
glibc's headers.

Tested with build-many-glibcs.py for aarch64-linux-gnu and
powerpc-linux-gnu.

3 years agostrchr: Add additional benchmarks and tests
noah [Wed, 3 Feb 2021 05:39:00 +0000 (00:39 -0500)]
strchr: Add additional benchmarks and tests

This patch adds additional benchmarks and tests for string size of
4096 and several benchmarks for string size 256 with different
alignments.

3 years agox86-64: Refactor and improve performance of strchr-avx2.S
noah [Wed, 3 Feb 2021 05:38:59 +0000 (00:38 -0500)]
x86-64: Refactor and improve performance of strchr-avx2.S

No bug. Just seemed the performance could be improved a bit. Observed
and expected behavior are unchanged. Optimized body of main
loop. Updated page cross logic and optimized accordingly. Made a few
minor instruction selection modifications. No regressions in test
suite. Both test-strchrnul and test-strchr passed.

3 years agopthread: Remove alloca usage from __sem_check_add_mapping
Adhemerval Zanella [Wed, 3 Feb 2021 17:19:27 +0000 (14:19 -0300)]
pthread: Remove alloca usage from __sem_check_add_mapping

sem_open already returns EINVAL for input names larger than NAME_MAX,
so it can assume the largest name length with tfind.

Checked on x86_64-linux-gnu.

3 years agopthread: Refactor semaphore code
Adhemerval Zanella [Wed, 3 Feb 2021 16:50:21 +0000 (13:50 -0300)]
pthread: Refactor semaphore code

The internal semaphore list code is moved to a specific file,
sem_routine.c, and the internal usage is simplified to only two
functions (one to insert a new semaphore and one to remove it
from the internal list).  There is no need to expose the
internal locking, neither how the semaphore mapping is implemented.

No functional or semantic change is expected, tested on
x86_64-linux-gnu.

3 years agolinux: Require /dev/shm as the shared memory file system
Florian Weimer [Wed, 3 Feb 2021 11:55:13 +0000 (08:55 -0300)]
linux: Require /dev/shm as the shared memory file system

Previously, glibc would pick an arbitrary tmpfs file system from
/proc/mounts if /dev/shm was not available.  This could lead to
an unsuitable file system being picked for the backing storage for
shm_open, sem_open, and related functions.

This patch introduces a new function, __shm_get_name, which builds
the file name under the appropriate (now hard-coded) directory.  It is
called from the various shm_* and sem_* function.  Unlike the
SHM_GET_NAME macro it replaces, the callers handle the return values
and errno updates.  shm-directory.c is moved directly into the posix
subdirectory because it can be implemented directly using POSIX
functionality.  It resides in libc because it is needed by both
librt and nptl/htl.

In the sem_open implementation, tmpfname is initialized directly
from a string constant.  This happens to remove one alloca call.

Checked on x86_64-linux-gnu.

3 years agosunrpc: Fix typo in xdr_string comment
Paul Zimmermann [Wed, 3 Feb 2021 05:45:16 +0000 (06:45 +0100)]
sunrpc: Fix typo in xdr_string comment

3 years agotst: Provide test for ppoll
Lukasz Majewski [Wed, 13 Jan 2021 16:10:21 +0000 (17:10 +0100)]
tst: Provide test for ppoll

This change adds new test to assess ppoll()'s timeout related
functionality (the struct pollfd does not provide valid fd to wait
for - just wait for timeout).

To be more specific - two use cases are checked:
- if ppoll() times out immediately when passed struct timespec has zero
values of tv_nsec and tv_sec.
- if ppoll() times out after timeout specified in passed argument

3 years agotst: Provide test for timerfd related functions
Lukasz Majewski [Wed, 13 Jan 2021 12:35:40 +0000 (13:35 +0100)]
tst: Provide test for timerfd related functions

This change adds new test to assess functionality of timerfd_*
functions.
It creates new timer (operates on its file descriptor) and checks
if time before and after sleep is between expected values.

3 years agox86: Add PTWRITE feature detection [BZ #27346]
H.J. Lu [Thu, 4 Feb 2021 18:39:34 +0000 (10:39 -0800)]
x86: Add PTWRITE feature detection [BZ #27346]

1. Add CPUID_INDEX_14_ECX_0 for CPUID leaf 0x14 to detect PTWRITE feature
in EBX of CPUID leaf 0x14 with ECX == 0.
2. Add PTWRITE detection to CPU feature tests.
3. Add 2 static CPU feature tests.

3 years agonsswitch: return result when nss database is locked [BZ #27343]
Sergei Trofimovich [Fri, 5 Feb 2021 07:32:18 +0000 (07:32 +0000)]
nsswitch: return result when nss database is locked [BZ #27343]

Before the change nss_database_check_reload_and_get() did not populate
the '*result' value when it returned success in a case of chroot
detection. This caused initgroups() to use garage pointer in the
following test (extracted from unbound):

```

int main() {
    // load some NSS modules
    struct passwd * pw = getpwnam("root");

    chdir("/tmp");
    chroot("/tmp");
    chdir("/");
    // access nsswitch.conf in a chroot
    initgroups("root", 0);
}
```

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoprintf: Add smoke tests for long double
Siddhesh Poyarekar [Fri, 5 Feb 2021 04:22:52 +0000 (09:52 +0530)]
printf: Add smoke tests for long double

The printf tests have no coverage for long double.  Duplicate the
double tests so that we have some basic coverage.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoAdd NT_ARM_TAGGED_ADDR_CTRL from Linux 5.10 to elf.h.
Joseph Myers [Fri, 5 Feb 2021 01:47:57 +0000 (01:47 +0000)]
Add NT_ARM_TAGGED_ADDR_CTRL from Linux 5.10 to elf.h.

This patch adds the new NT_ARM_TAGGED_ADDR_CTRL constant from Linux
5.10 to glibc's elf.h.

Tested for x86_64.

3 years agoargp: Avoid undefined behaviour when invoking qsort().
Bruno Haible [Thu, 7 Jan 2021 01:06:20 +0000 (02:06 +0100)]
argp: Avoid undefined behaviour when invoking qsort().

This fixes a Gnulib test-argp-2.sh test failure on macOS and FreeBSD.

Reported by Jeffrey Walton <noloader@gmail.com> in
<https://lists.gnu.org/archive/html/bug-gnulib/2020-03/msg00085.html>.

* argp/argp-help.c (group_cmp): Remove third argument.
(hol_sibling_cluster_cmp, hol_cousin_cluster_cmp): New functions, based
upon hol_cluster_cmp.
(hol_cluster_cmp): Use hol_cousin_cluster_cmp.
(hol_entry_cmp): Rewritten to implement a total order.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoargp: Improve comments.
Bruno Haible [Thu, 7 Jan 2021 01:06:19 +0000 (02:06 +0100)]
argp: Improve comments.

* argp/argp-help.c: Add sectioning comments. Write NULL to designate a
null pointer.
(struct hol_entry): Fix comment regarding sort order of group.
(hol_entry_short_iterate, hol_entry_long_iterate): Add comment.
(until_short, canon_doc_option, hol_entry_qcmp): Improve comment.
(hol_cluster_is_child, argp_hol): Move functions.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoargp: Don't pass invalid arguments to isspace, isalnum, isalpha, isdigit.
Bruno Haible [Thu, 7 Jan 2021 01:06:18 +0000 (02:06 +0100)]
argp: Don't pass invalid arguments to isspace, isalnum, isalpha, isdigit.

* lib/argp-help.c (SKIPWS): Cast character to 'unsigned char' before passing it
to isspace().
(fill_in_uparams): Likewise for isalpha(), isalnum(), isdigit().
(canon_doc_option): Likewise for isspace(), isalnum().

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoargp: Don't rely on undefined behaviour of _tolower().
Bruno Haible [Thu, 7 Jan 2021 01:06:17 +0000 (02:06 +0100)]
argp: Don't rely on undefined behaviour of _tolower().

Patch by Eric Blake
<https://lists.gnu.org/archive/html/bug-gnulib/2009-09/msg00287.html>.

* argp/argp-help.c (hol_entry_cmp): Don't use _tolower on values that are
not upper-case.  Pass correct range to tolower.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoargp: fix pointer-subtraction bug
Paul Eggert [Thu, 7 Jan 2021 01:06:16 +0000 (02:06 +0100)]
argp: fix pointer-subtraction bug

* argp/argp-help.c (hol_append): Don't subtract pointers to
different arrays, as this can run afoul of -fcheck-pointer-bounds.
See the thread containing Bruno Haible's report in:
http://lists.gnu.org/archive/html/bug-gnulib/2017-05/msg00171.html

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoUse binutils 2.36 branch in build-many-glibcs.py.
Joseph Myers [Thu, 4 Feb 2021 16:00:36 +0000 (16:00 +0000)]
Use binutils 2.36 branch in build-many-glibcs.py.

This patch makes build-many-glibcs.py use binutils 2.36 branch.

Tested with build-many-glibcs.py (compilers and glibcs builds).

3 years agomanual: Correct description of ENTRY [BZ #17183]
Florian Weimer [Thu, 4 Feb 2021 14:02:38 +0000 (15:02 +0100)]
manual: Correct description of ENTRY [BZ #17183]

The struct tag is actually entry (not ENTRY).  The data member has
type void *, and it can point to binary data.  Only the key member is
required to be a null-terminated string.

Reviewed-by: Arjun Shankar <arjun@redhat.com>
3 years agonptl: Remove private futex optimization [BZ #27304]
Florian Weimer [Thu, 4 Feb 2021 14:00:20 +0000 (15:00 +0100)]
nptl: Remove private futex optimization [BZ #27304]

It is effectively used, unexcept for pthread_cond_destroy, where we do
not want it; see bug 27304.  The internal locks do not support a
process-shared mode.

This fixes commit dc6cfdc934db9997c33728082d63552b9eee4563 ("nptl:
Move pthread_cond_destroy implementation into libc").

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agostdio-common: Add a few double formatting tests [BZ #27245]
Mike Hommey [Wed, 27 Jan 2021 04:45:05 +0000 (13:45 +0900)]
stdio-common: Add a few double formatting tests [BZ #27245]

Checked on x86_64-linux-gnu.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years ago posix/tst-rfc3484: Fix compile failure linking to local __stat64
Stafford Horne [Wed, 3 Feb 2021 18:36:47 +0000 (15:36 -0300)]
 posix/tst-rfc3484: Fix compile failure linking to local __stat64

After 04986243d1 ("Remove internal usage of extensible stat functions")
linking the __stat64 symbol in getaddrinfo for this test fails with the
below error:

    [...] or1k-smh-linux-gnu/bin/ld: [...]/posix/tst-rfc3484.o: in function `gaiconf_reload':
    [...]/sysdeps/posix/getaddrinfo.c:2136: undefined reference to `__stat64'
    collect2: error: ld returned 1 exit status

This is because __stat64 is a local symbol, the test includes the
getaddrinfo directly and fails to link against the local symbol.  Fix
this by setting up an alias to the global stat64 symbol name like is
done for other local symbol usage.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoi686: Regenerate ULPs
Siddhesh Poyarekar [Wed, 3 Feb 2021 17:41:43 +0000 (23:11 +0530)]
i686: Regenerate ULPs

3 years agotst-rtld-list-tunables.sh: Unset glibc tunables
H.J. Lu [Tue, 2 Feb 2021 17:31:56 +0000 (09:31 -0800)]
tst-rtld-list-tunables.sh: Unset glibc tunables

Unset glibc tunables and their aliases for --list-tunables test.

3 years agolinux: Remove shmmax check from tst-sysvshm-linux
Adhemerval Zanella [Tue, 2 Feb 2021 12:55:50 +0000 (09:55 -0300)]
linux: Remove shmmax check from tst-sysvshm-linux

The shmmax expected value is tricky to check because kernel clamps it
to INT_MAX in two cases:

  1. Compat symbols with IPC_64, i.e, 32-bit binaries running on 64-bit
     kernels.

  2. Default symbol without IPC_64 (defined as IPC_OLD within Linux) and
     glibc always use IPC_64 for 32-bit ABIs (to support 64-bit time_t).
     It means that 32-bit binaries running on 32-bit kernels will not see
     shmmax being clamped.

And finding out whether the compat symbol is used would require checking
the underlying kernel against the current ABI.  The shmall and shmmni
already provided enough coverage.

Checked on x86_64-linux-gnu and i686-linux-gnu.  It should fix the
tst-sysvshm-linux failures on 32-bit kernels.

3 years agox86: Adding an upper bound for Enhanced REP MOVSB.
Sajan Karumanchi [Tue, 2 Feb 2021 11:42:14 +0000 (12:42 +0100)]
x86: Adding an upper bound for Enhanced REP MOVSB.

In the process of optimizing memcpy for AMD machines, we have found the
vector move operations are outperforming enhanced REP MOVSB for data
transfers above the L2 cache size on Zen3 architectures.
To handle this use case, we are adding an upper bound parameter on
enhanced REP MOVSB:'__x86_rep_movsb_stop_threshold'.
As per large-bench results, we are configuring this parameter to the
L2 cache size for AMD machines and applicable from Zen3 architecture
supporting the ERMS feature.
For architectures other than AMD, it is the computed value of
non-temporal threshold parameter.

Reviewed-by: Premachandra Mallappa <premachandra.mallappa@amd.com>
3 years agoFix version.h for glibc 2.34 development
Adhemerval Zanella [Tue, 2 Feb 2021 11:22:25 +0000 (08:22 -0300)]
Fix version.h for glibc 2.34 development

3 years agoAdd MS_NOSYMFOLLOW from Linux 5.10 to <sys/mount.h>.
Joseph Myers [Tue, 2 Feb 2021 01:17:00 +0000 (01:17 +0000)]
Add MS_NOSYMFOLLOW from Linux 5.10 to <sys/mount.h>.

This patch adds the new constant MS_NOSYMFOLLOW from Linux 5.10 to
<sys/mount.h>.

Tested for x86_64.

3 years agoMove _SC_MINSIGSTKSZ/_SC_SIGSTKSZ entry in NEWS
H.J. Lu [Mon, 1 Feb 2021 23:50:51 +0000 (15:50 -0800)]
Move _SC_MINSIGSTKSZ/_SC_SIGSTKSZ entry in NEWS

Move _SC_MINSIGSTKSZ/_SC_SIGSTKSZ entry to 2.34 section.

3 years agolibSegFault: Fix printing signal number [BZ #27249]
Vitaly Chikunov [Mon, 1 Feb 2021 20:04:08 +0000 (23:04 +0300)]
libSegFault: Fix printing signal number [BZ #27249]

Signal number is written into the tail of buf, but printed from the
beginning, outputting garbage on the screen.  Fix this by printing
from the correct position.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Dmitry V. Levin <ldv@altlinux.org>
3 years agohurd TIOCFLUSH: fix fixing argument
Samuel Thibault [Mon, 1 Feb 2021 19:00:18 +0000 (20:00 +0100)]
hurd TIOCFLUSH: fix fixing argument

The argument actually used inside send_rpc is argptr, not arg.

3 years agosysconf: Add _SC_MINSIGSTKSZ/_SC_SIGSTKSZ [BZ #20305]
H.J. Lu [Mon, 1 Feb 2021 19:00:38 +0000 (11:00 -0800)]
sysconf: Add _SC_MINSIGSTKSZ/_SC_SIGSTKSZ [BZ #20305]

Add _SC_MINSIGSTKSZ for the minimum signal stack size derived from
AT_MINSIGSTKSZ, which is the minimum number of bytes of free stack
space required in order to gurantee successful, non-nested handling
of a single signal whose handler is an empty function, and _SC_SIGSTKSZ
which is the suggested minimum number of bytes of stack space required
for a signal stack.

If AT_MINSIGSTKSZ isn't available, sysconf (_SC_MINSIGSTKSZ) returns
MINSIGSTKSZ.  On Linux/x86 with XSAVE, the signal frame used by kernel
is composed of the following areas and laid out as:

 ------------------------------
 | alignment padding          |
 ------------------------------
 | xsave buffer               |
 ------------------------------
 | fsave header (32-bit only) |
 ------------------------------
 | siginfo + ucontext         |
 ------------------------------

Compute AT_MINSIGSTKSZ value as size of xsave buffer + size of fsave
header (32-bit only) + size of siginfo and ucontext + alignment padding.

If _SC_SIGSTKSZ_SOURCE or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ
are redefined as

/* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
 # undef SIGSTKSZ
 # define SIGSTKSZ sysconf (_SC_SIGSTKSZ)

/* Minimum stack size for a signal handler: SIGSTKSZ.  */
 # undef MINSIGSTKSZ
 # define MINSIGSTKSZ SIGSTKSZ

Compilation will fail if the source assumes constant MINSIGSTKSZ or
SIGSTKSZ.

The reason for not simply increasing the kernel's MINSIGSTKSZ #define
(apart from the fact that it is rarely used, due to glibc's shadowing
definitions) was that userspace binaries will have baked in the old
value of the constant and may be making assumptions about it.

For example, the type (char [MINSIGSTKSZ]) changes if this #define
changes.  This could be a problem if an newly built library tries to
memcpy() or dump such an object defined by and old binary.
Bounds-checking and the stack sizes passed to things like sigaltstack()
and makecontext() could similarly go wrong.

3 years agohurd TIOCFLUSH: Cope BSD 4.1 semantic
Samuel Thibault [Mon, 1 Feb 2021 18:39:48 +0000 (19:39 +0100)]
hurd TIOCFLUSH: Cope BSD 4.1 semantic

BSD 4.1 did not have an argument for TIOCFLUSH, BSD 4.2 added it. There
are still a lot of applications out there that pass a NULL argument to
TIOCFLUSH, so we should rather cope with it.

3 years agotst-mallinfo2.c: Remove useless trailing semicolon for macro
Yang Xu [Mon, 1 Feb 2021 18:19:43 +0000 (19:19 +0100)]
tst-mallinfo2.c: Remove useless trailing semicolon for macro

Macros should not use a trailing semicolon, so remove it.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoelf: Replace a --defsym trick with an object file to be compatible with LLD
Fangrui Song [Mon, 1 Feb 2021 17:29:26 +0000 (09:29 -0800)]
elf: Replace a --defsym trick with an object file to be compatible with LLD

The existing code specifies -Wl,--defsym=malloc=0 and other malloc.os
definitions before libc_pic.a so that libc_pic.a(malloc.os) is not
fetched. This trick is used to avoid multiple definition errors which
would happen as a chain result:

  dl-allobjs.os has an undefined __libc_scratch_buffer_set_array_size
  __libc_scratch_buffer_set_array_size fetches libc_pic.a(scratch_buffer_set_array_size.os)
  libc_pic.a(scratch_buffer_set_array_size.os) has an undefined free
  free fetches libc_pic.a(malloc.os)
  libc_pic.a(malloc.os) has an undefined __libc_message
  __libc_message fetches libc_pic.a(libc_fatal.os)

  libc_fatal.os will cause a multiple definition error (__GI___libc_fatal)
  >>> defined at dl-fxstatat64.c
  >>>            /tmp/p/glibc/Release/elf/dl-allobjs.os:(__GI___libc_fatal)
  >>> defined at libc_fatal.c
  >>>            libc_fatal.os:(.text+0x240) in archive /tmp/p/glibc/Release/libc_pic.a

LLD processes --defsym after all input files, so this trick does not
suppress multiple definition errors with LLD. Split the step into two
and use an object file to make the intention more obvious and make LLD
work.

This is conceptually more appropriate because --defsym defines a SHN_ABS
symbol while a normal definition is relative to the image base.

See https://sourceware.org/pipermail/libc-alpha/2020-March/111910.html
for discussions about the --defsym semantics.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
3 years agoOpen master branch for glibc 2.34 development
Adhemerval Zanella [Mon, 1 Feb 2021 17:04:23 +0000 (14:04 -0300)]
Open master branch for glibc 2.34 development

3 years agoPrepare for glibc 2.33 release
Adhemerval Zanella [Mon, 1 Feb 2021 16:46:41 +0000 (13:46 -0300)]
Prepare for glibc 2.33 release

Update version.h, features.h, and ChangeLog.old/ChangeLog.22.

3 years agoUpdate NEWS with bugs
Adhemerval Zanella [Mon, 1 Feb 2021 16:44:05 +0000 (13:44 -0300)]
Update NEWS with bugs

3 years agoUpdate translations
Adhemerval Zanella [Mon, 1 Feb 2021 17:09:36 +0000 (14:09 -0300)]
Update translations

Add missing Serbian translation.

3 years agoNEWS: Fix typo in CVE-2021-3326 entry
Florian Weimer [Fri, 29 Jan 2021 17:20:54 +0000 (18:20 +0100)]
NEWS: Fix typo in CVE-2021-3326 entry

3 years agoelf: Fix tests that rely on ld.so.cache for cross-compiling
Adhemerval Zanella [Fri, 29 Jan 2021 13:30:19 +0000 (10:30 -0300)]
elf: Fix tests that rely on ld.so.cache for cross-compiling

For configurations with cross-compiling equal to 'maybe' or 'no',
ldconfig will not run and thus the ld.so.cache will not be created
on the container testroot.pristine.

This lead to failures on both tst-glibc-hwcaps-prepend-cache and
tst-ldconfig-ld_so_conf-update on environments where the same
compiler can be used to build different ABIs (powerpc and x86 for
instance).

This patch addas a new test-container hook, ldconfig.run, that
triggers a ldconfig execution prior the test execution.

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

3 years agoNEWS: Mention CVE-2021-3326 (iconv assertion with ISO-20220-JP-3)
Florian Weimer [Fri, 29 Jan 2021 16:29:57 +0000 (17:29 +0100)]
NEWS: Mention CVE-2021-3326 (iconv assertion with ISO-20220-JP-3)

3 years agoNEWS: Add entry for glibc-hwcaps and deprecate legacy hwcaps
Florian Weimer [Fri, 29 Jan 2021 16:26:18 +0000 (17:26 +0100)]
NEWS: Add entry for glibc-hwcaps and deprecate legacy hwcaps

3 years agox86: Properly set usable CET feature bits [BZ #26625]
H.J. Lu [Wed, 27 Jan 2021 04:48:45 +0000 (20:48 -0800)]
x86: Properly set usable CET feature bits [BZ #26625]

commit 94cd37ebb293321115a36a422b091fdb72d2fb08
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 16 05:27:32 2020 -0700

    x86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]

broke

GLIBC_TUNABLES=glibc.cpu.hwcaps=-IBT,-SHSTK

since it can no longer disable IBT nor SHSTK.  Handle IBT and SHSTK with:

1. Revert commit 94cd37ebb293321115a36a422b091fdb72d2fb08.
2. Clears the usable CET feature bits if kernel doesn't support CET.
3. Add GLIBC_TUNABLES tests without dlopen.
4. Add tests to verify that CPU_FEATURE_USABLE on IBT and SHSTK matches
_get_ssp.
5. Update GLIBC_TUNABLES tests with dlopen to verify that CET is disabled
with GLIBC_TUNABLES.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoUpdate translations
Adhemerval Zanella [Thu, 28 Jan 2021 16:45:09 +0000 (13:45 -0300)]
Update translations

3 years agoUpdate libc.pot for 2.33 release
Adhemerval Zanella [Wed, 27 Jan 2021 20:09:23 +0000 (17:09 -0300)]
Update libc.pot for 2.33 release

3 years agoUpdate ia64 libm-test-ulps
Adhemerval Zanella [Thu, 28 Jan 2021 13:32:53 +0000 (10:32 -0300)]
Update ia64 libm-test-ulps

3 years agosh: Update libm-tests-ulps
Adhemerval Zanella [Thu, 28 Jan 2021 14:37:17 +0000 (11:37 -0300)]
sh: Update libm-tests-ulps

3 years agoia64: Fix brk call on statup
Adhemerval Zanella [Thu, 28 Jan 2021 13:27:30 +0000 (10:27 -0300)]
ia64: Fix brk call on statup

brk used by statup before TCB is properly set, so we can't use
IA64_USE_NEW_STUB.

This patch fixes a regression introduced by 720480934ab910.

Checked on ia64-linux-gnu.

3 years agoUpdate sparc libm-test-ulps
Adhemerval Zanella [Thu, 28 Jan 2021 11:44:11 +0000 (08:44 -0300)]
Update sparc libm-test-ulps

3 years agoUpdate alpha libm-test-ulps
Adhemerval Zanella [Wed, 27 Jan 2021 20:23:28 +0000 (17:23 -0300)]
Update alpha libm-test-ulps

3 years agopowerpc64: Workaround sigtramp vdso return call
Raoni Fassina Firmino [Wed, 27 Jan 2021 19:23:05 +0000 (16:23 -0300)]
powerpc64: Workaround sigtramp vdso return call

A not so recent kernel change[1] changed how the trampoline
`__kernel_sigtramp_rt64` is used to call signal handlers.

This was exposed on the test misc/tst-sigcontext-get_pc

Before kernel 5.9, the kernel set LR to the trampoline address and
jumped directly to the signal handler, and at the end the signal
handler, as any other function, would `blr` to the address set.  In
other words, the trampoline was executed just at the end of the signal
handler and the only thing it did was call sigreturn.  But since
kernel 5.9 the kernel set CTRL to the signal handler and calls to the
trampoline code, the trampoline then `bctrl` to the address in CTRL,
setting the LR to the next instruction in the middle of the
trampoline, when the signal handler returns, the rest of the
trampoline code executes the same code as before.

Here is the full trampoline code as of kernel 5.11.0-rc5 for
reference:

    V_FUNCTION_BEGIN(__kernel_sigtramp_rt64)
    .Lsigrt_start:
            bctrl   /* call the handler */
            addi    r1, r1, __SIGNAL_FRAMESIZE
            li      r0,__NR_rt_sigreturn
            sc
    .Lsigrt_end:
    V_FUNCTION_END(__kernel_sigtramp_rt64)

This new behavior breaks how `backtrace()` uses to detect the
trampoline frame to correctly reconstruct the stack frame when it is
called from inside a signal handling.

This workaround rely on the fact that the trampoline code is at very
least two (maybe 3?) instructions in size (as it is in the 32 bits
version, only on `li` and `sc`), so it is safe to check the return
address be in the range __kernel_sigtramp_rt64 .. + 4.

[1] subject: powerpc/64/signal: Balance return predictor stack in signal trampoline
    commit: 0138ba5783ae0dcc799ad401a1e8ac8333790df9
    url: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0138ba5783ae0dcc799ad401a1e8ac8333790df9

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoFix nss/tst-reload2 for systems without PATH_MAX
DJ Delorie [Thu, 28 Jan 2021 01:05:26 +0000 (20:05 -0500)]
Fix nss/tst-reload2 for systems without PATH_MAX

3 years agonsswitch: do not reload if "/" changes
DJ Delorie [Sat, 16 Jan 2021 00:50:00 +0000 (19:50 -0500)]
nsswitch: do not reload if "/" changes

https://sourceware.org/bugzilla/show_bug.cgi?id=27077

Before reloading nsswitch.conf, verify that the root directory
hasn't changed - if it has, it's likely that we've entered a
container and should not trust the nsswitch inside the container
nor load any shared objects therein.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoelf: Limit tst-prelink-cmp target archs
Matheus Castanho [Tue, 15 Dec 2020 18:35:41 +0000 (15:35 -0300)]
elf: Limit tst-prelink-cmp target archs

elf/tst-prelink-cmp was initially added for x86 (commit fe534fe898) to validate
the fix for Bug 19178, and later applied to all architectures that use GLOB_DAT
relocations (commit 89569c8bb6).  However, that bug only affected targets that
handle GLOB_DAT relocations as ELF_TYPE_CLASS_EXTERN_PROTECTED_DATA, so the test
should only apply to targets defining DL_EXTERN_PROTECTED_DATA, which gates the
usage of the elf type class above.  For all other targets not meeting that
criteria, the test now returns with UNSUPPORTED status.

Fixes the test on POWER10 processors, which started using R_PPC64_GLOB_DAT.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agogconv: Fix assertion failure in ISO-2022-JP-3 module (bug 27256)
Florian Weimer [Wed, 27 Jan 2021 12:36:12 +0000 (13:36 +0100)]
gconv: Fix assertion failure in ISO-2022-JP-3 module (bug 27256)

The conversion loop to the internal encoding does not follow
the interface contract that __GCONV_FULL_OUTPUT is only returned
after the internal wchar_t buffer has been filled completely.  This
is enforced by the first of the two asserts in iconv/skeleton.c:

      /* We must run out of output buffer space in this
 rerun.  */
      assert (outbuf == outerr);
      assert (nstatus == __GCONV_FULL_OUTPUT);

This commit solves this issue by queuing a second wide character
which cannot be written immediately in the state variable, like
other converters already do (e.g., BIG5-HKSCS or TSCII).

Reported-by: Tavis Ormandy <taviso@gmail.com>
3 years agoRevert "Make libc symbols hidden in static PIE" [BZ #27237]
Szabolcs Nagy [Wed, 27 Jan 2021 09:44:19 +0000 (09:44 +0000)]
Revert "Make libc symbols hidden in static PIE" [BZ #27237]

This reverts commit 2682695e5c7acf1e60dd3b5c3a14d4e82416262c.
Fixes bug 27237.

That commit turned out to be too intrusive affecting crt files, test
system and benchmark files.  They should not be affected, but the
build system does not set the MODULE_NAME and LIBC_NONSHARED reliably.

3 years agobenchtests: Do not build bench-timing-type with MODULE_NAME=libc
Arjun Shankar [Tue, 26 Jan 2021 17:14:19 +0000 (18:14 +0100)]
benchtests: Do not build bench-timing-type with MODULE_NAME=libc

Since commit 2682695e5c7a, `make bench-build' with `--enable-static-pie'
fails due to bench-timing-type being incorrectly built with MODULE_NAME
set to `libc'.  This commit sets MODULE_NAME to nonlib, thus fixing the
build failure.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoaarch64: Fix the list of tested IFUNC variants [BZ #26818]
Szabolcs Nagy [Fri, 22 Jan 2021 16:57:32 +0000 (16:57 +0000)]
aarch64: Fix the list of tested IFUNC variants [BZ #26818]

Some IFUNC variants are not compatible with BTI and MTE so don't
set them as usable for testing and benchmarking on a BTI or MTE
enabled system.

As far as IFUNC selectors are concerned a system is BTI enabled if
the cpu supports it and glibc was built with BTI branch protection.

Most IFUNC variants are BTI compatible, but thunderx2 memcpy and
memmove use a jump table with indirect jump, without a BTI j.

Fixes bug 26818.

3 years agoUpdate INSTALL with package versions that are known to work
Tulio Magno Quites Machado Filho [Mon, 25 Jan 2021 16:13:17 +0000 (13:13 -0300)]
Update INSTALL with package versions that are known to work

Most packages have been tested with their latest releases, except for
Python, whose latest version is 3.9.1.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: Move and update the definition of MTE_ENABLED
Szabolcs Nagy [Fri, 22 Jan 2021 16:14:05 +0000 (16:14 +0000)]
aarch64: Move and update the definition of MTE_ENABLED

The hwcap value is now in linux 5.10 and in glibc bits/hwcap.h, so use
that definition.

Move the definition to init-arch.h so all ifunc selectors can use it
and expose an "mte" shorthand for mte enabled runtime.

For now we allow user code to enable tag checks and use PROT_MTE
mappings without libc involvment, this is not guaranteed ABI, but
can be useful for testing and debugging with MTE.

3 years agoFix misplaced const
Andreas Schwab [Mon, 25 Jan 2021 13:29:45 +0000 (14:29 +0100)]
Fix misplaced const

Constify __x86_cacheinfo_p and __x86_cpu_features_p, not their pointer
target types.

3 years agoUpdate C-SKY libm-test-ulps
Mao Han [Fri, 22 Jan 2021 07:45:34 +0000 (07:45 +0000)]
Update C-SKY libm-test-ulps

3 years agomanual: Correct argument order in mount examples [BZ #27207]
John McCabe [Tue, 19 Jan 2021 18:25:25 +0000 (18:25 +0000)]
manual: Correct argument order in mount examples [BZ #27207]

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agolinux: mips: Fix getdents64 fallback on mips64-n32
Adhemerval Zanella [Mon, 16 Nov 2020 19:52:36 +0000 (16:52 -0300)]
linux: mips: Fix getdents64 fallback on mips64-n32

GCC mainline shows the following error:

../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c: In function '__getdents64':
../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c:121:7: error: 'memcpy' forming offset [4, 7] is out of the bounds [0, 4] [-Werror=array-bounds]
  121 |       memcpy (((char *) dp + offsetof (struct dirent64, d_ino)),
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  122 |               KDP_MEMBER (kdp, d_ino), sizeof ((struct dirent64){0}.d_ino));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/mips/mips64/getdents64.c:123:7: error: 'memcpy' forming offset [4, 7] is out of the bounds [0, 4] [-Werror=array-bounds]
  123 |       memcpy (((char *) dp + offsetof (struct dirent64, d_off)),
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  124 |               KDP_MEMBER (kdp, d_off), sizeof ((struct dirent64){0}.d_off));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The issue is due both d_ino and d_off fields for mips64-n32
kernel_dirent are 32-bits, while this is using memcpy to copy 64 bits
from it into the glibc dirent64.

The fix is to use a temporary buffer to read the correct type
from kernel_dirent.

Checked with a build-many-glibcs.py for mips64el-linux-gnu and I
also checked the tst-getdents64 on mips64el 4.1.4 kernel with
and without fallback enabled (by manually setting the
getdents64_supported).

3 years agox86: Properly match CPU features in /proc/cpuinfo [BZ #27222]
H.J. Lu [Thu, 21 Jan 2021 19:12:30 +0000 (11:12 -0800)]
x86: Properly match CPU features in /proc/cpuinfo [BZ #27222]

Search " YYY " and " YYY\n", instead of "YYY", to avoid matching
"XXXYYYZZZ" with "YYY".

Update /proc/cpuinfo CPU feature names:

/proc/cpuinfo                     glibc
------------------------------------------------
avx512vbmi                        AVX512_VBMI
dts                               DS
pni                               SSE3
tsc_deadline_timer                TSC_DEADLINE

3 years agox86-64: Update tst-glibc-hwcaps-2.c for x86-64 baseline
H.J. Lu [Thu, 21 Jan 2021 19:57:27 +0000 (11:57 -0800)]
x86-64: Update tst-glibc-hwcaps-2.c for x86-64 baseline

Return EXIT_FAILURE only if the level 2 libx86-64-isa-level.so is used
on x86-64 baseline machine.

3 years agopowerpc64: Select POWER9 machine for the scv instruction
Florian Weimer [Thu, 21 Jan 2021 17:16:49 +0000 (18:16 +0100)]
powerpc64: Select POWER9 machine for the scv instruction

It is not available with the baseline ISA.

Fixes commit 68ab82f56690ada86ac1e0c46bad06ba189a10ef
("powerpc: Runtime selection between sc and scv for syscalls").

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
3 years agox86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]
H.J. Lu [Tue, 12 Jan 2021 22:41:10 +0000 (14:41 -0800)]
x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]

Check ifunc resolver with CPU_FEATURE_USABLE and tunables in dynamic and
static executables to verify that CPUID features are initialized early in
static PIE.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoRevert "linux: Move {f}xstat{at} to compat symbols" for static build
Adhemerval Zanella [Tue, 29 Dec 2020 13:21:29 +0000 (13:21 +0000)]
Revert "linux: Move {f}xstat{at} to compat symbols" for static build

This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 for static
library.  This avoids the need to rebuild the world for the case where
libstdc++ (and potentially other libraries) are linked to a old glibc.

To avoid requering to provide xstat symbols for newer ABIs (such as
riscv32) a new LIB_COMPAT macro is added.  It is similar to SHLIB_COMPAT
but also works for static case (thus evaluating similar to SHLIB_COMPAT
for both shared and static case).

Checked with a check-abi on all affected ABIs. I also check if the
static library does contains the xstat symbols.

3 years agoaarch64: revert memcpy optimze for kunpeng to avoid performance degradation
Shuo Wang [Wed, 20 Jan 2021 07:20:44 +0000 (15:20 +0800)]
aarch64: revert memcpy optimze for kunpeng to avoid performance degradation

In commit 863d775c481704baaa41855fc93e5a1ca2dc6bf6, kunpeng920 is added to default memcpy version,
however, there is performance degradation when the copy size is some large bytes, eg: 100k.
This is the result, tested in glibc-2.28:
             before backport  after backport  Performance improvement
memcpy_1k      0.005              0.005                 0.00%
memcpy_10k     0.032              0.029                 10.34%
memcpy_100k    0.356              0.429                 -17.02%
memcpy_1m      7.470              11.153                -33.02%

This is the demo
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

char a[1024*1024] = {12};
char b[1024*1024] = {13};
int main(int argc, char *argv[])
{
    int i = atoi(argv[1]);
    int j;
    int size = atoi(argv[2]);

    for (j = 0; j < i; j++)
        memcpy(b, a, size*1024);
    return 0;
}

# gcc -g -O0 memcpy.c -o memcpy
# time taskset -c 10 ./memcpy 100000 1024

Co-authored-by: liqingqing <liqingqing3@huawei.com>
3 years agoMake libc symbols hidden in static PIE
Szabolcs Nagy [Wed, 6 Jan 2021 11:31:04 +0000 (11:31 +0000)]
Make libc symbols hidden in static PIE

Hidden visibility can avoid indirections and RELATIVE relocs in
static PIE libc.

The check should use IS_IN_LIB instead of IS_IN(libc) since all
symbols are defined locally in static PIE and the optimization is
useful in all libraries not just libc. However the test system
links objects from libcrypt.a into dynamic linked test binaries
where hidden visibility does not work.  I think mixing static and
shared libc components in the same binary should not be supported
usage, but to be safe only use hidden in libc.a.

On some targets (i386) this optimization cannot be applied because
hidden visibility PIE ifunc functions don't work, so it is gated by
NO_HIDDEN_EXTERN_FUNC_IN_PIE.

From -static-pie linked 'int main(){}' this shaves off 71 relative
relocs on aarch64 and reduces code size by about 2k.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agocsu: Move static pie self relocation later [BZ #27072]
Szabolcs Nagy [Tue, 19 Jan 2021 17:17:01 +0000 (17:17 +0000)]
csu: Move static pie self relocation later [BZ #27072]

IFUNC resolvers may depend on tunables and cpu feature setup so
move static pie self relocation after those.

It is hard to guarantee that the ealy startup code does not rely
on relocations so this is a bit fragile. It would be more robust
to handle RELATIVE relocs early and only IRELATIVE relocs later,
but the current relocation processing code cannot do that.

The early startup code up to relocation processing includes

  _dl_aux_init (auxvec);
  __libc_init_secure ();
  __tunables_init (__environ);
  ARCH_INIT_CPU_FEATURES ();
  _dl_relocate_static_pie ();

These are simple enough that RELATIVE relocs can be avoided.

The following steps include

  ARCH_SETUP_IREL ();
  ARCH_SETUP_TLS ();
  ARCH_APPLY_IREL ();

On some targets IRELATIVE processing relies on TLS setup on
others TLS setup relies on IRELATIVE relocs, so the right
position for _dl_relocate_static_pie is target dependent.
For now move self relocation as early as possible on targets
that support static PIE.

Fixes bug 27072.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoUse hidden visibility for early static PIE code
Szabolcs Nagy [Fri, 15 Jan 2021 12:49:24 +0000 (12:49 +0000)]
Use hidden visibility for early static PIE code

Extern symbol access in position independent code usually involves GOT
indirection which needs RELATIVE reloc in a static linked PIE. (On
some targets this is avoided e.g. because the linker can relax a GOT
access to a pc-relative access, but this is not generally true.) Code
that runs before static PIE self relocation must avoid relying on
dynamic relocations which can be ensured by using hidden visibility.
However we cannot just make all symbols hidden:

On i386, all calls to IFUNC functions must go through PLT and calls to
hidden functions CANNOT go through PLT in PIE since EBX used in PIE PLT
may not be set up for local calls to hidden IFUNC functions.

This patch aims to make symbol references hidden in code that is used
before and by _dl_relocate_static_pie when building a static PIE libc.
Note: for an object that is used in the startup code, its references
and definition may not have consistent visibility: it is only forced
hidden in the startup code.

This is needed for fixing bug 27072.

Co-authored-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agocsu: Avoid weak ref for __ehdr_start in static PIE
Szabolcs Nagy [Wed, 6 Jan 2021 14:28:02 +0000 (14:28 +0000)]
csu: Avoid weak ref for __ehdr_start in static PIE

All linkers support __ehdr_start that support static PIE linking,
so there is no need to check for its presence via a weak reference.

This avoids a RELATIVE relocation in static PIE startup code on some
targets.

With non-PIE static linking the weak ref check is kept in case the
linker does not support __ehdr_start.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoconfigure: Check for static PIE support
Szabolcs Nagy [Wed, 20 Jan 2021 12:26:31 +0000 (12:26 +0000)]
configure: Check for static PIE support

Add SUPPORT_STATIC_PIE that targets can define if they support
static PIE. This requires PI_STATIC_AND_HIDDEN support and various
linker features as described in

  commit 9d7a3741c9e59eba87fb3ca6b9f979befce07826
  Add --enable-static-pie configure option to build static PIE [BZ #19574]

Currently defined on x86_64, i386 and aarch64 where static PIE is
known to work.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoelf: Avoid RELATIVE relocs in __tunables_init
Szabolcs Nagy [Tue, 12 Jan 2021 16:28:27 +0000 (16:28 +0000)]
elf: Avoid RELATIVE relocs in __tunables_init

With static pie linking pointers in the tunables list need
RELATIVE relocs since the absolute address is not known at link
time. We want to avoid relocations so the static pie self
relocation can be done after tunables are initialized.

This is a simple fix that embeds the tunable strings into the
tunable list instead of using pointers.  It is possible to have
a more compact representation of tunables with some additional
complexity in the generator and tunable parser logic.  Such
optimization will be useful if the list of tunables grows.

There is still an issue that tunables_strdup allocates and the
failure handling code path is sufficiently complex that it can
easily have RELATIVE relocations.  It is possible to avoid the
early allocation and only change environment variables in a
setuid exe after relocations are processed.  But that is a
bigger change and early failure is fatal anyway so it is not
as critical to fix right away. This is bug 27181.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoelf: Make the tunable struct definition internal only
Szabolcs Nagy [Wed, 6 Jan 2021 17:19:24 +0000 (17:19 +0000)]
elf: Make the tunable struct definition internal only

The representation of the tunables including type information and
the tunable list structure are only used in the implementation not
in the tunables api that is exposed to usage within glibc.

This patch moves the representation related definitions into the
existing dl-tunable-types.h and uses that only for implementation.

The tunable callback and related types are moved to dl-tunables.h
because they are part of the tunables api.

This reduces the details exposed in the tunables api so the internals
are easier to change.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years ago<sys/platform/x86.h>: Remove the C preprocessor magic
H.J. Lu [Fri, 25 Dec 2020 15:30:46 +0000 (07:30 -0800)]
<sys/platform/x86.h>: Remove the C preprocessor magic

In <sys/platform/x86.h>, define CPU features as enum instead of using
the C preprocessor magic to make it easier to wrap this functionality
in other languages.  Move the C preprocessor magic to internal header
for better GCC codegen when more than one features are checked in a
single expression as in x86-64 dl-hwcaps-subdirs.c.

1. Rename COMMON_CPUID_INDEX_XXX to CPUID_INDEX_XXX.
2. Move CPUID_INDEX_MAX to sysdeps/x86/include/cpu-features.h.
3. Remove struct cpu_features and __x86_get_cpu_features from
<sys/platform/x86.h>.
4. Add __x86_get_cpuid_feature_leaf to <sys/platform/x86.h> and put it
in libc.
5. Make __get_cpu_features() private to glibc.
6. Replace __x86_get_cpu_features(N) with __get_cpu_features().
7. Add _dl_x86_get_cpu_features to GLIBC_PRIVATE.
8. Use a single enum index for each CPU feature detection.
9. Pass the CPUID feature leaf to __x86_get_cpuid_feature_leaf.
10. Return zero struct cpuid_feature for the older glibc binary with a
smaller CPUID_INDEX_MAX [BZ #27104].
11. Inside glibc, use the C preprocessor magic so that cpu_features data
can be loaded just once leading to more compact code for glibc.

256 bits are used for each CPUID leaf.  Some leaves only contain a few
features.  We can add exceptions to such leaves.  But it will increase
code sizes and it is harder to provide backward/forward compatibilities
when new features are added to such leaves in the future.

When new leaves are added, _rtld_global_ro offsets will change which
leads to race condition during in-place updates. We may avoid in-place
updates by

1. Rename the old glibc.
2. Install the new glibc.
3. Remove the old glibc.

NB: A function, __x86_get_cpuid_feature_leaf , is used to avoid the copy
relocation issue with IFUNC resolver as shown in IFUNC resolver tests.

3 years agoposix: Fix fnmatch.c on bootstrap
Adhemerval Zanella [Wed, 20 Jan 2021 16:07:59 +0000 (16:07 +0000)]
posix: Fix fnmatch.c on bootstrap

Only define FALLTHROUGH for _LIBC and do not check __clang_major__
value.

It partially syncs with gnulib 5c52f00c69f39fe.

Checked with build-many-glibcs.py for aarch64-linux-gnu.

3 years agostdlib: Add testcase for BZ #26241
Adhemerval Zanella [Tue, 29 Dec 2020 15:24:28 +0000 (12:24 -0300)]
stdlib: Add testcase for BZ #26241

Old implementation of realpath allocates a PATH_MAX using alloca for
each symlink in the path, leading to MAXSYMLINKS times PATH_MAX
maximum stack usage.

The test create a symlink with __eloop_threshold() loops and creates
a thread with minimum stack size (obtained through
support_small_stack_thread_attribute).  The thread issues a stack
allocations that fill the thread allocated stack minus some slack
plus and the realpath usage (which assumes a bounded stack usage).
If realpath uses more than about 2 * PATH_MAX plus some slack it
triggers a stackoverflow.

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

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoposix: Fix regex_internal.h on bootstrap
Adhemerval Zanella [Wed, 20 Jan 2021 12:55:17 +0000 (12:55 +0000)]
posix: Fix regex_internal.h on bootstrap

Only define FALLTHROUGH for _LIBC and do not check __clang_major__
value.

It partially syncs with gnulib 5c52f00c69f39fe.

Checked with build-many-glibcs.py for aarch64-linux-gnu,
x86_64-linux-gnu, and s390x-linux-gnu.

3 years agoUse <startup.h> in __libc_init_secure
H.J. Lu [Fri, 15 Jan 2021 14:46:12 +0000 (06:46 -0800)]
Use <startup.h> in __libc_init_secure

Since __libc_init_secure is called before ARCH_SETUP_TLS, it must use
"int $0x80" for system calls in i386 static PIE.  Add startup_getuid,
startup_geteuid, startup_getgid and startup_getegid to <startup.h>.
Update __libc_init_secure to use them.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoelf: Avoid RELATIVE relocation for _dl_sysinfo
H.J. Lu [Mon, 18 Jan 2021 11:45:46 +0000 (11:45 +0000)]
elf: Avoid RELATIVE relocation for _dl_sysinfo

Set the default _dl_sysinfo in _dl_aux_init to avoid RELATIVE relocation
in static PIE.

This is needed for fixing bug 27072 on x86.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agolibmvec: Add extra-test-objs to test-extras
H.J. Lu [Fri, 15 Jan 2021 02:39:24 +0000 (18:39 -0800)]
libmvec: Add extra-test-objs to test-extras

Add extra-test-objs to test-extras so that they are compiled with
-DMODULE_NAME=testsuite instead of -DMODULE_NAME=libc.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoHurd: Add rtld-strncpy-c.c
H.J. Lu [Tue, 19 Jan 2021 02:19:16 +0000 (18:19 -0800)]
Hurd: Add rtld-strncpy-c.c

All IFUNC functions which are used in ld.so must have a rtld version if
the IFUNC version isn't safe to use in ld.so.

3 years agoUpdate MIPS libm-test-ulps.
Joseph Myers [Mon, 18 Jan 2021 21:36:00 +0000 (21:36 +0000)]
Update MIPS libm-test-ulps.

3 years agoUpdate arm libm-test-ulps.
Joseph Myers [Mon, 18 Jan 2021 20:22:51 +0000 (20:22 +0000)]
Update arm libm-test-ulps.

3 years agoUpdate powerpc-nofpu libm-test-ulps.
Joseph Myers [Mon, 18 Jan 2021 20:21:07 +0000 (20:21 +0000)]
Update powerpc-nofpu libm-test-ulps.

3 years agoUpdate hppa libm-test-ulps
John David Anglin [Mon, 18 Jan 2021 14:23:10 +0000 (14:23 +0000)]
Update hppa libm-test-ulps