diff options
| -rw-r--r-- | sys/src/9/port/sysproc.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 0d0e22661..477d50fd5 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -21,6 +21,12 @@ sysr1(ulong*) return 0; } +static void +abortion(void*) +{ + pexit("fork aborted", 1); +} + long sysrfork(ulong *arg) { @@ -101,6 +107,14 @@ sysrfork(ulong *arg) p->ureg = up->ureg; 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 */ n = flag & RFMEM; qlock(&p->seglock); @@ -164,6 +178,8 @@ sysrfork(ulong *arg) if(up->procctl == Proc_tracesyscall) p->procctl = Proc_tracesyscall; + poperror(); /* abortion */ + /* Craft a return frame which will cause the child to pop out of * the scheduler in user mode with the return register zero */ |
