summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread/thr_stack.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-02-08 19:24:13 +0000
committerkib <kib@FreeBSD.org>2016-02-08 19:24:13 +0000
commit42e09be9c23e730d42b331384d128dbba8719c04 (patch)
treec91cbb77944f06638bce887f736eaeafed34a388 /lib/libthr/thread/thr_stack.c
parent42bcd86bfbff24f6d52e96805b6d8d535c7db051 (diff)
downloadFreeBSD-src-42e09be9c23e730d42b331384d128dbba8719c04.zip
FreeBSD-src-42e09be9c23e730d42b331384d128dbba8719c04.tar.gz
If libthr.so is dlopened without RTLD_GLOBAL flag, the libthr symbols
do not participate in the global symbols namespace, but rtld locks are still replaced and functions are interposed. In particular, __pthread_map_stacks_exec is resolved to the libc version. If a library is loaded later, which requires adjustment of the stack protection mode, rtld calls into libc __pthread_map_stacks_exec due to the symbols scope. The libc version might recurse into binder and recursively acquire rtld bind lock, causing the hang. Make libc __pthread_map_stacks_exec() interposed, which synchronizes rtld locks and version of the stack exec hook when libthr loaded, regardless of the symbol scope control or symbol resolution order. The __pthread_map_stacks_exec() symbol is removed from the private version in libthr since libc symbol now operates correctly in presence of libthr. Reported and tested by: markj Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
Diffstat (limited to 'lib/libthr/thread/thr_stack.c')
-rw-r--r--lib/libthr/thread/thr_stack.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/lib/libthr/thread/thr_stack.c b/lib/libthr/thread/thr_stack.c
index e5d149e..74e1329 100644
--- a/lib/libthr/thread/thr_stack.c
+++ b/lib/libthr/thread/thr_stack.c
@@ -161,9 +161,8 @@ singlethread_map_stacks_exec(void)
rlim.rlim_cur, _rtld_get_stack_prot());
}
-void __pthread_map_stacks_exec(void);
void
-__pthread_map_stacks_exec(void)
+__thr_map_stacks_exec(void)
{
struct pthread *curthread, *thrd;
struct stack *st;
OpenPOWER on IntegriCloud