Set tid (instead of pid) for ptrace event message of

PTRACE_EVENT_{FORK,VFORK,CLONE,VFORKDONE}.
Specify 2nd argument as pid (instead of -1) of function findthread_and_lock(),
to find tracee process in ptrace subroutines.
(gdb testsuite gdb.base/watch_thread_num.exp)
This commit is contained in:
Susumu Komae
2015-03-20 13:22:00 +09:00
committed by postpeta
parent 055769254d
commit c2a1f933e8

View File

@@ -1607,7 +1607,7 @@ static int ptrace_report_clone(struct process *proc, struct process *new, int ev
proc->ftn->exit_status = (SIGTRAP | (event << 8)); proc->ftn->exit_status = (SIGTRAP | (event << 8));
/* Transition process state */ /* Transition process state */
proc->ftn->status = PS_TRACED; proc->ftn->status = PS_TRACED;
proc->ftn->ptrace_eventmsg = new->ftn->pid; proc->ftn->ptrace_eventmsg = new->ftn->tid;
proc->ftn->ptrace &= ~PT_TRACE_SYSCALL_MASK; proc->ftn->ptrace &= ~PT_TRACE_SYSCALL_MASK;
ihk_mc_spinlock_unlock_noirq(&proc->ftn->lock); ihk_mc_spinlock_unlock_noirq(&proc->ftn->lock);
@@ -3505,7 +3505,7 @@ static int ptrace_wakeup_sig(int pid, long request, long data) {
unsigned long irqstate; unsigned long irqstate;
struct siginfo info; struct siginfo info;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) { if (!child) {
error = -ESRCH; error = -ESRCH;
goto out; goto out;
@@ -3582,7 +3582,7 @@ static long ptrace_pokeuser(int pid, long addr, long data)
if(addr > sizeof(struct user) - 8 || addr < 0) if(addr > sizeof(struct user) - 8 || addr < 0)
return -EFAULT; return -EFAULT;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3603,7 +3603,7 @@ static long ptrace_peekuser(int pid, long addr, long data)
if(addr > sizeof(struct user) - 8|| addr < 0) if(addr > sizeof(struct user) - 8|| addr < 0)
return -EFAULT; return -EFAULT;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3626,7 +3626,7 @@ static long ptrace_getregs(int pid, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3657,7 +3657,7 @@ static long ptrace_setregs(int pid, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3688,7 +3688,7 @@ static long ptrace_arch_prctl(int pid, long code, long addr)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if (child->ftn->status == PS_TRACED) { if (child->ftn->status == PS_TRACED) {
@@ -3745,7 +3745,7 @@ static long ptrace_getfpregs(int pid, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if (child->ftn->status == PS_TRACED) { if (child->ftn->status == PS_TRACED) {
@@ -3763,7 +3763,7 @@ static long ptrace_setfpregs(int pid, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if (child->ftn->status == PS_TRACED) { if (child->ftn->status == PS_TRACED) {
@@ -3784,7 +3784,7 @@ static long ptrace_getregset(int pid, long type, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if (child->ftn->status == PS_TRACED) { if (child->ftn->status == PS_TRACED) {
@@ -3811,7 +3811,7 @@ static long ptrace_setregset(int pid, long type, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if (child->ftn->status == PS_TRACED) { if (child->ftn->status == PS_TRACED) {
@@ -3839,7 +3839,7 @@ static long ptrace_peektext(int pid, long addr, long data)
unsigned long irqstate; unsigned long irqstate;
unsigned long *p = (unsigned long *)data; unsigned long *p = (unsigned long *)data;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3863,7 +3863,7 @@ static long ptrace_poketext(int pid, long addr, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) if (!child)
return -ESRCH; return -ESRCH;
if(child->ftn->status == PS_TRACED){ if(child->ftn->status == PS_TRACED){
@@ -3904,7 +3904,7 @@ static int ptrace_setoptions(int pid, int flags)
goto out; goto out;
} }
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child || !child->ftn || !(child->ftn->ptrace & PT_TRACED)) { if (!child || !child->ftn || !(child->ftn->ptrace & PT_TRACED)) {
ret = -ESRCH; ret = -ESRCH;
goto unlockout; goto unlockout;
@@ -3929,7 +3929,7 @@ static int ptrace_attach(int pid)
unsigned long irqstate; unsigned long irqstate;
struct siginfo info; struct siginfo info;
proc = findthread_and_lock(pid, -1, &savelock, &irqstate); proc = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!proc) { if (!proc) {
error = -ESRCH; error = -ESRCH;
goto out; goto out;
@@ -4012,7 +4012,7 @@ static int ptrace_detach(int pid, int data)
unsigned long irqstate; unsigned long irqstate;
struct siginfo info; struct siginfo info;
proc = findthread_and_lock(pid, -1, &savelock, &irqstate); proc = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!proc) { if (!proc) {
error = -ESRCH; error = -ESRCH;
goto out; goto out;
@@ -4139,7 +4139,7 @@ static long ptrace_geteventmsg(int pid, long data)
ihk_spinlock_t *savelock; ihk_spinlock_t *savelock;
unsigned long irqstate; unsigned long irqstate;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) { if (!child) {
return -ESRCH; return -ESRCH;
} }
@@ -4163,7 +4163,7 @@ ptrace_getsiginfo(int pid, siginfo_t *data)
struct process *child; struct process *child;
int rc = 0; int rc = 0;
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) { if (!child) {
return -ESRCH; return -ESRCH;
} }
@@ -4192,7 +4192,7 @@ ptrace_setsiginfo(int pid, siginfo_t *data)
int rc = 0; int rc = 0;
kprintf("ptrace_setsiginfo: sig=%d errno=%d code=%d\n", data->si_signo, data->si_errno, data->si_code); kprintf("ptrace_setsiginfo: sig=%d errno=%d code=%d\n", data->si_signo, data->si_errno, data->si_code);
child = findthread_and_lock(pid, -1, &savelock, &irqstate); child = findthread_and_lock(pid, pid, &savelock, &irqstate);
if (!child) { if (!child) {
return -ESRCH; return -ESRCH;
} }