summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-24 00:27:28 +0000
committerjhb <jhb@FreeBSD.org>2001-01-24 00:27:28 +0000
commita294d4e362c79943729544b2c37f98be3a6f0dac (patch)
tree8794f893081a4e5c2206a94c71a5af5f035f04b7 /sys/kern
parentf540aca98452ae3328bb85b3019b403196f8d16d (diff)
downloadFreeBSD-src-a294d4e362c79943729544b2c37f98be3a6f0dac.zip
FreeBSD-src-a294d4e362c79943729544b2c37f98be3a6f0dac.tar.gz
Proc locking.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/imgact_aout.c8
-rw-r--r--sys/kern/imgact_elf.c7
-rw-r--r--sys/kern/imgact_gzip.c1
3 files changed, 14 insertions, 2 deletions
diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c
index 6e0edde..ff315f5 100644
--- a/sys/kern/imgact_aout.c
+++ b/sys/kern/imgact_aout.c
@@ -155,6 +155,7 @@ exec_aout_imgact(imgp)
/*
* text/data/bss must not exceed limits
*/
+ mtx_assert(&Giant, MA_OWNED);
if (/* text can't exceed maximum text size */
a_out->a_text > MAXTSIZ ||
@@ -248,13 +249,17 @@ aout_coredump(p, vp, limit)
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;
if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= limit)
return (EFAULT);
fill_kinfo_proc(p, &p->p_addr->u_kproc);
+ 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,
@@ -266,6 +271,7 @@ aout_coredump(p, vp, limit)
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);
}
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 96db3b3..c3d8cf7 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -722,7 +722,7 @@ elf_coredump(p, vp, limit)
register struct vnode *vp;
off_t limit;
{
- register struct ucred *cred = p->p_ucred;
+ register struct ucred *cred;
int error = 0;
struct sseg_closure seginfo;
void *hdr;
@@ -754,6 +754,10 @@ elf_coredump(p, vp, limit)
if (hdr == NULL) {
return EINVAL;
}
+ PROC_LOCK(p);
+ cred = p->p_ucred;
+ crhold(cred);
+ PROC_UNLOCK(p);
error = elf_corehdr(p, vp, cred, seginfo.count, hdr, hdrsize);
/* Write the contents of all of the writable segments. */
@@ -774,6 +778,7 @@ elf_coredump(p, vp, limit)
php++;
}
}
+ crfree(cred);
free(hdr, M_TEMP);
return error;
diff --git a/sys/kern/imgact_gzip.c b/sys/kern/imgact_gzip.c
index a3a6a68..676d37f 100644
--- a/sys/kern/imgact_gzip.c
+++ b/sys/kern/imgact_gzip.c
@@ -206,6 +206,7 @@ do_aout_hdr(struct imgact_gzip * gz)
/*
* text/data/bss must not exceed limits
*/
+ mtx_assert(&Giant, MA_OWNWED);
if ( /* text can't exceed maximum text size */
gz->a_out.a_text > MAXTSIZ ||
OpenPOWER on IntegriCloud