mirror of
https://github.com/opnsense/src.git
synced 2026-07-05 15:26:58 -04:00
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 |
||
|---|---|---|
| .. | ||
| atf | ||
| atrun | ||
| blacklistd-helper | ||
| bootpd | ||
| comsat | ||
| dma | ||
| fingerd | ||
| ftpd | ||
| getty | ||
| hyperv | ||
| mail.local | ||
| makewhatis.local | ||
| mknetid | ||
| pppoed | ||
| rbootd | ||
| revnetgroup | ||
| rlogind | ||
| rpc.rquotad | ||
| rpc.rstatd | ||
| rpc.rusersd | ||
| rpc.rwalld | ||
| rpc.sprayd | ||
| rshd | ||
| rtld-aout | ||
| rtld-elf | ||
| save-entropy | ||
| smrsh | ||
| talkd | ||
| tcpd | ||
| telnetd | ||
| tests | ||
| tftp-proxy | ||
| tftpd | ||
| ulog-helper | ||
| ypxfr | ||
| Makefile | ||
| Makefile.amd64 | ||
| Makefile.i386 | ||
| Makefile.inc | ||
| Makefile.pc98 | ||