You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							195 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
	
	
							195 lines
						
					
					
						
							4.8 KiB
						
					
					
				| # --- T2-COPYRIGHT-NOTE-BEGIN --- | |
| # This copyright note is auto-generated by ./scripts/Create-CopyPatch. | |
| #  | |
| # T2 SDE: package/.../pdksh/pdksh-5.2.14-1.patch | |
| # Copyright (C) 2004 - 2006 The T2 SDE Project | |
| # Copyright (C) 1998 - 2003 Clifford Wolf | |
| #  | |
| # More information can be found in the files COPYING and README. | |
| #  | |
| # This patch file is dual-licensed. It is available under the license the | |
| # patched project is licensed under, as long as it is an OpenSource license | |
| # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | |
| # of the GNU General Public License as published by the Free Software | |
| # Foundation; either version 2 of the License, or (at your option) any later | |
| # version. | |
| # --- T2-COPYRIGHT-NOTE-END --- | |
|  | |
|  | |
| [ ftp://ftp.cs.mun.ca/pub/pdksh/pdksh-5.2.14-patches.1 ] | |
|  | |
| Here are patches for 3 significant bugs in pdksh-5.2.14: | |
|     - set -x dumps core (shf.c); | |
|     - output of "jobs" command is filled with ^A characters (jobs.c); | |
|     - "typeset -r foo=bar" fails saying foo is readonly (var.c). | |
|  | |
| --- ./shf.c | |
| +++ ./shf.c | |
| @@ -355,7 +355,6 @@ | |
|  		shf->rp = nbuf + (shf->rp - shf->buf); | |
|  		shf->wp = nbuf + (shf->wp - shf->buf); | |
|  		shf->rbsize += shf->wbsize; | |
| -		shf->wbsize += shf->wbsize; | |
|  		shf->wnleft += shf->wbsize; | |
|  		shf->wbsize *= 2; | |
|  		shf->buf = nbuf; | |
|  | |
|  | |
| --- ./var.c | |
| +++ ./var.c | |
| @@ -353,7 +353,9 @@ | |
|  	const char *s; | |
|  	int error_ok; | |
|  { | |
| -	if (vq->flag & RDONLY) { | |
| +	int no_ro_check = error_ok & 0x4; | |
| +	error_ok &= ~0x4; | |
| +	if ((vq->flag & RDONLY) && !no_ro_check) { | |
|  		warningf(TRUE, "%s: is read only", vq->name); | |
|  		if (!error_ok) | |
|  			errorf(null); | |
| @@ -715,13 +717,13 @@ | |
|  	if (val != NULL) { | |
|  		if (vp->flag&INTEGER) { | |
|  			/* do not zero base before assignment */ | |
| -			setstr(vp, val, KSH_UNWIND_ERROR); | |
| +			setstr(vp, val, KSH_UNWIND_ERROR | 0x4); | |
|  			/* Done after assignment to override default */ | |
|  			if (base > 0) | |
|  				vp->type = base; | |
|  		} else | |
|  			/* setstr can't fail (readonly check already done) */ | |
| -			setstr(vp, val, KSH_RETURN_ERROR); | |
| +			setstr(vp, val, KSH_RETURN_ERROR | 0x4); | |
|  	} | |
|   | |
|  	/* only x[0] is ever exported, so use vpbase */ | |
|  | |
|  | |
| --- ./jobs.c | |
| +++ ./jobs.c | |
| @@ -219,8 +219,7 @@ | |
|  static void		check_job ARGS((Job *j)); | |
|  static void		put_job ARGS((Job *j, int where)); | |
|  static void		remove_job ARGS((Job *j, const char *where)); | |
| -static void		kill_job ARGS((Job *j)); | |
| -static void	 	fill_command ARGS((char *c, int len, struct op *t)); | |
| +static int		kill_job ARGS((Job *j, int sig)); | |
|   | |
|  /* initialize job control */ | |
|  void | |
| @@ -294,10 +293,17 @@ | |
|  				    && procpid == kshpid))))) | |
|  		{ | |
|  			killed = 1; | |
| -			killpg(j->pgrp, SIGHUP); | |
| +			if (j->pgrp == 0) | |
| +				kill_job(j, SIGHUP); | |
| +			else | |
| +				killpg(j->pgrp, SIGHUP); | |
|  #ifdef JOBS | |
| -			if (j->state == PSTOPPED) | |
| -				killpg(j->pgrp, SIGCONT); | |
| +			if (j->state == PSTOPPED) { | |
| +				if (j->pgrp == 0) | |
| +					kill_job(j, SIGCONT); | |
| +				else | |
| +					killpg(j->pgrp, SIGCONT); | |
| +			} | |
|  #endif /* JOBS */ | |
|  		} | |
|  	} | |
| @@ -497,7 +503,7 @@ | |
|  		put_job(j, PJ_PAST_STOPPED); | |
|  	} | |
|   | |
| -	fill_command(p->command, sizeof(p->command), t); | |
| +	snptreef(p->command, sizeof(p->command), "%T", t); | |
|   | |
|  	/* create child process */ | |
|  	forksleep = 1; | |
| @@ -508,7 +514,7 @@ | |
|  		forksleep <<= 1; | |
|  	} | |
|  	if (i < 0) { | |
| -		kill_job(j); | |
| +		kill_job(j, SIGKILL); | |
|  		remove_job(j, "fork failed"); | |
|  #ifdef NEED_PGRP_SYNC | |
|  		if (j_sync_open) { | |
| @@ -823,11 +829,10 @@ | |
|  	} | |
|   | |
|  	if (j->pgrp == 0) {	/* started when !Flag(FMONITOR) */ | |
| -		for (p=j->proc_list; p != (Proc *) 0; p = p->next) | |
| -			if (kill(p->pid, sig) < 0) { | |
| -				bi_errorf("%s: %s", cp, strerror(errno)); | |
| -				rv = 1; | |
| -			} | |
| +		if (kill_job(j, sig) < 0) { | |
| +			bi_errorf("%s: %s", cp, strerror(errno)); | |
| +			rv = 1; | |
| +		} | |
|  	} else { | |
|  #ifdef JOBS | |
|  		if (j->state == PSTOPPED && (sig == SIGTERM || sig == SIGHUP)) | |
| @@ -1825,50 +1830,17 @@ | |
|   * | |
|   * If jobs are compiled in then this routine expects sigchld to be blocked. | |
|   */ | |
| -static void | |
| -kill_job(j) | |
| +static int | |
| +kill_job(j, sig) | |
|  	Job	*j; | |
| +	int	sig; | |
|  { | |
|  	Proc	*p; | |
| +	int	rval = 0; | |
|   | |
|  	for (p = j->proc_list; p != (Proc *) 0; p = p->next) | |
|  		if (p->pid != 0) | |
| -			(void) kill(p->pid, SIGKILL); | |
| -} | |
| - | |
| -/* put a more useful name on a process than snptreef does (in certain cases) */ | |
| -static void | |
| -fill_command(c, len, t) | |
| -	char		*c; | |
| -	int		len; | |
| -	struct op	*t; | |
| -{ | |
| -	int		alen; | |
| -	char		**ap; | |
| - | |
| -	if (t->type == TEXEC || t->type == TCOM) { | |
| -		/* Causes problems when set -u is in effect, can also | |
| -		   cause problems when array indices evaluated (may have | |
| -		   side effects, eg, assignment, incr, etc.) | |
| -		if (t->type == TCOM) | |
| -			ap = eval(t->args, DOBLANK|DONTRUNCOMMAND); | |
| -		else | |
| -		*/ | |
| -		ap = t->args; | |
| -		--len; /* save room for the null */ | |
| -		while (len > 0 && *ap != (char *) 0) { | |
| -			alen = strlen(*ap); | |
| -			if (alen > len) | |
| -				alen = len; | |
| -			memcpy(c, *ap, alen); | |
| -			c += alen; | |
| -			len -= alen; | |
| -			if (len > 0) { | |
| -				*c++ = ' '; len--; | |
| -			} | |
| -			ap++; | |
| -		} | |
| -		*c = '\0'; | |
| -	} else | |
| -		snptreef(c, len, "%T", t); | |
| +			if (kill(p->pid, sig) < 0) | |
| +				rval = -1; | |
| +	return rval; | |
|  } | |
|  | |
| 
 | |
| 
 |