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