diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2023-08-18 19:52:24 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2023-08-20 12:30:13 +0000 |
commit | b1d3e2b771552af071bf0964233cc5a76ea25542 (patch) | |
tree | 2136ca975d2b56773f5c9391a8c29284fe5568b4 | |
parent | 64fbda90da1b91d2412a5b970a3996f3cf1c8522 (diff) | |
download | src-b1d3e2b771552af071bf0964233cc5a76ea25542.tar.gz src-b1d3e2b771552af071bf0964233cc5a76ea25542.zip |
rtld: unlock bind lock when calling into crt __pthread_distribute_static_tls method
The method might require resolving and binding symbols, which means
recursing on the bind lock. It is safe to unlock the bind lock,
since we operate on the private object list, and user attempting to
unload an object from the list of not yet fully loaded objects caused
self-inflicted race.
It is similar to how we treat user' init/fini methods.
Reported by: stevek
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
-rw-r--r-- | libexec/rtld-elf/rtld.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 886758a5a484..feef5dd0bb5d 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -5897,8 +5897,10 @@ distribute_static_tls(Objlist *list, RtldLockState *lockstate) obj = elm->obj; if (obj->marker || !obj->tls_static || obj->static_tls_copied) continue; + lock_release(rtld_bind_lock, lockstate); distrib(obj->tlsoffset, obj->tlsinit, obj->tlsinitsize, obj->tlssize); + wlock_acquire(rtld_bind_lock, lockstate); obj->static_tls_copied = true; } } |