aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2023-08-18 19:52:24 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2023-08-20 12:30:13 +0000
commitb1d3e2b771552af071bf0964233cc5a76ea25542 (patch)
tree2136ca975d2b56773f5c9391a8c29284fe5568b4
parent64fbda90da1b91d2412a5b970a3996f3cf1c8522 (diff)
downloadsrc-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.c2
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;
}
}