diff options
author | Florian Weimer <fweimer@redhat.com> | 2022-02-11 16:01:19 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2022-02-11 17:10:59 +0100 |
commit | d96d2995c1121d3310102afda2deb1f35761b5e6 (patch) | |
tree | e685f4927e3aa429d3a98abcdb1f9fd7c577a2d1 /elf/dl-support.c | |
parent | 02561bb48a26429a238cbd6afbe5998dabcc4546 (diff) | |
download | glibc-d96d2995c1121d3310102afda2deb1f35761b5e6.zip glibc-d96d2995c1121d3310102afda2deb1f35761b5e6.tar.gz glibc-d96d2995c1121d3310102afda2deb1f35761b5e6.tar.bz2 |
Revert "Linux: Consolidate auxiliary vector parsing"
This reverts commit 8c8510ab2790039e58995ef3a22309582413d3ff. The
revert is not perfect because the commit included a bug fix for
_dl_sysdep_start with an empty argv, introduced in commit
2d47fa68628e831a692cba8fc9050cef435afc5e ("Linux: Remove
DL_FIND_ARG_COMPONENTS"), and this bug fix is kept.
The revert is necessary because the reverted commit introduced an
early memset call on aarch64, which leads to crash due to lack of TCB
initialization.
Diffstat (limited to 'elf/dl-support.c')
-rw-r--r-- | elf/dl-support.c | 80 |
1 files changed, 76 insertions, 4 deletions
diff --git a/elf/dl-support.c b/elf/dl-support.c index 1977a2b..6d2c4ba 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -240,21 +240,93 @@ __rtld_lock_define_initialized_recursive (, _dl_load_tls_lock) #ifdef HAVE_AUX_VECTOR -#include <dl-parse_auxv.h> - int _dl_clktck; void _dl_aux_init (ElfW(auxv_t) *av) { + int seen = 0; + uid_t uid = 0; + gid_t gid = 0; + #ifdef NEED_DL_SYSINFO /* NB: Avoid RELATIVE relocation in static PIE. */ GL(dl_sysinfo) = DL_SYSINFO_DEFAULT; #endif _dl_auxv = av; - dl_parse_auxv_t auxv_values = { 0, }; - _dl_parse_auxv (av, auxv_values); + for (; av->a_type != AT_NULL; ++av) + switch (av->a_type) + { + case AT_PAGESZ: + if (av->a_un.a_val != 0) + GLRO(dl_pagesize) = av->a_un.a_val; + break; + case AT_CLKTCK: + GLRO(dl_clktck) = av->a_un.a_val; + break; + case AT_PHDR: + GL(dl_phdr) = (const void *) av->a_un.a_val; + break; + case AT_PHNUM: + GL(dl_phnum) = av->a_un.a_val; + break; + case AT_PLATFORM: + GLRO(dl_platform) = (void *) av->a_un.a_val; + break; + case AT_HWCAP: + GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val; + break; + case AT_HWCAP2: + GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val; + break; + case AT_FPUCW: + GLRO(dl_fpu_control) = av->a_un.a_val; + break; +#ifdef NEED_DL_SYSINFO + case AT_SYSINFO: + GL(dl_sysinfo) = av->a_un.a_val; + break; +#endif +#ifdef NEED_DL_SYSINFO_DSO + case AT_SYSINFO_EHDR: + GL(dl_sysinfo_dso) = (void *) av->a_un.a_val; + break; +#endif + case AT_UID: + uid ^= av->a_un.a_val; + seen |= 1; + break; + case AT_EUID: + uid ^= av->a_un.a_val; + seen |= 2; + break; + case AT_GID: + gid ^= av->a_un.a_val; + seen |= 4; + break; + case AT_EGID: + gid ^= av->a_un.a_val; + seen |= 8; + break; + case AT_SECURE: + seen = -1; + __libc_enable_secure = av->a_un.a_val; + __libc_enable_secure_decided = 1; + break; + case AT_RANDOM: + _dl_random = (void *) av->a_un.a_val; + break; + case AT_MINSIGSTKSZ: + _dl_minsigstacksize = av->a_un.a_val; + break; + DL_PLATFORM_AUXV + } + if (seen == 0xf) + { + __libc_enable_secure = uid != 0 || gid != 0; + __libc_enable_secure_decided = 1; + } } #endif |