Bug in rev 1.3 of sys/i386/linux/linux_ptrace.c

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Mon, 14 Apr 2003 16:12:06 -0400 (EDT)
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/
Received on Mon Apr 14 2003 - 11:12:09 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:03 UTC