Don't leak resources if fdcheckstd() fails during exec.

Submitted by: Mike Makonnen <makonnen@pacbell.net>
This commit is contained in:
Alfred Perlstein 2002-06-20 17:27:28 +00:00
parent 41623b2d75
commit 69be5db96f

@ -134,7 +134,7 @@ execve(td, uap)
struct image_params image_params, *imgp; struct image_params image_params, *imgp;
struct vattr attr; struct vattr attr;
int (*img_first)(struct image_params *); int (*img_first)(struct image_params *);
struct pargs *oldargs, *newargs = NULL; struct pargs *oldargs = NULL, *newargs = NULL;
struct procsig *oldprocsig, *newprocsig; struct procsig *oldprocsig, *newprocsig;
#ifdef KTRACE #ifdef KTRACE
struct vnode *tracevp = NULL; struct vnode *tracevp = NULL;
@ -385,8 +385,10 @@ interpret:
#endif #endif
/* Make sure file descriptors 0..2 are in use. */ /* Make sure file descriptors 0..2 are in use. */
error = fdcheckstd(td); error = fdcheckstd(td);
if (error != 0) if (error != 0) {
goto exec_fail_dealloc; oldcred = NULL;
goto done1;
}
/* /*
* Set the new credentials. * Set the new credentials.
*/ */
@ -469,6 +471,7 @@ interpret:
p->p_args = newargs; p->p_args = newargs;
newargs = NULL; newargs = NULL;
} }
done1:
PROC_UNLOCK(p); PROC_UNLOCK(p);
/* /*
@ -479,7 +482,6 @@ interpret:
crfree(oldcred); crfree(oldcred);
else else
crfree(newcred); crfree(newcred);
KASSERT(newargs == NULL, ("leaking p_args"));
/* /*
* Handle deferred decrement of ref counts. * Handle deferred decrement of ref counts.
*/ */
@ -489,7 +491,10 @@ interpret:
if (tracevp != NULL) if (tracevp != NULL)
vrele(tracevp); vrele(tracevp);
#endif #endif
pargs_drop(oldargs); if (oldargs != NULL)
pargs_drop(oldargs);
if (newargs != NULL)
pargs_drop(newargs);
exec_fail_dealloc: exec_fail_dealloc: