summaryrefslogtreecommitdiffstats
path: root/sys/compat/pecoff/imgact_pecoff.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-23 20:52:50 +0000
committerjhb <jhb@FreeBSD.org>2001-01-23 20:52:50 +0000
commit59ea97bfac9eb353e827ddbfa9c2012c53eb2386 (patch)
treeea6f0ddde8aa9c655aef62fdff8eeea8343af801 /sys/compat/pecoff/imgact_pecoff.c
parent6db3488060d4a689e8490d47f4d94c78d10ec7e2 (diff)
downloadFreeBSD-src-59ea97bfac9eb353e827ddbfa9c2012c53eb2386.zip
FreeBSD-src-59ea97bfac9eb353e827ddbfa9c2012c53eb2386.tar.gz
Use proc lock to safely obtain references to p_ucred before vnode
operations.
Diffstat (limited to 'sys/compat/pecoff/imgact_pecoff.c')
-rw-r--r--sys/compat/pecoff/imgact_pecoff.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/compat/pecoff/imgact_pecoff.c b/sys/compat/pecoff/imgact_pecoff.c
index 6dff6ba..88c3342 100644
--- a/sys/compat/pecoff/imgact_pecoff.c
+++ b/sys/compat/pecoff/imgact_pecoff.c
@@ -162,7 +162,7 @@ static int
pecoff_coredump(register struct proc * p, register struct vnode * vp,
off_t limit)
{
- register struct ucred *cred = p->p_ucred;
+ register struct ucred *cred;
register struct vmspace *vm = p->p_vmspace;
int error;
#ifdef PECOFF_DEBUG
@@ -184,6 +184,10 @@ pecoff_coredump(register struct proc * p, register struct vnode * vp,
ent = &map->header;
printf("%p %p %p\n", ent, ent->prev, ent->next);
#endif
+ PROC_LOCK(p);
+ cred = p->p_ucred;
+ crhold(cred);
+ PROC_UNLOCK(p);
error = cpu_coredump(p, vp, cred);
if (error == 0)
error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr,
@@ -195,6 +199,7 @@ pecoff_coredump(register struct proc * p, register struct vnode * vp,
round_page(ctob(vm->vm_ssize)),
(off_t) ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE,
IO_NODELOCKED | IO_UNIT, cred, (int *) NULL, p);
+ crfree(cred);
return (error);
}
@@ -600,10 +605,15 @@ pecoff_read_from(p, vp, pos, buf, siz)
{
int error;
size_t resid;
+ struct ucred *uc;
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
error = vn_rdwr(UIO_READ, vp, buf, siz, pos,
- UIO_SYSSPACE, IO_NODELOCKED, p->p_ucred,
- &resid, p);
+ UIO_SYSSPACE, IO_NODELOCKED, uc, &resid, p);
+ crfree(uc);
if (error)
return error;
OpenPOWER on IntegriCloud