Bug #752 ยป execve-leak.diff
emulation/linux/i386/linux_machdep.c 30 Jul 2007 13:09:52 -0000 | ||
---|---|---|
exec_free_args(&exec_args);
|
||
linux_free_path(&path);
|
||
if (error < 0) {
|
||
/* We hit a leathal error condition. Let's die now. */
|
||
exit1(W_EXITCODE(0, SIGABRT));
|
||
/* NOTREACHED */
|
||
}
|
||
return(error);
|
||
}
|
||
kern/kern_exec.c 30 Jul 2007 13:22:14 -0000 | ||
---|---|---|
*/
|
||
static const struct execsw **execsw;
|
||
/*
|
||
* Replace current vmspace with a new binary.
|
||
* Returns 0 on success, > 0 on recoverable error (use as errno).
|
||
* Returns -1 on leathal error which demands killing of the current
|
||
* process!
|
||
*/
|
||
int
|
||
kern_execve(struct nlookupdata *nd, struct image_args *args)
|
||
{
|
||
... | ... | |
if (imgp->vmspace_destroyed & 2)
|
||
p->p_flag &= ~P_INEXEC;
|
||
if (imgp->vmspace_destroyed) {
|
||
/* sorry, no more process anymore. exit gracefully */
|
||
exit1(W_EXITCODE(0, SIGABRT));
|
||
/* NOT REACHED */
|
||
return(0);
|
||
/*
|
||
* Sorry, no more process anymore. exit gracefully.
|
||
* However we can't die right here, because our
|
||
* caller might have to clean up, so indicate a
|
||
* leathal error by returning -1.
|
||
*/
|
||
return(-1);
|
||
} else {
|
||
return(error);
|
||
}
|
||
... | ... | |
nlookup_done(&nd);
|
||
exec_free_args(&args);
|
||
if (error < 0) {
|
||
/* We hit a leathal error condition. Let's die now. */
|
||
exit1(W_EXITCODE(0, SIGABRT));
|
||
/* NOTREACHED */
|
||
}
|
||
/*
|
||
* The syscall result is returned in registers to the new program.
|
||
* Linux will register %edx as an atexit function and we must be
|