git: dbd2053026a6 - main - libc dl_iterate_phdr(): dlpi_tls_data is wrong
Konstantin Belousov
kib at FreeBSD.org
Fri Apr 9 20:47:15 UTC 2021
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=dbd2053026a6af28adb1aa32e27603ae0d4efea6
commit dbd2053026a6af28adb1aa32e27603ae0d4efea6
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-04-05 03:38:07 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-04-09 20:46:24 +0000
libc dl_iterate_phdr(): dlpi_tls_data is wrong
This is the same change as d36d681615170590, but for libc static implementaion
of dl_iterate_phdr().
Reported by: emacsray at gmail.com
PR: 254774
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D29623
---
lib/libc/gen/dlfcn.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/libc/gen/dlfcn.c b/lib/libc/gen/dlfcn.c
index 16afdb6bf5d1..337ad48fd691 100644
--- a/lib/libc/gen/dlfcn.c
+++ b/lib/libc/gen/dlfcn.c
@@ -196,8 +196,6 @@ dl_init_phdr_info(void)
for (i = 0; i < phdr_info.dlpi_phnum; i++) {
if (phdr_info.dlpi_phdr[i].p_type == PT_TLS) {
phdr_info.dlpi_tls_modid = 1;
- phdr_info.dlpi_tls_data =
- (void*)phdr_info.dlpi_phdr[i].p_vaddr;
}
}
phdr_info.dlpi_adds = 1;
@@ -210,13 +208,17 @@ dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *) __unused,
void *data __unused)
{
#ifndef IN_LIBDL
+ tls_index ti;
int ret;
__init_elf_aux_vector();
if (__elf_aux_vector == NULL)
return (1);
_once(&dl_phdr_info_once, dl_init_phdr_info);
+ ti.ti_module = 1;
+ ti.ti_offset = 0;
mutex_lock(&dl_phdr_info_lock);
+ phdr_info.dlpi_tls_data = __tls_get_addr(&ti);
ret = callback(&phdr_info, sizeof(phdr_info), data);
mutex_unlock(&dl_phdr_info_lock);
return (ret);
More information about the dev-commits-src-all
mailing list