Clear the stop events and wakeup the process on teh last close of the

procfs/mem file.  While this doesn't prevent an unkillable process, it
means that a broken truss prorgam won't do it accidently now (well,
there's a small window of opportunity).  Note that this requires the
change to truss I am about to commit.
This commit is contained in:
sef 1997-12-07 04:01:03 +00:00
parent a53f702fae
commit 3442d56966
2 changed files with 58 additions and 2 deletions

View File

@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95
*
* $Id: procfs_vnops.c,v 1.43 1997/12/05 19:55:47 bde Exp $
* $Id: procfs_vnops.c,v 1.44 1997/12/06 04:11:13 sef Exp $
*/
/*
@ -173,11 +173,39 @@ procfs_close(ap)
} */ *ap;
{
struct pfsnode *pfs = VTOPFS(ap->a_vp);
struct proc *p;
switch (pfs->pfs_type) {
case Pmem:
if ((ap->a_fflag & FWRITE) && (pfs->pfs_flags & O_EXCL))
pfs->pfs_flags &= ~(FWRITE|O_EXCL);
/*
* This rather complicated-looking code is trying to
* determine if this was the last close on this particular
* vnode. While one would expect v_usecount to be 1 at
* that point, it seems that (according to John Dyson)
* the VM system will bump up the usecount. So: if the
* usecount is 2, and VVMIO is set, then this is really
* the last close. Otherwise, if the usecount is < 2
* then it is definitely the last close.
* If this is the last close, then it checks to see if
* the target process has PF_LINGER set in p_pfsflags,
* if this is *not* the case, then the process' stop flags
* are cleared, and the process is woken up. This is
* to help prevent the case where a process has been
* told to stop on an event, but then the requesting process
* has gone away or forgotten about it.
*/
if (((ap->a_vp->v_usecount == 2
&& ap->a_vp->v_object
&& (ap->a_vp->v_flag & VVMIO)) ||
(ap->a_vp->v_usecount < 2))
&& (p = pfind(pfs->pfs_pid))
&& !(p->p_pfsflags & PF_LINGER)) {
p->p_stops = 0;
p->p_step = 0;
wakeup(&p->p_step);
}
break;
default:
break;

View File

@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95
*
* $Id: procfs_vnops.c,v 1.43 1997/12/05 19:55:47 bde Exp $
* $Id: procfs_vnops.c,v 1.44 1997/12/06 04:11:13 sef Exp $
*/
/*
@ -173,11 +173,39 @@ procfs_close(ap)
} */ *ap;
{
struct pfsnode *pfs = VTOPFS(ap->a_vp);
struct proc *p;
switch (pfs->pfs_type) {
case Pmem:
if ((ap->a_fflag & FWRITE) && (pfs->pfs_flags & O_EXCL))
pfs->pfs_flags &= ~(FWRITE|O_EXCL);
/*
* This rather complicated-looking code is trying to
* determine if this was the last close on this particular
* vnode. While one would expect v_usecount to be 1 at
* that point, it seems that (according to John Dyson)
* the VM system will bump up the usecount. So: if the
* usecount is 2, and VVMIO is set, then this is really
* the last close. Otherwise, if the usecount is < 2
* then it is definitely the last close.
* If this is the last close, then it checks to see if
* the target process has PF_LINGER set in p_pfsflags,
* if this is *not* the case, then the process' stop flags
* are cleared, and the process is woken up. This is
* to help prevent the case where a process has been
* told to stop on an event, but then the requesting process
* has gone away or forgotten about it.
*/
if (((ap->a_vp->v_usecount == 2
&& ap->a_vp->v_object
&& (ap->a_vp->v_flag & VVMIO)) ||
(ap->a_vp->v_usecount < 2))
&& (p = pfind(pfs->pfs_pid))
&& !(p->p_pfsflags & PF_LINGER)) {
p->p_stops = 0;
p->p_step = 0;
wakeup(&p->p_step);
}
break;
default:
break;