kernel: sysrfork abortion
when we fail to fork resources for the child due to resource exhaustion, make the half forked child process call pexit() to free the resources that where allocated and error out.
This commit is contained in:
parent
6025ad06da
commit
8cce104fcb
1 changed files with 16 additions and 0 deletions
|
@ -21,6 +21,12 @@ sysr1(ulong*)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
abortion(void*)
|
||||||
|
{
|
||||||
|
pexit("fork aborted", 1);
|
||||||
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
sysrfork(ulong *arg)
|
sysrfork(ulong *arg)
|
||||||
{
|
{
|
||||||
|
@ -101,6 +107,14 @@ sysrfork(ulong *arg)
|
||||||
p->ureg = up->ureg;
|
p->ureg = up->ureg;
|
||||||
p->dbgreg = 0;
|
p->dbgreg = 0;
|
||||||
|
|
||||||
|
/* Abort the child process on error */
|
||||||
|
if(waserror()){
|
||||||
|
p->kp = 1;
|
||||||
|
kprocchild(p, abortion, 0);
|
||||||
|
ready(p);
|
||||||
|
nexterror();
|
||||||
|
}
|
||||||
|
|
||||||
/* Make a new set of memory segments */
|
/* Make a new set of memory segments */
|
||||||
n = flag & RFMEM;
|
n = flag & RFMEM;
|
||||||
qlock(&p->seglock);
|
qlock(&p->seglock);
|
||||||
|
@ -164,6 +178,8 @@ sysrfork(ulong *arg)
|
||||||
if(up->procctl == Proc_tracesyscall)
|
if(up->procctl == Proc_tracesyscall)
|
||||||
p->procctl = Proc_tracesyscall;
|
p->procctl = Proc_tracesyscall;
|
||||||
|
|
||||||
|
poperror(); /* abortion */
|
||||||
|
|
||||||
/* Craft a return frame which will cause the child to pop out of
|
/* Craft a return frame which will cause the child to pop out of
|
||||||
* the scheduler in user mode with the return register zero
|
* the scheduler in user mode with the return register zero
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue