summaryrefslogtreecommitdiff
path: root/ldso/dynlink.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2021-04-16 10:20:46 -0400
committerRich Felker <dalias@aerifal.cx>2021-04-16 10:20:46 -0400
commitaad50fcd791e009961621ddfbe3d4c245fd689a3 (patch)
tree84d9494a2123186c7ceeb32a5a90c48bad97c45a /ldso/dynlink.c
parent0ea78a6421322cab24d448670006ee2f99af3ac9 (diff)
downloadmusl-master.tar.gz
fix regression in dl_iterate_phdr reporting of modules with no TLSHEADmaster
__tls_get_addr should not be called with an invalid TLS module id of 0. in practice it probably "works", returning the DTV length as if it were a pointer, and the callback should probably not inspect dlpi_tls_data in this case, but it's likely that some real-world callbacks use a check on dlpi_tls_data being non-null, rather than on dlpi_tls_modid being nonzero, to conclude that the module has TLS.
Diffstat (limited to 'ldso/dynlink.c')
-rw-r--r--ldso/dynlink.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index b66ad537..8b67ef59 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -2331,7 +2331,8 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void
info.dlpi_adds = gencnt;
info.dlpi_subs = 0;
info.dlpi_tls_modid = current->tls_id;
- info.dlpi_tls_data = __tls_get_addr((tls_mod_off_t[]){current->tls_id,0});
+ info.dlpi_tls_data = !current->tls_id ? 0 :
+ __tls_get_addr((tls_mod_off_t[]){current->tls_id,0});
ret = (callback)(&info, sizeof (info), data);