ptrace_wakeup_sig: fix thread lock
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user