提交 19eb13b9 编写于 作者: R Rich Felker

race condition fix: block all signals before decrementing thread count

the existence of a (kernelspace) thread must never have observable
effects after the thread count is decremented. if signals are not
blocked, it could end up handling the signal for rsyscall and
contributing towards the count of threads which have changed ids,
causing a thread to be missed. this could lead to one thread retaining
unwanted privilege level.

this change may also address other subtle race conditions in
application code that uses signals.
上级 a49c1192
......@@ -2,15 +2,6 @@
.global __unmapself
.type __unmapself,%function
__unmapself:
call 1f
.long -1
.long -1
1: popl %ecx
xorl %ebx,%ebx
xorl %edx,%edx
movl $8,%esi
movl $175,%eax
int $128
movl $91,%eax
movl 4(%esp),%ebx
movl 8(%esp),%ecx
......
......@@ -25,6 +25,8 @@ void __pthread_unwind_next(struct __ptcb *cb)
}
}
syscall4(__NR_sigprocmask, SIG_BLOCK, (long)(uint64_t[1]){-1}, 0, 8);
if (!a_fetch_add(&libc.threads_minus_1, -1))
exit(0);
......
......@@ -3,19 +3,6 @@
.global __unmapself
.type __unmapself,%function
__unmapself:
call 1f /* glibc ABI compat */
.long -1
.long -1
1: push %rsi /* save arg2 for munmap */
push %rdx /* save arg3 for munmap */
mov %rdi,%rsi /* rt_sigprocmask() args: move arg1 to rsi */
xor %rdi,%rdi
xor %rdx,%rdx
movq $8,%r10
movl $14,%eax /* __NR_rt_sigprocmask */
syscall /* call rt_sigprocmask(0,arg1,0,8) */
pop %rsi /* munmap() args: reload from stack */
pop %rdi
movl $11,%eax /* __NR_munmap */
syscall /* munmap(arg2,arg3) */
xor %rdi,%rdi /* exit() args: always return success */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册