|
1 This issue has been fixed upstream in the 2016-01-10-beta version. |
|
2 --- INIT.2012-08-01.old/src/cmd/ksh93/sh/jobs.c 2015-10-30 05:05:17.556367591 -0700 |
|
3 +++ INIT.2012-08-01.new/src/cmd/ksh93/sh/jobs.c 2016-02-23 04:23:52.229101513 -0800 |
|
4 @@ -58,6 +58,7 @@ |
|
5 struct jobsave *next; |
|
6 pid_t pid; |
|
7 unsigned short exitval; |
|
8 + unsigned short env; |
|
9 }; |
|
10 |
|
11 static struct jobsave *job_savelist; |
|
12 @@ -133,7 +134,7 @@ |
|
13 #define P_BG 01000 |
|
14 #endif /* SHOPT_BGX */ |
|
15 |
|
16 -static int job_chksave(pid_t); |
|
17 +static int job_chksave(pid_t,long); |
|
18 static struct process *job_bypid(pid_t); |
|
19 static struct process *job_byjid(int); |
|
20 static char *job_sigmsg(int); |
|
21 @@ -233,9 +234,9 @@ |
|
22 static struct jobsave *jobsave_create(pid_t pid) |
|
23 { |
|
24 register struct jobsave *jp = job_savelist; |
|
25 - job_chksave(pid); |
|
26 + job_chksave(pid,-1); |
|
27 if(++bck.count > shgd->lim.child_max) |
|
28 - job_chksave(0); |
|
29 + job_chksave(0,-1); |
|
30 if(jp) |
|
31 { |
|
32 njob_savelist--; |
|
33 @@ -425,7 +426,7 @@ |
|
34 if(pid<=0) |
|
35 break; |
|
36 if(wstat==0) |
|
37 - job_chksave(pid); |
|
38 + job_chksave(pid,-1); |
|
39 flags |= WNOHANG; |
|
40 job.waitsafe++; |
|
41 jp = 0; |
|
42 @@ -1393,7 +1394,7 @@ |
|
43 else |
|
44 pw->p_name = -1; |
|
45 #endif /* JOBS */ |
|
46 - if ((val = job_chksave(pid))>=0 && !jobfork) |
|
47 + if ((val = job_chksave(pid,pw->p_env))>=0 && !jobfork) |
|
48 { |
|
49 pw->p_exit = val; |
|
50 if(pw->p_exit==SH_STOPSIG) |
|
51 @@ -1515,7 +1516,7 @@ |
|
52 if(!(pw=job_bypid(pid))) |
|
53 { |
|
54 /* check to see whether job status has been saved */ |
|
55 - if((shp->exitval = job_chksave(pid)) < 0) |
|
56 + if((shp->exitval = job_chksave(pid,shp->curenv)) < 0) |
|
57 shp->exitval = ERROR_NOENT; |
|
58 exitset(); |
|
59 job_unlock(); |
|
60 @@ -1937,7 +1938,7 @@ |
|
61 * if pid==0, then oldest saved process is deleted |
|
62 * If pid is not found a -1 is returned. |
|
63 */ |
|
64 -static int job_chksave(register pid_t pid) |
|
65 +static int job_chksave(register pid_t pid, long env) |
|
66 { |
|
67 register struct jobsave *jp = bck.list, *jpold=0; |
|
68 register int r= -1; |
|
69 @@ -1957,9 +1958,10 @@ |
|
70 { |
|
71 count = bp->count; |
|
72 jp = bp->list; |
|
73 + jpold = 0; |
|
74 goto again; |
|
75 } |
|
76 - if(jp) |
|
77 + if(jp && (env<0 || jp->env==env)) |
|
78 { |
|
79 r = 0; |
|
80 if(pid) |
|
81 @@ -1996,15 +1998,18 @@ |
|
82 |
|
83 void job_subrestore(void* ptr) |
|
84 { |
|
85 - register struct jobsave *jp; |
|
86 + register struct jobsave *jp,*jpnext; |
|
87 register struct back_save *bp = (struct back_save*)ptr; |
|
88 register struct process *pw, *px, *pwnext; |
|
89 struct jobsave *end=NULL; |
|
90 + int i=0; |
|
91 job_lock(); |
|
92 - for(jp=bck.list; jp; jp=jp->next) |
|
93 + for(jp=bck.list; jp; jp=jpnext,i++) |
|
94 { |
|
95 - if (!jp->next) |
|
96 + if (!(jpnext=jp->next) || jp==jpnext) |
|
97 end = jp; |
|
98 + if(i>=shgd->lim.child_max) |
|
99 + break; |
|
100 } |
|
101 if(end) |
|
102 end->next = bp->list; |
|
103 @@ -2013,7 +2018,7 @@ |
|
104 bck.count += bp->count; |
|
105 bck.prev = bp->prev; |
|
106 while(bck.count > shgd->lim.child_max) |
|
107 - job_chksave(0); |
|
108 + job_chksave(0,-1); |
|
109 for(pw=job.pwlist; pw; pw=pwnext) |
|
110 { |
|
111 pwnext = pw->p_nxtjob; |
|
112 @@ -2051,7 +2056,7 @@ |
|
113 job.in_critical = 0; |
|
114 break; |
|
115 default: |
|
116 - job_chksave(parent); |
|
117 + job_chksave(parent,-1); |
|
118 jobfork=0; |
|
119 job_unlock(); |
|
120 break; |