diff options
author | jhb <jhb@FreeBSD.org> | 2010-05-25 21:32:37 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2010-05-25 21:32:37 +0000 |
commit | 6caceffefa0e8fe0e38747eb227c47079c33559c (patch) | |
tree | 317c531247519e78e5f02421f276bb579b042c94 /sys/kern/sys_process.c | |
parent | 0cadc029c7db489deac27335e5d81f120d8c58a1 (diff) | |
download | FreeBSD-src-6caceffefa0e8fe0e38747eb227c47079c33559c.zip FreeBSD-src-6caceffefa0e8fe0e38747eb227c47079c33559c.tar.gz |
Ignore the 'addr' argument passed to PT_STEP (it is required to be '1'
for PT_STEP which means "ignore") and PT_DETACH.
PR: kern/146167
MFC after: 1 week
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r-- | sys/kern/sys_process.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 6decc02..65d9f69 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -899,24 +899,29 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) if (error) goto out; break; + case PT_CONTINUE: case PT_TO_SCE: - p->p_stops |= S_PT_SCE; - break; case PT_TO_SCX: - p->p_stops |= S_PT_SCX; - break; case PT_SYSCALL: - p->p_stops |= S_PT_SCE | S_PT_SCX; - break; - } - - if (addr != (void *)1) { - error = ptrace_set_pc(td2, (u_long)(uintfptr_t)addr); - if (error) + if (addr != (void *)1) { + error = ptrace_set_pc(td2, + (u_long)(uintfptr_t)addr); + if (error) + goto out; + } + switch (req) { + case PT_TO_SCE: + p->p_stops |= S_PT_SCE; break; - } - - if (req == PT_DETACH) { + case PT_TO_SCX: + p->p_stops |= S_PT_SCX; + break; + case PT_SYSCALL: + p->p_stops |= S_PT_SCE | S_PT_SCX; + break; + } + break; + case PT_DETACH: /* reset process parent */ if (p->p_oppid != p->p_pptr->p_pid) { struct proc *pp; @@ -941,6 +946,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) /* should we send SIGCHLD? */ /* childproc_continued(p); */ + break; } sendsig: |