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

From: Bruce Evans <bde_at_zeta.org.au>
Date: Tue, 15 Apr 2003 23:21:57 +1000 (EST)
On Mon, 14 Apr 2003, Marcel Moolenaar wrote:

> On Mon, Apr 14, 2003 at 04:12:06PM -0400, John Baldwin wrote:
> > In the linux_ptrace() function there is the following code:
> *snip*
> >                 /* 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)?
>
> I don't know the difference between P_STOPPED and P_STOPPED_TRACE
> but yes, we should check whether the process is stopped. The
> equivalent in sys/kern/sys_process.c is:
>
> 	if (!P_SHOULDSTOP(p) || (p->p_flag & P_WAITED) == 0) {
>
> P_SHOULDSTOP(p) expands to:
>
> 	((p)->p_flag & P_STOPPED)
>
> Using P_STOPPED makes us bug-for-bug compatible...

Isn't it, er, terrific to have not completelty trivial signal and
ptrace code rotting differently in 1 + ${N_ARCH} * ${N_COMPAT} places ;-).

Bruce
Received on Tue Apr 15 2003 - 04:22:19 UTC

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