diff -up ksh-20100621/src/cmd/ksh93/sh/jobs.c.chexitcode ksh-20100621/src/cmd/ksh93/sh/jobs.c --- ksh-20100621/src/cmd/ksh93/sh/jobs.c.chexitcode 2011-07-26 15:21:10.127695948 +0200 +++ ksh-20100621/src/cmd/ksh93/sh/jobs.c 2011-07-26 15:21:35.301869857 +0200 @@ -1791,13 +1791,17 @@ void job_subrestore(void* ptr) register struct jobsave *jp; register struct back_save *bp = (struct back_save*)ptr; register struct process *pw, *px, *pwnext; - struct jobsave *jpnext; + struct jobsave *end=NULL; job_lock(); - for(jp=bck.list; jp; jp=jpnext) - { - jpnext = jp->next; - job_chksave(jp->pid); - } + for(jp=bck.list; jp; jp=jp->next) + if (!jp->next) + end = jp; + + if(end) + end->next = bp->list; + else + bck.list = bp->list; + bck.count += bp->count; for(pw=job.pwlist; pw; pw=pwnext) { pwnext = pw->p_nxtjob; @@ -1808,11 +1812,6 @@ void job_subrestore(void* ptr) job_unpost(pw,0); } - /* - * queue up old lists for disposal by job_reap() - */ - - bck = *bp; free((void*)bp); job_unlock(); }