summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_proc.c
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2002-03-31 10:33:12 +0000
committeralfred <alfred@FreeBSD.org>2002-03-31 10:33:12 +0000
commitabeff55bde40353c261ed8d321536f7f4a03abc7 (patch)
treeb144f5ea66e4d004f22d97e6595e1131f00e1ffb /sys/kern/kern_proc.c
parentdf30d6374fe92f59350770d63cd31f77979006da (diff)
downloadFreeBSD-src-abeff55bde40353c261ed8d321536f7f4a03abc7.zip
FreeBSD-src-abeff55bde40353c261ed8d321536f7f4a03abc7.tar.gz
Close some holes with p->p_args by NULL'ing out the p->p_args pointer
while holding the proc lock, and by holding the pargs structure when accessing it from outside of the owner. Submitted by: Jonathan Mini <mini@haikugeek.com>
Diffstat (limited to 'sys/kern/kern_proc.c')
-rw-r--r--sys/kern/kern_proc.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 79849bc..a1620bc 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -1019,10 +1019,17 @@ sysctl_kern_proc_args(SYSCTL_HANDLER_ARGS)
if (req->newptr && curproc != p)
return (EPERM);
- if (req->oldptr && p->p_args != NULL)
- error = SYSCTL_OUT(req, p->p_args->ar_args, p->p_args->ar_length);
- if (req->newptr == NULL)
+ PROC_LOCK(p);
+ pa = p->p_args;
+ pargs_hold(pa);
+ PROC_UNLOCK(p);
+ if (req->oldptr && pa != NULL) {
+ error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length);
+ }
+ if (req->newptr == NULL) {
+ pargs_drop(pa);
return (error);
+ }
PROC_LOCK(p);
pa = p->p_args;
OpenPOWER on IntegriCloud