diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-06-25 08:09:08 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-06-25 08:09:08 +0200 |
commit | 40ebfd016ad284872f434bdd76dbe9c708db4d6b (patch) | |
tree | 139a40efc4402ec670eac545278e110561f3f2d3 /elf/dl-tls.c | |
parent | 66db95b6e8264c5a6307f6a9e5285fec76907254 (diff) | |
download | glibc-40ebfd016ad284872f434bdd76dbe9c708db4d6b.zip glibc-40ebfd016ad284872f434bdd76dbe9c708db4d6b.tar.gz glibc-40ebfd016ad284872f434bdd76dbe9c708db4d6b.tar.bz2 |
elf: Disable most of TLS modid gaps processing [BZ #27135]
Revert "elf: Fix DTV gap reuse logic [BZ #27135]"
This reverts commit 572bd547d57a39b6cf0ea072545dc4048921f4c3.
It turns out that the _dl_next_tls_modid in _dl_map_object_from_fd keeps
returning the same modid over and over again if there is a gap and
more than TLS-using module is loaded in one dlopen call. This corrupts
TLS data structures. The bug is still present after a revert, but
empirically it is much more difficult to trigger (because it involves a
dlopen failure).
Diffstat (limited to 'elf/dl-tls.c')
-rw-r--r-- | elf/dl-tls.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/elf/dl-tls.c b/elf/dl-tls.c index e531ec5..2b5161d 100644 --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -191,7 +191,10 @@ _dl_next_tls_modid (void) size_t _dl_count_modids (void) { - /* The count is the max unless dlclose or failed dlopen created gaps. */ + /* It is rare that we have gaps; see elf/dl-open.c (_dl_open) where + we fail to load a module and unload it leaving a gap. If we don't + have gaps then the number of modids is the current maximum so + return that. */ if (__glibc_likely (!GL(dl_tls_dtv_gaps))) return GL(dl_tls_max_dtv_idx); |