components/ksh93/patches/245-22550551.patch
changeset 5615 44d8b21d95e4
equal deleted inserted replaced
5614:12b0db03649b 5615:44d8b21d95e4
       
     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;