ptrace_wakeup_sig: fix thread lock

This commit is contained in:
Tomoki Shirasawa
2015-12-28 10:33:07 +09:00
parent 01117e92c9
commit d00ea61d1a

View File

@@ -3837,8 +3837,7 @@ static int ptrace_wakeup_sig(int pid, long request, long data) {
error = -ESRCH; error = -ESRCH;
goto out; goto out;
} }
// TODO: この位置で unlock してはいけない。 hold_thread(child);
// ここで unlock すると thread が生存していることが保証できなくなる。
thread_unlock(child, &lock); thread_unlock(child, &lock);
if (data > 64 || data < 0) { if (data > 64 || data < 0) {
@@ -3861,12 +3860,12 @@ static int ptrace_wakeup_sig(int pid, long request, long data) {
if (request == PTRACE_SINGLESTEP) { if (request == PTRACE_SINGLESTEP) {
set_single_step(child); set_single_step(child);
} }
//? ihk_mc_spinlock_lock_noirq(&child->proc->lock); mcs_rwlock_writer_lock(&child->proc->update_lock, &lock);
child->proc->ptrace &= ~PT_TRACE_SYSCALL_MASK; child->proc->ptrace &= ~PT_TRACE_SYSCALL_MASK;
if (request == PTRACE_SYSCALL) { if (request == PTRACE_SYSCALL) {
child->proc->ptrace |= PT_TRACE_SYSCALL_ENTER; child->proc->ptrace |= PT_TRACE_SYSCALL_ENTER;
} }
//? ihk_mc_spinlock_unlock_noirq(&child->proc->lock); mcs_rwlock_writer_unlock(&child->proc->update_lock, &lock);
if(data != 0 && data != SIGSTOP) { if(data != 0 && data != SIGSTOP) {
/* TODO: Tracing process replace the original /* TODO: Tracing process replace the original
@@ -3894,6 +3893,8 @@ static int ptrace_wakeup_sig(int pid, long request, long data) {
sched_wakeup_thread(child, PS_TRACED | PS_STOPPED); sched_wakeup_thread(child, PS_TRACED | PS_STOPPED);
out: out:
if(child)
release_thread(child);
return error; return error;
} }