Bug in rev 1.3 of sys/i386/linux/linux_ptrace.c
John Baldwin
jhb at FreeBSD.org
Mon Apr 14 13:12:09 PDT 2003
In the linux_ptrace() function there is the following code:
case PTRACE_GETFPXREGS: {
#ifdef CPU_ENABLE_SSE
struct proc *p;
struct thread *td2;
...
/* not being traced... */
if ((p->p_flag & P_TRACED) == 0) {
error = EPERM;
goto fail;
}
/* not being traced by YOU */
if (p->p_pptr != td->td_proc) {
error = EBUSY;
goto fail;
}
/* not currently stopped */
if ((p->p_flag & (P_TRACED|P_WAITED)) == 0) {
error = EBUSY;
goto fail;
}
...
Now, since we've already checked P_TRACED above, this last
check will never fail. The diff in rev 1.3 was:
- if (p->p_stat != SSTOP || (p->p_flag & P_WAITED) == 0) {
+ if ((p->p_flag & (P_TRACED|P_WAITED)) == 0) {
So should this be (P_STOPPED|P_WAITED) instead? Or maybe just
(P_STOPPED_TRACE|P_WAITED)?
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!" - http://www.FreeBSD.org/
More information about the freebsd-current
mailing list