freebsd-nq/libexec/rtld-elf
Konstantin Belousov b88a8d3d1d Fix acquisition of nested write compat rtld locks.
Obtaining compat rtld lock in write mode sets process signal mask to
block all signals.  Previous mask is stored in the global variable
oldsigmask.  If a lock is write-locked while another lock is already
write-locked, oldsigmask is overwritten by the total mask and on the
last unlock, all signals except traps appear to be blocked.

Fix this by counting the write-lock nested level, and only storing to
oldsigmask/restoring from it at the outermost level.

Masking signals disables involuntary preemption for libc_r, and there
could be no voluntary context switches in the locked code
(dl_iterate_phdr(3) keeps a lock around user callback, but it was
added long after libc_r was renounced).  Due to this, remembering the
level in the global variable after the lock is obtained should be
safe, because no two libc_r threads can acquire different write locks
in parallel.

PR:	215826
Reported by:	kami
Tested by:	yamagi@yamagi.org (previous version)
To be reviewed by:	kan
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
2017-01-10 19:26:55 +00:00
..
aarch64 Retire long-broken/unused static rtld support 2016-12-02 14:23:26 +00:00
amd64 Adjust r308689 to make rtld compilable with either in-tree or 2016-11-21 14:13:57 +00:00
arm Adjust r308689 to make rtld compilable with either in-tree or 2016-11-21 14:13:57 +00:00
i386 Adjust r308689 to make rtld compilable with either in-tree or 2016-11-21 14:13:57 +00:00
mips Fix _mips_rtld_bind() to handle ELF filters. 2016-11-23 20:21:53 +00:00
powerpc Adjust r308689 to make rtld compilable with either in-tree or 2016-11-21 14:13:57 +00:00
powerpc64 Adjust r308689 to make rtld compilable with either in-tree or 2016-11-21 14:13:57 +00:00
riscv Retire long-broken/unused static rtld support 2016-12-02 14:23:26 +00:00
sparc64 Retire long-broken/unused static rtld support 2016-12-02 14:23:26 +00:00
tests
debug.c
debug.h
libmap.c
libmap.h
Makefile Assert that there is no unresolved symbols during rtld linking. 2016-11-15 09:40:03 +00:00
Makefile.depend
malloc.c
map_object.c
paths.h
rtld_lock.c Fix acquisition of nested write compat rtld locks. 2017-01-10 19:26:55 +00:00
rtld_lock.h
rtld_printf.c
rtld_printf.h
rtld_tls.h
rtld_utrace.h
rtld.1
rtld.c rtld: Fix a couple of bugs around the unloading of ELF filters. 2016-12-22 17:44:27 +00:00
rtld.h rtld: Ensure that dlopen() cannot obtain a reference on a doomed object. 2016-12-22 17:41:32 +00:00
Symbol.map
xmalloc.c