summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2002-06-20 17:27:28 +0000
committeralfred <alfred@FreeBSD.org>2002-06-20 17:27:28 +0000
commit4f8d67f85285bf07b2b7e42c3ab9c3bece0ada97 (patch)
tree736054b21bf318373a48f72220ae3aa378190396 /sys/kern/kern_exec.c
parent8e683e45efc4dc54cc0c85c2d7de550694a4abc9 (diff)
downloadFreeBSD-src-4f8d67f85285bf07b2b7e42c3ab9c3bece0ada97.zip
FreeBSD-src-4f8d67f85285bf07b2b7e42c3ab9c3bece0ada97.tar.gz
Don't leak resources if fdcheckstd() fails during exec.
Submitted by: Mike Makonnen <makonnen@pacbell.net>
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r--sys/kern/kern_exec.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 39da17e..79a1dc5 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -134,7 +134,7 @@ execve(td, uap)
struct image_params image_params, *imgp;
struct vattr attr;
int (*img_first)(struct image_params *);
- struct pargs *oldargs, *newargs = NULL;
+ struct pargs *oldargs = NULL, *newargs = NULL;
struct procsig *oldprocsig, *newprocsig;
#ifdef KTRACE
struct vnode *tracevp = NULL;
@@ -385,8 +385,10 @@ interpret:
#endif
/* Make sure file descriptors 0..2 are in use. */
error = fdcheckstd(td);
- if (error != 0)
- goto exec_fail_dealloc;
+ if (error != 0) {
+ oldcred = NULL;
+ goto done1;
+ }
/*
* Set the new credentials.
*/
@@ -469,6 +471,7 @@ interpret:
p->p_args = newargs;
newargs = NULL;
}
+done1:
PROC_UNLOCK(p);
/*
@@ -479,7 +482,6 @@ interpret:
crfree(oldcred);
else
crfree(newcred);
- KASSERT(newargs == NULL, ("leaking p_args"));
/*
* Handle deferred decrement of ref counts.
*/
@@ -489,7 +491,10 @@ interpret:
if (tracevp != NULL)
vrele(tracevp);
#endif
- pargs_drop(oldargs);
+ if (oldargs != NULL)
+ pargs_drop(oldargs);
+ if (newargs != NULL)
+ pargs_drop(newargs);
exec_fail_dealloc:
OpenPOWER on IntegriCloud