#9 Restore ksh to version 20120801
Merged 3 years ago by svashisht. Opened 3 years ago by svashisht.
rpms/ svashisht/ksh revert-to-ksh20120801  into  master

file modified
-3
@@ -59,6 +59,3 @@ 

  /ast-ksh.2012-08-01.tgz

  /INIT.2012-08-01.tgz

  /ast-ksh.2012-08-01b.tgz

- /ksh-2020.0.0-alpha1.tar.gz

- /ksh-2020.0.0-beta1.tar.gz

- /ksh-2020.0.0.tar.gz

@@ -0,0 +1,11 @@ 

+ diff -up ksh-20080202/src/cmd/ksh93/data/builtins.c.builtins ksh-20080202/src/cmd/ksh93/data/builtins.c

+ --- ksh-20080202/src/cmd/ksh93/data/builtins.c.builtins	2008-10-01 09:24:46.000000000 +0200

+ +++ ksh-20080202/src/cmd/ksh93/data/builtins.c	2008-10-01 09:24:58.000000000 +0200

+ @@ -129,7 +129,6 @@ const struct shtable3 shtab_builtins[] =

+  	CMDLIST(dirname)

+  	CMDLIST(getconf)

+  	CMDLIST(head)

+ -	CMDLIST(mkdir)

+  	CMDLIST(logname)

+  	CMDLIST(cat)

+  	CMDLIST(cmp)

@@ -0,0 +1,47 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh.1.manfix ksh-20120801/src/cmd/ksh93/sh.1

+ --- ksh-20120801/src/cmd/ksh93/sh.1.manfix	2012-06-18 16:16:22.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh.1	2013-04-30 13:35:17.393909479 +0200

+ @@ -39,7 +39,7 @@ ksh93, rksh93, pfksh93 \- KornShell, a s

+  .B ksh93

+  .\}

+  [

+ -.B \(+-abcefhikmnoprstuvxBCDP

+ +.B \(+-abcefhiknoprstuvxBCDP

+  ] [

+  .B \-R

+  file ] [

+ @@ -47,25 +47,6 @@ file ] [

+  option ] .\|.\|. [

+  .B \-

+  ] [ arg .\|.\|. ]

+ -.br

+ -.if \nZ=0 \{\

+ -.B rsh

+ -.\}

+ -.if \nZ=1 \{\

+ -.B rksh

+ -.\}

+ -.if \nZ=2 \{\

+ -.B rksh93

+ -.\}

+ -[

+ -.B \(+-abcefhikmnoprstuvxBCD

+ -] [

+ -.B \-R

+ -file ] [

+ -.B \(+-o

+ -option ] .\|.\|.  [

+ -.B \-

+ -] [ arg .\|.\|. ]

+  .SH DESCRIPTION

+  .if \nZ=0 .I Sh\^

+  .if \nZ=1 .I Ksh\^

+ @@ -7963,6 +7944,8 @@ option is used

+  to generate a cross reference database

+  that can be used by a separate utility

+  to find definitions and references for variables and commands.

+ +The filename argument specifies the generated database. A script file must be

+ +provided on the command line as well.

+  .PP

+  The remaining options and arguments are described under the

+  .B set

@@ -0,0 +1,20 @@ 

+ diff -up ksh-20100202/src/cmd/ksh93/sh.1.pathvar ksh-20100202/src/cmd/ksh93/sh.1

+ --- ksh-20100202/src/cmd/ksh93/sh.1.pathvar	2011-04-26 16:42:08.000000000 +0200

+ +++ ksh-20100202/src/cmd/ksh93/sh.1	2011-04-27 09:09:00.315883280 +0200

+ @@ -4025,13 +4025,9 @@ the directory containing the command.

+  Alternative directory names are separated by

+  a colon

+  .RB ( : ).

+ -The default path is

+ -.B /bin:/usr/bin:

+ -(specifying

+ -.BR /bin ,

+ -.BR /usr/bin ,

+ -and the current directory

+ -in that order).

+ +The default path is equal to

+ +.BI getconf\ PATH

+ +output.

+  The current directory can be specified by

+  two or more adjacent colons, or by a colon

+  at the beginning or end of the path list.

@@ -0,0 +1,54 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.fdstatus	2013-07-04 18:01:27.187516655 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2013-07-04 18:01:38.249607392 +0200

+ @@ -1508,7 +1508,7 @@ int	sh_redirect(Shell_t *shp,struct iono

+  					fn = fd;

+  					if(fd<10)

+  					{

+ -						if((fn=fcntl(fd,F_DUPFD,10)) < 0)

+ +						if((fn=sh_fcntl(fd,F_DUPFD,10)) < 0)

+  							goto fail;

+  						if(fn>=shp->gd->lim.open_max && !sh_iovalidfd(shp,fn))

+  							goto fail;

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.fdstatus	2012-07-17 23:54:21.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2013-07-04 17:56:20.342000310 +0200

+ @@ -122,7 +122,7 @@ void	sh_subtmpfile(Shell_t *shp)

+  		register struct checkpt	*pp = (struct checkpt*)shp->jmplist;

+  		register struct subshell *sp = subshell_data->pipe;

+  		/* save file descriptor 1 if open */

+ -		if((sp->tmpfd = fd = fcntl(1,F_DUPFD,10)) >= 0)

+ +		if((sp->tmpfd = fd = sh_fcntl(1,F_DUPFD,10)) >= 0)

+  		{

+  			fcntl(fd,F_SETFD,FD_CLOEXEC);

+  			shp->fdstatus[fd] = shp->fdstatus[1]|IOCLEX;

+ @@ -554,7 +554,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  				sp->pwdfd = n;

+  				if(n<10)

+  				{

+ -					sp->pwdfd =  fcntl(n,F_DUPFD,10);

+ +					sp->pwdfd = sh_fcntl(n,F_DUPFD,10);

+  					close(n);

+  				}

+  				if(sp->pwdfd>0)

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fdstatus ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.fdstatus	2012-07-23 16:49:32.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2013-07-04 17:57:47.153712116 +0200

+ @@ -116,7 +116,7 @@ static int iousepipe(Shell_t *shp)

+  		return(0);

+  	usepipe++;

+  	fcntl(subpipe[0],F_SETFD,FD_CLOEXEC);

+ -	subpipe[2] = fcntl(1,F_DUPFD,10);

+ +	subpipe[2] = sh_fcntl(1,F_DUPFD,10);

+  	fcntl(subpipe[2],F_SETFD,FD_CLOEXEC);

+  	shp->fdstatus[subpipe[2]] = shp->fdstatus[1];

+  	close(1);

+ @@ -3622,7 +3622,7 @@ static void coproc_init(Shell_t *shp, in

+  		sh_pipe(shp->cpipe);

+  		if((outfd=shp->cpipe[1]) < 10) 

+  		{

+ -		        int fd=fcntl(shp->cpipe[1],F_DUPFD,10);

+ +		        int fd=sh_fcntl(shp->cpipe[1],F_DUPFD,10);

+  			if(fd>=10)

+  			{

+  			        shp->fdstatus[fd] = (shp->fdstatus[outfd]&~IOCLEX);

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20100621/src/cmd/ksh93/sh.1.manfix3 ksh-20100621/src/cmd/ksh93/sh.1

+ --- ksh-20100621/src/cmd/ksh93/sh.1.manfix3	2013-05-02 13:07:51.180529762 +0200

+ +++ ksh-20100621/src/cmd/ksh93/sh.1	2013-05-02 13:11:30.469327199 +0200

+ @@ -7585,7 +7585,7 @@ file descriptor 2.

+  If the

+  .B \-i

+  option is present or

+ -if the shell input and output are attached to a terminal (as told by

+ +if the shell input and error output are attached to a terminal (as told by

+  .IR tcgetattr (2)),

+  then this shell is

+  .IR interactive .

@@ -0,0 +1,68 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/tests/builtins.sh.fixregr ksh-20120801/src/cmd/ksh93/tests/builtins.sh

+ --- ksh-20120801/src/cmd/ksh93/tests/builtins.sh.fixregr	2012-07-16 17:23:56.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/tests/builtins.sh	2012-08-08 12:29:00.733243019 +0200

+ @@ -303,9 +303,9 @@ then	err_exit "printf '%..*s' not workin

+  fi

+  [[ $(printf '%q\n') == '' ]] || err_exit 'printf "%q" with missing arguments'

+  # we won't get hit by the one second boundary twice, right?

+ -[[ $(printf '%T\n' now) == "$(date)" ]] ||

+ -[[ $(printf '%T\n' now) == "$(date)" ]] ||

+ -err_exit 'printf "%T" now'

+ +[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] ||

+ +[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] ||

+ +err_exit 'printf "%T" now = '"$(printf '%T\n' now) != $(date)"

+  behead()

+  {

+  	read line

+ diff -up ksh-20120801/src/cmd/ksh93/tests/locale.sh.fixregr ksh-20120801/src/cmd/ksh93/tests/locale.sh

+ --- ksh-20120801/src/cmd/ksh93/tests/locale.sh.fixregr	2012-06-26 21:57:46.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/tests/locale.sh	2012-08-08 12:29:20.039405240 +0200

+ @@ -104,6 +104,7 @@ if	(( $($SHELL -c $'export LC_ALL='$loca

+  then	LC_ALL=$locale $SHELL -c b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"; [[ ${b1:4:1} == w ]]' || err_exit 'multibyte ${var:offset:len} not working correctly'

+  fi

+  

+ +locale=en_US.UTF-8

+  #$SHELL -c 'export LANG='$locale'; printf "\u[20ac]\u[20ac]" > $tmp/two_euro_chars.txt'

+  printf $'\342\202\254\342\202\254' > $tmp/two_euro_chars.txt

+  exp="6 2 6"

+ @@ -111,11 +112,11 @@ set -- $($SHELL -c "

+  	unset LC_CTYPE

+  	export LANG=$locale

+  	export LC_ALL=C

+ -	command wc -C < $tmp/two_euro_chars.txt

+ +	command wc -m < $tmp/two_euro_chars.txt

+  	unset LC_ALL

+ -	command wc -C < $tmp/two_euro_chars.txt

+ +	command wc -m < $tmp/two_euro_chars.txt

+  	export LC_ALL=C

+ -	command wc -C < $tmp/two_euro_chars.txt

+ +	command wc -m < $tmp/two_euro_chars.txt

+  ")

+  got=$*

+  [[ $got == $exp ]] || err_exit "command wc LC_ALL default failed -- expected '$exp', got '$got'"

+ @@ -134,6 +135,8 @@ set -- $($SHELL -c "

+  got=$*

+  [[ $got == $exp ]] || err_exit "builtin wc LC_ALL default failed -- expected '$exp', got '$got'"

+  

+ +locale=C_EU.UTF-8

+ +

+  # multibyte char straddling buffer boundary

+  

+  {

+ @@ -190,6 +193,7 @@ do	exp=$1

+  done

+  

+  # setocale(LC_ALL,"") after setlocale() initialization

+ +locale=en_US.UTF-8

+  

+  printf 'f1\357\274\240f2\n' > input1

+  printf 't2\357\274\240f1\n' > input2

+ @@ -336,7 +340,7 @@ then	LC_ALL=en_US.UTF-8

+  	[[ $(print -r -- "$x") == $'hello\u[20ac]\xee world' ]] || err_exit '%q with unicode and non-unicode not working'

+  	if	[[ $(whence od) ]]

+  	then	got='68 65 6c 6c 6f e2 82 ac ee 20 77 6f 72 6c 64 0a'

+ -		[[ $(print -r -- "$x" | od -An -tx1) == "$got" ]] || err_exit "incorrect string from printf %q"

+ +		[[ $(print -r -- "$x" | od -An -tx1) =~ $got ]] || err_exit "incorrect string from printf %q"

+  	fi

+  	

+  fi

@@ -0,0 +1,22 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.orig ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.orig	2015-08-12 11:35:36.882268954 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2015-08-12 11:44:06.324587019 -0300

+ @@ -2580,10 +2580,18 @@ int sh_fcntl(register int fd, int op, ..

+  	if(newfd>=0) switch(op)

+  	{

+  	    case F_DUPFD:

+ +#if F_dupfd_cloexec != F_DUPFD

+ +	    case F_dupfd_cloexec:

+ +#endif

+  		if(shp->fdstatus[fd] == IOCLOSE)

+  			shp->fdstatus[fd] = 0;

+  		if(newfd>=shp->gd->lim.open_max)

+  			sh_iovalidfd(shp,newfd);

+ +#if F_dupfd_cloexec != F_DUPFD

+ +		if(op==F_dupfd_cloexec)

+ +			shp->fdstatus[newfd] = (shp->fdstatus[fd]|IOCLEX);

+ +		else

+ +#endif

+  		shp->fdstatus[newfd] = (shp->fdstatus[fd]&~IOCLEX);

+  		if(fdnotify)

+  			(*fdnotify)(fd,newfd);

@@ -0,0 +1,33 @@ 

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c	2014-12-10 20:11:17.693446084 -0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-12-10 20:11:24.753442619 -0200

+ @@ -576,6 +576,7 @@ static char* get_ifs(register Namval_t*

+  			shp->ifstable[' '] = shp->ifstable['\t'] = S_SPACE;

+  			shp->ifstable['\n'] = S_NL;

+  		}

+ +		shp->ifstable[0] = S_EOF;

+  	}

+  	return(value);

+  }

+ --- ksh-20120801/src/cmd/ksh93/bltins/alarm.c	2014-12-18 12:03:39.198461933 -0200

+ +++ ksh-20120801/src/cmd/ksh93/bltins/alarm.c	2014-12-18 12:04:32.464421268 -0200

+ @@ -130,6 +130,7 @@ void	sh_timetraps(Shell_t *shp)

+  {

+  	register struct tevent *tp, *tpnext;

+  	register struct tevent *tptop;

+ +	char	ifstable[256];

+  	while(1)

+  	{

+  		shp->sigflag[SIGALRM] &= ~SH_SIGALRM;

+ @@ -141,7 +142,11 @@ void	sh_timetraps(Shell_t *shp)

+  			{

+  				tp->flags &= ~L_FLAG;

+  				if(tp->action)

+ +				{

+ +				    	memcpy(ifstable,shp->ifstable,sizeof(ifstable));

+  					sh_fun(tp->action,tp->node,(char**)0);

+ +					memcpy(shp->ifstable,ifstable,sizeof(ifstable));

+ +				}

+  				tp->flags &= ~L_FLAG;

+  				if(!tp->flags)

+  				{

+ 

@@ -0,0 +1,150 @@ 

+ diff --git a/src/lib/libast/Mamfile b/src/lib/libast/Mamfile

+ --- a/src/lib/libast/Mamfile

+ +++ b/src/lib/libast/Mamfile

+ @@ -535,7 +535,7 @@ done misc/findlib.h

+  done misc/fastfind.c

+  meta fastfind.o %.c>%.o misc/fastfind.c fastfind

+  prev misc/fastfind.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Imisc -Iinclude -Istd -D_PACKAGE_ast -c misc/fastfind.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Imisc -Iinclude -Istd -D_PACKAGE_ast -c misc/fastfind.c

+  done fastfind.o generated

+  make hashalloc.o

+  make hash/hashalloc.c

+ @@ -1641,7 +1641,7 @@ done sfio/sfhdr.h

+  done port/mc.c

+  meta mc.o %.c>%.o port/mc.c mc

+  prev port/mc.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c port/mc.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c port/mc.c

+  done mc.o generated

+  make base64.o

+  make string/base64.c

+ @@ -2349,7 +2349,7 @@ prev tmx.h implicit

+  done tm/tmxfmt.c

+  meta tmxfmt.o %.c>%.o tm/tmxfmt.c tmxfmt

+  prev tm/tmxfmt.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c tm/tmxfmt.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c tm/tmxfmt.c

+  done tmxfmt.o generated

+  make tmxgettime.o

+  make tm/tmxgettime.c

+ @@ -3011,7 +3011,7 @@ prev include/ast.h implicit

+  done comp/spawnveg.c

+  meta spawnveg.o %.c>%.o comp/spawnveg.c spawnveg

+  prev comp/spawnveg.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c comp/spawnveg.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c comp/spawnveg.c

+  done spawnveg.o generated

+  make vfork.o

+  make comp/vfork.c

+ @@ -3812,7 +3812,7 @@ prev regex/reglib.h implicit

+  done regex/regcomp.c

+  meta regcomp.o %.c>%.o regex/regcomp.c regcomp

+  prev regex/regcomp.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iport -Iregex -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c regex/regcomp.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iport -Iregex -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c regex/regcomp.c

+  done regcomp.o generated

+  make regcache.o

+  make regex/regcache.c

+ @@ -4251,7 +4251,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfprintf.c

+  meta sfprintf.o %.c>%.o sfio/sfprintf.c sfprintf

+  prev sfio/sfprintf.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfprintf.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfprintf.c

+  done sfprintf.o generated

+  make sfputd.o

+  make sfio/sfputd.c

+ @@ -4291,7 +4291,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfrd.c

+  meta sfrd.o %.c>%.o sfio/sfrd.c sfrd

+  prev sfio/sfrd.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfrd.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfrd.c

+  done sfrd.o generated

+  make sfread.o

+  make sfio/sfread.c

+ @@ -4315,7 +4315,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfscanf.c

+  meta sfscanf.o %.c>%.o sfio/sfscanf.c sfscanf

+  prev sfio/sfscanf.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfscanf.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfscanf.c

+  done sfscanf.o generated

+  make sfseek.o

+  make sfio/sfseek.c

+ @@ -4331,7 +4331,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfset.c

+  meta sfset.o %.c>%.o sfio/sfset.c sfset

+  prev sfio/sfset.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfset.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfset.c

+  done sfset.o generated

+  make sfsetbuf.o

+  make sfio/sfsetbuf.c

+ @@ -4445,7 +4445,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfvprintf.c

+  meta sfvprintf.o %.c>%.o sfio/sfvprintf.c sfvprintf

+  prev sfio/sfvprintf.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${mam_cc_NOPROTECT} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfvprintf.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${mam_cc_NOPROTECT} ${DEBUG+-DDEBUG=${DEBUG}} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfvprintf.c

+  done sfvprintf.o generated

+  make sfvscanf.o

+  make sfio/sfvscanf.c

+ @@ -4454,7 +4454,7 @@ prev sfio/sfhdr.h implicit

+  done sfio/sfvscanf.c

+  meta sfvscanf.o %.c>%.o sfio/sfvscanf.c sfvscanf

+  prev sfio/sfvscanf.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfvscanf.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${CCFLAGS.FORCE} ${mam_cc_NOPROTECT} -I. -Icomp -Iport -Isfio -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfvscanf.c

+  done sfvscanf.o generated

+  make sfwr.o

+  make sfio/sfwr.c

+ diff --git a/src/lib/libast/string/strdup.c b/src/lib/libast/string/strdup.c

+ --- a/src/lib/libast/string/strdup.c

+ +++ b/src/lib/libast/string/strdup.c

+ @@ -50,18 +50,11 @@ __STDPP__directive pragma pp:nohide strdup

+  #define extern	__EXPORT__

+  #endif

+  

+ -#pragma GCC push_options

+ -#pragma GCC optimize ("O0")

+ -

+ -

+  extern char*

+ -strdup(register const char* s)

+ +_ast_strdup(const char* s)

+  {

+  	register char*	t;

+  	register int	n;

+  

+  	return (s && (t = oldof(0, char, n = strlen(s) + 1, 0))) ? (char*)memcpy(t, s, n) : (char*)0;

+  }

+ -

+ -#pragma GCC pop_options

+ -

+ diff --git a/src/lib/libcmd/Mamfile b/src/lib/libcmd/Mamfile

+ --- a/src/lib/libcmd/Mamfile

+ +++ b/src/lib/libcmd/Mamfile

+ @@ -611,7 +611,7 @@ make id.o

+  prev id.c

+  meta id.o %.c>%.o id.c id

+  prev id.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -I${PACKAGE_ast_INCLUDE} -DERROR_CATALOG=\""libcmd"\" -D_BLD_cmd -D_PACKAGE_ast -DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf@research.att.com>][-author?David Korn <dgk@research.att.com>][-copyright?Copyright (c) 1992-2012 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html][--catalog?libcmd]"\" -c id.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -I${PACKAGE_ast_INCLUDE} -DERROR_CATALOG=\""libcmd"\" -D_BLD_cmd -D_PACKAGE_ast -DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf@research.att.com>][-author?David Korn <dgk@research.att.com>][-copyright?Copyright (c) 1992-2012 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html][--catalog?libcmd]"\" -c id.c

+  done id.o generated

+  make join.o

+  prev join.c

+ diff --git a/src/lib/libdll/Mamfile b/src/lib/libdll/Mamfile

+ index fbeea49..a392d55 100644

+ --- a/src/lib/libdll/Mamfile

+ +++ b/src/lib/libdll/Mamfile

+ @@ -259,7 +259,7 @@ prev ${PACKAGE_ast_INCLUDE}/ast.h implicit

+  done dllscan.c

+  meta dllscan.o %.c>%.o dllscan.c dllscan

+  prev dllscan.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -I${PACKAGE_ast_INCLUDE} -D_BLD_dll -D_PACKAGE_ast -c dllscan.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -I${PACKAGE_ast_INCLUDE} -D_BLD_dll -D_PACKAGE_ast -c dllscan.c

+  done dllscan.o generated

+  make dllcheck.o

+  make dllcheck.c

@@ -0,0 +1,13 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.fixargs ksh-20120801/src/cmd/ksh93/sh/main.c

+ --- ksh-20120801/src/cmd/ksh93/sh/main.c.fixargs	2013-12-31 11:32:14.917874134 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/main.c	2013-12-31 11:32:58.028847126 +0100

+ @@ -757,7 +757,7 @@ static void fixargs(char **argv, int mod

+  		offset += size;

+  		buff[offset++] = ' ';

+  	}

+ -	buff[offset-1] = 0;

+ +	memset(&buff[offset - 1], 0, command_len - offset + 1);

+  #   ifdef PSTAT

+  	un.pst_command = stakptr(0);

+  	pstat(PSTAT_SETCMD,un,0,0,0);

+ 

@@ -0,0 +1,20 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.orig ksh-20120801/src/cmd/ksh93/sh/name.c

+ --- ksh-20120801/src/cmd/ksh93/sh/name.c.orig	2015-02-10 17:15:37.180783550 -0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/name.c	2015-02-10 18:25:51.726228437 -0200

+ @@ -1298,7 +1298,16 @@ void nv_delete(Namval_t* np, Dt_t *root,

+  		if(dtdelete(root,np))

+  		{

+  			if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np,flags&NV_TABLE)))

+ +			{

+ +				Namarr_t	*ap;

+ +				if(nv_isarray(np) && np->nvfun && (ap=nv_arrayptr(np)) && array_assoc(ap)) {

+ +					while(nv_associative(np,0,NV_ANEXT))

+ +						nv_associative(np, 0, NV_ADELETE);

+ +					nv_associative(np, 0, NV_AFREE);

+ +					free((void*)np->nvfun);

+ +				}

+  				free((void*)np);

+ +			}

+  		}

+  #if 0

+  		else

@@ -0,0 +1,22 @@ 

+ diff -up ksh-20120801/src/lib/libast/string/strdup.c.badgcc ksh-20120801/src/lib/libast/string/strdup.c

+ --- ksh-20120801/src/lib/libast/string/strdup.c.badgcc	2012-05-21 15:04:46.000000000 +0200

+ +++ ksh-20120801/src/lib/libast/string/strdup.c	2015-06-17 10:12:52.693922581 +0200

+ @@ -50,11 +50,18 @@ __STDPP__directive pragma pp:nohide strd

+  #define extern	__EXPORT__

+  #endif

+  

+ +#pragma GCC push_options

+ +#pragma GCC optimize ("O0")

+ +

+ +

+  extern char*

+  strdup(register const char* s)

+  {

+  	register char*	t;

+  	register int	n;

+  

+  	return (s && (t = oldof(0, char, n = strlen(s) + 1, 0))) ? (char*)memcpy(t, s, n) : (char*)0;

+  }

+ +

+ +#pragma GCC pop_options

+ +

@@ -0,0 +1,21 @@ 

+ diff --git a/src/cmd/ksh93/Mamfile b/src/cmd/ksh93/Mamfile

+ --- a/src/cmd/ksh93/Mamfile

+ +++ b/src/cmd/ksh93/Mamfile

+ @@ -1111,7 +1111,7 @@ prev include/defs.h implicit

+  done sh/trestore.c

+  meta trestore.o %.c>%.o sh/trestore.c trestore

+  prev sh/trestore.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SHOPT_SYSRC+-DSHOPT_SYSRC=${SHOPT_SYSRC}} ${SHOPT_ACCT+-DSHOPT_ACCT=${SHOPT_ACCT}} ${SHOPT_SPAWN+-DSHOPT_SPAWN=${SHOPT_SPAWN}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -D_BLD_shell -DKSHELL -D_API_ast=20100309 -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c sh/trestore.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SHOPT_SYSRC+-DSHOPT_SYSRC=${SHOPT_SYSRC}} ${SHOPT_ACCT+-DSHOPT_ACCT=${SHOPT_ACCT}} ${SHOPT_SPAWN+-DSHOPT_SPAWN=${SHOPT_SPAWN}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -D_BLD_shell -DKSHELL -D_API_ast=20100309 -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c sh/trestore.c

+  done trestore.o generated

+  make waitevent.o

+  make sh/waitevent.c

+ @@ -1199,7 +1199,7 @@ prev ${PACKAGE_ast_INCLUDE}/ast_standards.h implicit

+  done data/strdata.c

+  meta strdata.o %.c>%.o data/strdata.c strdata

+  prev data/strdata.c

+ -exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/strdata.c

+ +exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} -D_BLD_DEBUG?${CCFLAGS.FORCE}?} ${SHOPT_BASH+-DSHOPT_BASH=${SHOPT_BASH}} ${SH_CMDLIB_DIR+-DSH_CMDLIB_DIR=${SH_CMDLIB_DIR}} ${SH_DICT+-DSH_DICT=${SH_DICT}} ${SHOPT_P_SUID+-DSHOPT_P_SUID=${SHOPT_P_SUID}} ${SHOPT_REGRESS+-DSHOPT_REGRESS=${SHOPT_REGRESS}} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/strdata.c

+  done strdata.o generated

+  make testops.o

+  make data/testops.c

@@ -0,0 +1,14 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix	2013-02-01 16:04:55.507150242 +0100

+ +++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c	2013-02-01 16:06:39.361007641 +0100

+ @@ -214,7 +214,10 @@ int	b_cd(int argc, char *argv[],Shbltin_

+  			if(*++dp=='.' && (*++dp=='/' || *dp==0))

+  				n++;

+  			else if(*dp && *dp!='/')

+ +			{

+ +				dp--;

+  				break;

+ +			}

+  			if(*dp==0)

+  				break;

+  		}

@@ -0,0 +1,25 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix2 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix2	2013-02-01 16:46:50.441771371 +0100

+ +++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c	2013-02-01 16:57:43.241784024 +0100

+ @@ -61,6 +61,7 @@ int sh_diropenat(Shell_t *shp, int dir,

+  {

+  	int fd,shfd;

+  	int savederrno=errno;

+ +	struct stat fs;

+  #ifndef AT_FDCWD

+  	NOT_USED(dir);

+  #endif

+ @@ -133,6 +134,13 @@ int sh_diropenat(Shell_t *shp, int dir,

+  

+  	if(fd < 0)

+  		return fd;

+ +	

+ +	if (!fstat(fd, &fs) && !S_ISDIR(fs.st_mode))

+ +	{

+ +	  close(fd);

+ +	  errno = ENOTDIR;

+ +	  return -1;

+ +	}

+  

+  	/* Move fd to a number > 10 and *register* the fd number with the shell */

+  	shfd = sh_fcntl(fd, F_dupfd_cloexec, 10);

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix3 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix3	2014-06-20 12:39:02.757407689 +0200

+ +++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c	2014-06-20 12:40:19.530998070 +0200

+ @@ -290,7 +290,7 @@ int	b_cd(int argc, char *argv[],Shbltin_

+  		if(newdirfd >=0)

+  		{

+  			/* chdir for directories on HSM/tapeworms may take minutes */

+ -			if(fchdir(newdirfd) >= 0)

+ +			if((rval=fchdir(newdirfd)) >= 0)

+  			{

+  				if(shp->pwdfd >= 0)

+  					sh_close(shp->pwdfd);

@@ -0,0 +1,40 @@ 

+ --- ksh-20120801/src/cmd/ksh93/sh/path.c	2014-09-01 15:08:06.738969962 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/path.c	2014-09-01 15:13:51.321459978 -0300

+ @@ -229,13 +229,12 @@ static pid_t path_xargs(Shell_t *shp,con

+  /*

+   * make sure PWD is set up correctly

+   * Return the present working directory

+ - * Invokes getcwd() if flag==0 and if necessary

+ + * Invokes getcwd() if necessary

+   * Sets the PWD variable to this value

+   */

+  char *path_pwd(Shell_t *shp,int flag)

+  {

+  	register char *cp;

+ -	register char *dfault = (char*)e_dot;

+  	register int count = 0;

+  	if(shp->pwd)

+  		return((char*)shp->pwd);

+ @@ -254,11 +253,6 @@ char *path_pwd(Shell_t *shp,int flag)

+  				cp = "/";

+  				break;

+  			case 3:

+ -				cp = (char*)e_crondir;

+ -				if(flag) /* skip next case when non-zero flag */

+ -					++count;

+ -				break;

+ -			case 4:

+  			{

+  				if(cp=getcwd(NIL(char*),0))

+  				{  

+ @@ -269,8 +263,8 @@ char *path_pwd(Shell_t *shp,int flag)

+  				}

+  				break;

+  			}

+ -			case 5:

+ +			case 4:

+ -				return(dfault);

+ +				return((char*)e_dot);

+  		}

+  		if(cp && *cp=='/' && test_inode(cp,e_dot))

+  			break;

@@ -0,0 +1,58 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.covsfix ksh-20120801/src/cmd/ksh93/sh/init.c

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c.covsfix	2013-07-22 17:41:34.674054068 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2013-07-22 17:42:50.761361921 +0200

+ @@ -1237,9 +1237,11 @@ static void put_mode(Namval_t* np, const

+  				mode = *(double*)val;

+  		}

+  		else

+ +		{

+  			mode = strperm(val, &last,0);

+ -		if(*last)

+ -			errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val);

+ +			if(*last)

+ +				errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val);

+ +		}

+  		nv_putv(np,(char*)&mode,NV_INTEGER,nfp);

+  	}

+  	else

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.covsfix ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.covsfix	2013-07-22 17:06:30.282927080 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2013-07-22 17:08:49.645721280 +0200

+ @@ -954,6 +954,7 @@ int	sh_pipe(register int pv[])

+  	socklen_t		slen;

+  	if ((pv[out] = socket (AF_INET, SOCK_STREAM, 0)) < 0)

+  		errormsg(SH_DICT,ERROR_system(1),e_pipe);

+ +	memset(&sin.sin_zero, 0, sizeof(sin.sin_zero));

+  	do

+  	{

+  		sin.sin_family = AF_INET;

+ diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.covsfix ksh-20120801/src/cmd/ksh93/sh/name.c

+ --- ksh-20120801/src/cmd/ksh93/sh/name.c.covsfix	2013-07-22 17:40:31.644635604 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/name.c	2013-07-22 17:41:15.828227073 +0200

+ @@ -3094,6 +3094,7 @@ void nv_newattr (register Namval_t *np,

+  			if(!mp)

+  				nv_putval (np, cp, NV_RDONLY);

+  			free(cp);

+ +			cp = NULL;

+  		}

+  	}

+  	while(ap && nv_nextsub(np));

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.covsfix ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.covsfix	2013-07-22 17:46:15.607533423 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2013-07-22 17:48:36.739290968 +0200

+ @@ -205,7 +205,14 @@ void sh_subfork(void)

+  		shp->comsub = 0;

+  		SH_SUBSHELLNOD->nvalue.s = 0;

+  		sp->subpid=0;

+ -		shp->st.trapcom[0] = (comsub==2?NULL:trap);

+ +		if (comsub==2)

+ +		{

+ +			shp->st.trapcom[0] = NULL;

+ +			if(trap)

+ +				free((void*)trap);

+ +		}

+ +		else

+ +			shp->st.trapcom[0] = (comsub==2?NULL:trap);

+  		shp->savesig = 0;

+  	}

+  }

@@ -0,0 +1,57 @@ 

+ diff --git a/src/cmd/ksh93/edit/edit.c b/src/cmd/ksh93/edit/edit.c

+ --- a/src/cmd/ksh93/edit/edit.c

+ +++ b/src/cmd/ksh93/edit/edit.c

+ @@ -46,6 +46,8 @@

+      extern char ed_errbuf[];

+      char e_version[] = "\n@(#)$Id: Editlib version 1993-12-28 r $\0\n";

+  #endif	/* KSHELL */

+ +

+ +#include <sys/ioctl.h>

+  #include	"io.h"

+  #include	"terminal.h"

+  #include	"history.h"

+ diff --git a/src/cmd/ksh93/include/defs.h b/src/cmd/ksh93/include/defs.h

+ --- a/src/cmd/ksh93/include/defs.h

+ +++ b/src/cmd/ksh93/include/defs.h

+ @@ -449,6 +449,8 @@ extern int 		sh_whence(char**,int);

+      extern Namval_t	*sh_fsearch(Shell_t*,const char *,int);

+  #endif /* SHOPT_NAMESPACE */

+  

+ +extern int sh_diropenat(Shell_t *, int, const char *, bool xattr);

+ +

+  #ifndef ERROR_dictionary

+  #   define ERROR_dictionary(s)	(s)

+  #endif

+ diff --git a/src/lib/libast/port/astwinsize.c b/src/lib/libast/port/astwinsize.c

+ --- a/src/lib/libast/port/astwinsize.c

+ +++ b/src/lib/libast/port/astwinsize.c

+ @@ -28,6 +28,7 @@

+  

+  #include <ast.h>

+  #include <ast_tty.h>

+ +#include <sys/ioctl.h>

+  

+  #if defined(__STDPP__directive) && defined(__STDPP__hide)

+  __STDPP__directive pragma pp:hide ioctl sleep

+ @@ -36,10 +37,6 @@ __STDPP__directive pragma pp:hide ioctl sleep

+  #define sleep		______sleep

+  #endif

+  

+ -#if _sys_ioctl

+ -#include <sys/ioctl.h>

+ -#endif

+ -

+  #if defined(TIOCGWINSZ)

+  #if _sys_stream && _sys_ptem

+  #include <sys/stream.h>

+ diff --git a/src/lib/libcmd/tail.c b/src/lib/libcmd/tail.c

+ --- a/src/lib/libcmd/tail.c

+ +++ b/src/lib/libcmd/tail.c

+ @@ -104,6 +104,7 @@ USAGE_LICENSE

+  #include <ls.h>

+  #include <tv.h>

+  #include <rev.h>

+ +#include <time.h>

+  

+  #define COUNT		(1<<0)

+  #define ERROR		(1<<1)

@@ -0,0 +1,64 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.crash ksh-20120801/src/cmd/ksh93/include/jobs.h

+ --- ksh-20120801/src/cmd/ksh93/include/jobs.h.crash	2014-07-22 11:48:57.205062905 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/jobs.h	2014-07-22 11:48:57.243062711 +0200

+ @@ -118,6 +118,7 @@ struct jobs

+  	char		jobcontrol;	/* turned on for real job control */

+  	char		waitsafe;	/* wait will not block */

+  	char		waitall;	/* wait for all jobs in pipe */

+ +	char		hack1_waitall;

+  	char		toclear;	/* job table needs clearing */

+  	unsigned char	*freejobs;	/* free jobs numbers */

+  #if SHOPT_COSHELL

+ diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.crash ksh-20120801/src/cmd/ksh93/sh/jobs.c

+ --- ksh-20120801/src/cmd/ksh93/sh/jobs.c.crash	2014-07-22 11:48:57.190062982 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/jobs.c	2014-07-22 11:48:57.243062711 +0200

+ @@ -1957,6 +1957,7 @@ again:

+  	{

+  		count = bp->count;

+  		jp = bp->list;

+ +		jpold = 0;

+  		goto again;

+  	}

+  	if(jp)

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.crash ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.crash	2014-07-22 11:48:57.234062758 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-07-22 11:54:04.164491483 +0200

+ @@ -492,6 +492,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  	struct sh_scoped savst;

+  	struct dolnod   *argsav=0;

+  	int argcnt;

+ +        int pipefail = 0;

+  	memset((char*)sp, 0, sizeof(*sp));

+  	sfsync(shp->outpool);

+  	sh_sigcheck(shp);

+ @@ -541,7 +542,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  	sp->comsub = shp->comsub;

+  	shp->subshare = comsub==2 ||  (comsub==1 && sh_isoption(SH_SUBSHARE));

+  	if(comsub)

+ +	{

+  		shp->comsub = comsub;

+ +		job.hack1_waitall=(comsub==1);

+ +	}

+  	sp->shpwdfd=-1;

+  	if(!comsub || !shp->subshare)

+  	{

+ @@ -648,6 +652,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		}

+  		else

+  		{

+ +			job.hack1_waitall=0;

+  			if(comsub!=1 && shp->spid)

+  			{

+  				job_wait(shp->spid);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.crash ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.crash	2014-07-22 11:48:57.228062787 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-07-22 11:48:57.245062700 +0200

+ @@ -2125,7 +2125,7 @@ int sh_exec(register const Shnode_t *t,

+  				memset(exitval,0,job.waitall*sizeof(int));

+  			}

+  			else

+ -				job.waitall |= !pipejob && sh_isstate(SH_MONITOR);

+ +				job.waitall |= job.hack1_waitall || !pipejob && sh_isstate(SH_MONITOR);

+  			job_lock();

+  			nlock++;

+  			do

@@ -0,0 +1,52 @@ 

+ diff --git a/src/cmd/ksh93/sh/arith.c b/src/cmd/ksh93/sh/arith.c

+ --- a/src/cmd/ksh93/sh/arith.c

+ +++ b/src/cmd/ksh93/sh/arith.c

+ @@ -513,21 +513,34 @@ Sfdouble_t sh_strnum(register const char *str, char** ptr, int mode)

+  	char base=(shp->inarith?0:10), *last;

+  	if(*str==0)

+  	{

+ -		if(ptr)

+ -			*ptr = (char*)str;

+ -		return(0);

+ -	}

+ -	errno = 0;

+ -	d = strtonll(str,&last,&base,-1);

+ -	if(*last || errno)

+ -	{

+ -		if(!last || *last!='.' || last[1]!='.')

+ -			d = strval(shp,str,&last,arith,mode);

+ -		if(!ptr && *last && mode>0)

+ -			errormsg(SH_DICT,ERROR_exit(1),e_lexbadchar,*last,str);

+ +		d = 0.0;

+ +		last = (char*)str;

+ +	} else {

+ +		errno = 0;

+ +		d = strtonll(str,&last,&base,-1);

+ +		if (*last && !shp->inarith && sh_isstate(SH_INIT)) {

+ +			// This call is to handle "base#value" literals if we're importing untrusted env vars.

+ +			errno = 0;

+ +			d = strtonll(str, &last, NULL, -1);

+ +		}

+ +

+ +		if(*last || errno)

+ +		{

+ +			if (sh_isstate(SH_INIT)) {

+ +				// Initializing means importing untrusted env vars. Since the string does not appear

+ +				// to be a recognized numeric literal give up. We can't safely call strval() since

+ +				// that allows arbitrary expressions which would create a security vulnerability.

+ +				d = 0.0;

+ +			} else {

+ +				if(!last || *last!='.' || last[1]!='.')

+ +					d = strval(shp,str,&last,arith,mode);

+ +				if(!ptr && *last && mode>0)

+ +					errormsg(SH_DICT,ERROR_exit(1),e_lexbadchar,*last,str);

+ +			}

+ +		} else if (!d && *str=='-') {

+ +			d = -0.0;

+ +		}

+  	}

+ -	else if (!d && *str=='-')

+ -		d = -0.0;

+  	if(ptr)

+  		*ptr = last;

+  	return(d);

@@ -0,0 +1,19 @@ 

+ diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c

+ index 1ba7347..ab745d4 100644

+ --- a/src/cmd/ksh93/sh/xec.c

+ +++ b/src/cmd/ksh93/sh/xec.c

+ @@ -640,7 +640,11 @@ int sh_eval(register Sfio_t *iop, int mode)

+  	if(lineno)

+  		shp->inlineno = lineno;

+  	if(io_save)

+ +	{

+  		sfclose(io_save);

+ +		io_save = 0;

+ +	}

+ +

+  	sh_freeup(shp);

+  	shp->st.staklist = saveslp;

+  	shp->fn_reset = 0;

+ -- 

+ 2.9.3

+ 

@@ -0,0 +1,11 @@ 

+ --- ksh-20120801/src/cmd/ksh93/sh/array.c	2014-12-11 16:39:34.253860675 -0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/array.c	2014-12-11 16:39:40.794857083 -0200

+ @@ -1003,7 +1003,7 @@ Namarr_t *nv_setarray(Namval_t *np, void

+  		ap->nelem = nelem;

+  		ap->fun = fun;

+  		nv_onattr(np,NV_ARRAY);

+ -		if(fp || value)

+ +		if(fp || (value && value != Empty))

+  		{

+  			nv_putsub(np, "0", ARRAY_ADD);

+  			if(value)

@@ -0,0 +1,72 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/macro.c

+ --- ksh-20120801/src/cmd/ksh93/sh/macro.c.fd2lost	2014-01-22 16:23:21.211658984 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2014-01-22 16:23:21.243658703 +0100

+ @@ -391,7 +391,7 @@ void sh_machere(Shell_t *shp,Sfio_t *inf

+  				break;

+  			    }

+  			    case S_PAR:

+ -				comsubst(mp,(Shnode_t*)0,1);

+ +				comsubst(mp,(Shnode_t*)0,3);

+  				break;

+  			    case S_EOF:

+  				if((c=fcfill()) > 0)

+ @@ -1165,7 +1165,7 @@ retry1:

+  	    case S_PAR:

+  		if(type)

+  			goto nosub;

+ -		comsubst(mp,(Shnode_t*)0,1);

+ +		comsubst(mp,(Shnode_t*)0,3);

+  		return(1);

+  	    case S_DIG:

+  		var = 0;

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.fd2lost	2014-01-22 16:23:21.222658887 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-01-22 16:23:21.243658703 +0100

+ @@ -122,7 +122,8 @@ void	sh_subtmpfile(Shell_t *shp)

+  		else if(errno!=EBADF)

+  			errormsg(SH_DICT,ERROR_system(1),e_toomany);

+  		/* popping a discipline forces a /tmp file create */

+ -		sfdisc(sfstdout,SF_POPDISC);

+ +		if(shp->comsub != 1)

+ +			sfdisc(sfstdout,SF_POPDISC);

+  		if((fd=sffileno(sfstdout))<0)

+  		{

+  			/* unable to create the /tmp file so use a pipe */

+ @@ -635,6 +636,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		}

+  		else

+  		{

+ +			if(comsub!=1 && shp->spid)

+ +			{

+ +				job_wait(shp->spid);

+ +				if(shp->pipepid==shp->spid)

+ +					shp->spid = 0;

+ +				shp->pipepid = 0;

+ +			}

+  			/* move tmp file to iop and restore sfstdout */

+  			iop = sfswap(sfstdout,NIL(Sfio_t*));

+  			if(!iop)

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.fd2lost	2014-01-22 16:23:21.237658756 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-01-22 16:38:36.374666019 +0100

+ @@ -1756,6 +1756,8 @@ int sh_exec(register const Shnode_t *t,

+  					nlock--;

+  					job_unlock();

+  				}

+ +				if(shp->subshell)

+ +					shp->spid = parent;

+  				if(type&FPCL)

+  					sh_close(shp->inpipe[0]);

+  				if(type&(FCOOP|FAMP))

+ @@ -1771,7 +1773,11 @@ int sh_exec(register const Shnode_t *t,

+  					if(shp->pipepid)

+  						shp->pipepid = parent;

+  					else

+ +					{

+  						job_wait(parent);

+ +						if(parent==shp->spid)

+ +							shp->spid = 0;

+ +					}

+  					if(shp->topfd > topfd)

+  						sh_iorestore(shp,topfd,0);

+  					if(usepipe && tsetio &&  subdup && unpipe)

@@ -0,0 +1,11 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.tryfix01 ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.tryfix01	2014-02-26 16:15:52.355391420 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2014-02-26 16:23:55.588148801 +0100

+ @@ -1326,6 +1326,7 @@ int	sh_redirect(Shell_t *shp,struct iono

+  				if(flag==SH_SHOWME)

+  					goto traceit;

+  				fd=sh_chkopen(fname);

+ +				fd=sh_iomovefd(fd);

+  			}

+  			else if(sh_isoption(SH_RESTRICTED))

+  				errormsg(SH_DICT,ERROR_exit(1),e_restricted,fname);

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/fault.c.forkbomb ksh-20120801/src/cmd/ksh93/sh/fault.c

+ --- ksh-20120801/src/cmd/ksh93/sh/fault.c.forkbomb	2013-04-30 16:20:40.237490109 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/fault.c	2013-04-30 16:21:49.961068778 +0200

+ @@ -519,7 +519,7 @@ void sh_exit(register int xno)

+  	if(pp && pp->mode>1)

+  		cursig = -1;

+  #ifdef SIGTSTP

+ -	if(shp->trapnote&SH_SIGTSTP)

+ +	if((shp->trapnote&SH_SIGTSTP) && job.jobcontrol)

+  	{

+  		/* ^Z detected by the shell */

+  		shp->trapnote = 0;

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.fununset ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.fununset	2014-06-16 14:21:09.293513844 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-06-16 14:21:09.309513760 +0200

+ @@ -3570,7 +3570,7 @@ static void sh_funct(Shell_t *shp,Namval

+  #endif

+  	nv_putval(SH_PATHNAMENOD,shp->st.filename,NV_NOFREE);

+  	shp->pipepid = pipepid;

+ -	np->nvalue.rp->running  -= 2;

+ +	if (np->nvalue.rp) np->nvalue.rp->running  -= 2;

+  }

+  

+  /*

@@ -0,0 +1,38 @@ 

+ diff --git a/src/lib/libast/features/stdio b/src/lib/libast/features/stdio

+ --- a/src/lib/libast/features/stdio

+ +++ b/src/lib/libast/features/stdio

+ @@ -6,6 +6,8 @@ cat{

+  	#define _FILE_DEFINED	1

+  	#define _FILE_defined	1

+  	#define _FILEDEFED	1

+ +	#define __FILE_defined  1

+ +	#define ____FILE_defined    1

+  

+  	#ifndef __FILE_TAG

+  	#define __FILE_TAG	_sfio_s

+ diff --git a/src/lib/libast/include/ast.h b/src/lib/libast/include/ast.h

+ index ebf82d7..f4bbe6d 100644

+ --- a/src/lib/libast/include/ast.h

+ +++ b/src/lib/libast/include/ast.h

+ @@ -59,9 +59,21 @@ struct _sfio_s;

+  #ifndef	__FILE_typedef

+  #define __FILE_typedef	1

+  #endif

+ +#ifndef	_FILE_DEFINED

+ +#define _FILE_DEFINED   1

+ +#endif

+ +#ifndef	_FILE_defined

+ +#define _FILE_defined   1

+ +#endif

+  #ifndef _FILEDEFED

+  #define _FILEDEFED	1

+  #endif

+ +#ifndef __FILE_defined

+ +#define __FILE_defined  1

+ +#endif

+ +#ifndef ____FILE_defined

+ +#define ____FILE_defined  1

+ +#endif

+  #endif

+  

+  /*

@@ -0,0 +1,32 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.heresub ksh-20120801/src/cmd/ksh93/sh/lex.c

+ --- ksh-20120801/src/cmd/ksh93/sh/lex.c.heresub	2014-05-21 16:48:42.635700984 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/lex.c	2014-05-21 16:48:42.678700772 +0200

+ @@ -1557,6 +1557,7 @@ static int comsub(register Lex_t *lp, in

+  {

+  	register int	n,c,count=1;

+  	register int	line=lp->sh->inlineno;

+ +	struct ionod	*inheredoc = lp->heredoc;

+  	char *first,*cp=fcseek(0),word[5];

+  	int off, messages=0, assignok=lp->assignok, csub;

+  	struct lexstate	save;

+ @@ -1683,7 +1684,7 @@ done:

+  	lp->lexd.dolparen--;

+  	lp->lex = save;

+  	lp->assignok = (endchar(lp)==RBRACT?assignok:0);

+ -	if(lp->heredoc)

+ +	if(lp->heredoc && !inheredoc)

+  		errormsg(SH_DICT,ERROR_exit(SYNBAD),e_lexsyntax5,lp->sh->inlineno,lp->heredoc->ioname);

+  	return(messages);

+  }

+ diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.heresub ksh-20120801/src/cmd/ksh93/sh/macro.c

+ --- ksh-20120801/src/cmd/ksh93/sh/macro.c.heresub	2014-05-21 16:48:42.650700910 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2014-05-21 16:48:42.678700772 +0200

+ @@ -2085,7 +2085,7 @@ static void comsubst(Mac_t *mp,register

+  			}

+  			sfputc(stkp,c);

+  		}

+ -		sfputc(stkp,' ');

+ +		sfputc(stkp,'\n');

+  		c = stktell(stkp);

+  		str=stkfreeze(stkp,1);

+  		/* disable verbose and don't save in history file */

@@ -0,0 +1,74 @@ 

+ diff --git a/src/cmd/ksh93/sh/fcin.c b/src/cmd/ksh93/sh/fcin.c

+ index ea6ea6b..08c1f2a 100644

+ --- a/src/cmd/ksh93/sh/fcin.c

+ +++ b/src/cmd/ksh93/sh/fcin.c

+ @@ -150,63 +150,19 @@ extern void fcrestore(Fcin_t *fp)

+  	_Fcin = *fp;

+  }

+  

+ -/* for testing purposes with small buffers */

+ -#if defined(IOBSIZE) && (IOBSIZE < 2*MB_LEN_MAX)

+ -#   undef MB_LEN_MAX

+ -#   define MB_LEN_MAX	(IOBSIZE/2)

+ -#endif

+ -

+ -struct Extra

+ -{

+ -	unsigned char	buff[2*MB_LEN_MAX];

+ -	unsigned char	*next;

+ -};

+ -

+  int _fcmbget(short *len)

+  {

+ -	static struct Extra	extra;

+ -	register int		i, c, n;

+ -	if(_Fcin.fcleft)

+ -	{

+ -		if((c = mbsize(extra.next)) < 0)

+ -			c = 1;

+ -		if((_Fcin.fcleft -= c) <=0)

+ -		{

+ -			_Fcin.fcptr = (unsigned char*)fcfirst() - _Fcin.fcleft; 

+ -			_Fcin.fcleft = 0;

+ -		}

+ -		*len = c;

+ -		if(c==1)

+ -			c = *extra.next++;

+ -		else if(c==0)

+ -			_Fcin.fcleft = 0;

+ -		else

+ -			c = mbchar(extra.next);

+ -		return(c);

+ -	}

+ -	switch(*len = mbsize(_Fcin.fcptr))

+ +	register int		c;

+ +	switch (*len = mbsize(_Fcin.fcptr))

+  	{

+ -	    case -1:

+ -		if(_Fcin._fcfile && (n=(_Fcin.fclast-_Fcin.fcptr)) < MB_LEN_MAX)

+ -		{

+ -			memcpy(extra.buff, _Fcin.fcptr, n);

+ -			_Fcin.fcptr = _Fcin.fclast;

+ -			for(i=n; i < MB_LEN_MAX+n; i++)

+ -			{

+ -				if((extra.buff[i] = fcgetc(c))==0)

+ -					break;

+ -			}

+ -			_Fcin.fcleft = n;

+ -			extra.next = extra.buff;

+ -			return(fcmbget(len));

+ -		}

+ +	case -1:

+  		*len = 1;

+  		/* fall through */

+ -	    case 0:

+ -	    case 1:

+ +	case 0:

+ +	case 1:

+  		c=fcget();

+  		break;

+ -	    default:

+ +	default:

+  		c = mbchar(_Fcin.fcptr);

+  	}

+  	return(c);

@@ -0,0 +1,11 @@ 

+ diff --git a/src/cmd/ksh93/sh/jobs.c b/src/cmd/ksh93/sh/jobs.c

+ --- a/src/cmd/ksh93/sh/jobs.c

+ +++ b/src/cmd/ksh93/sh/jobs.c

+ @@ -1579,6 +1579,7 @@ int	job_wait(register pid_t pid)

+  					if( pw->p_exit!=SIGTTIN && pw->p_exit!=SIGTTOU)

+  						break;

+  

+ +					tcsetpgrp(JOBTTY,pw->p_pgrp);

+  					killpg(pw->p_pgrp,SIGCONT);

+  				}

+  				else /* ignore stop when non-interactive */

@@ -0,0 +1,12 @@ 

+ diff --git a/src/cmd/ksh93/sh/parse.c b/src/cmd/ksh93/sh/parse.c

+ index d139389..5a02af7 100644

+ --- a/src/cmd/ksh93/sh/parse.c

+ +++ b/src/cmd/ksh93/sh/parse.c

+ @@ -2032,6 +2032,7 @@ unsigned long kiaentity(Lex_t *lexp,const char *name,int len,int type,int first,

+  		else

+  			sfputr(stkp,name,0);

+  	}

+ +	sfputc(stkp,'\0');

+  	np = nv_search(stakptr(offset),lexp->entity_tree,NV_ADD);

+  	stkseek(stkp,offset);

+  	np->nvalue.i = pkind;

@@ -0,0 +1,66 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.monintoron ksh-20120801/src/cmd/ksh93/sh/main.c

+ --- ksh-20120801/src/cmd/ksh93/sh/main.c.monintoron	2013-05-31 10:15:02.738828102 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/main.c	2013-05-31 10:15:36.057095262 +0200

+ @@ -406,10 +406,10 @@ static void	exfile(register Shell_t *shp

+  		{

+  			buff.mode = SH_JMPEXIT;

+  			sh_onoption(SH_TRACKALL);

+ -			sh_offoption(SH_MONITOR);

+  		}

+  		sh_offstate(SH_INTERACTIVE);

+ -		sh_offstate(SH_MONITOR);

+ +		if(sh_isoption(SH_MONITOR))

+ +			sh_onstate(SH_MONITOR);

+  		sh_offstate(SH_HISTORY);

+  		sh_offoption(SH_HISTORY);

+  	}

+ diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.orig ksh-20120801/src/cmd/ksh93/sh/jobs.c

+ --- ksh-20120801/src/cmd/ksh93/sh/jobs.c.orig	2013-05-31 10:12:28.358590452 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/jobs.c	2013-05-31 10:16:51.203697890 +0200

+ @@ -548,7 +548,7 @@ int job_reap(register int sig)

+  		{

+  			px = job_byjid((int)pw->p_job);

+  			for(; px && (px->p_flag&P_DONE); px=px->p_nxtproc);

+ -			if(!px)

+ +			if(!px && sh_isoption(SH_INTERACTIVE))

+  				tcsetpgrp(JOBTTY,job.mypid);

+  		}

+  #ifndef SHOPT_BGX

+ @@ -842,10 +842,11 @@ static void job_set(register struct proc

+  

+  static void job_reset(register struct process *pw)

+  {

+ +	Shell_t *shp = pw->p_shp;

+  	/* save the terminal state for current job */

+  #ifdef SIGTSTP

+  	job_fgrp(pw,tcgetpgrp(job.fd));

+ -	if(tcsetpgrp(job.fd,job.mypid) !=0)

+ +	if(sh_isoption(SH_INTERACTIVE) && tcsetpgrp(job.fd,job.mypid) !=0)

+  		return;

+  #endif	/* SIGTSTP */

+  	/* force the following tty_get() to do a tcgetattr() unless fg */

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig	2013-05-31 10:12:27.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2013-05-31 10:18:14.650367185 +0200

+ @@ -2201,7 +2201,7 @@ int sh_exec(register const Shnode_t *t,

+  			}

+  			shp->exitval = n;

+  #ifdef SIGTSTP

+ -			if(!pipejob && sh_isstate(SH_MONITOR))

+ +			if(!pipejob && sh_isstate(SH_MONITOR) && sh_isoption(SH_INTERACTIVE))

+  				tcsetpgrp(JOBTTY,shp->gd->pid);

+  #endif /*SIGTSTP */

+  			job.curpgid = savepgid;

+ diff -up ksh-20120801/src/cmd/ksh93/edit/edit.c.kshmfix ksh-20120801/src/cmd/ksh93/edit/edit.c

+ --- ksh-20120801/src/cmd/ksh93/edit/edit.c.kshmfix      2013-09-23 10:46:57.007256192 +0200

+ +++ ksh-20120801/src/cmd/ksh93/edit/edit.c      2013-09-23 10:47:43.988937610 +0200

+ @@ -1050,7 +1050,7 @@ int ed_getchar(register Edit_t *ep,int m

+  		{

+  			if(mode<=0 && -c == ep->e_intr)

+  			{

+ -				sh_fault(SIGINT);

+ +				killpg(getpgrp(),SIGINT);

+  				siglongjmp(ep->e_env, UINTR);

+  			}

+  			if(mode<=0 && ep->sh->st.trap[SH_KEYTRAP])

+ 

@@ -0,0 +1,56 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/edit/edit.c.trajfiks ksh-20120801/src/cmd/ksh93/edit/edit.c

+ --- ksh-20120801/src/cmd/ksh93/edit/edit.c.trajfiks	2012-08-02 00:18:19.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/edit/edit.c	2014-02-06 12:12:11.570942651 +0100

+ @@ -53,6 +53,7 @@

+  

+  static char CURSOR_UP[20] = { ESC, '[', 'A', 0 };

+  static char KILL_LINE[20] = { ESC, '[', 'J', 0 };

+ +static char *savelex;

+  

+  

+  

+ @@ -232,6 +233,8 @@ int tty_set(int fd, int action, struct t

+  void tty_cooked(register int fd)

+  {

+  	register Edit_t *ep = (Edit_t*)(shgd->ed_context);

+ +	if(ep->sh->st.trap[SH_KEYTRAP] && savelex)

+ +		memcpy(ep->sh->lex_context,savelex,ep->sh->lexsize);

+  	ep->e_keytrap = 0;

+  	if(ep->e_raw==0)

+  		return;

+ @@ -783,6 +786,13 @@ void	ed_setup(register Edit_t *ep, int f

+  			ep->e_lbuf[n] = *pp++;

+  		ep->e_default = 0;

+  	}

+ +	if(ep->sh->st.trap[SH_KEYTRAP])

+ +	{

+ +		if(!savelex)

+ +			savelex = (char*)malloc(shp->lexsize);

+ +		if(savelex)

+ +			memcpy(savelex, ep->sh->lex_context, ep->sh->lexsize);

+ +	}

+  }

+  

+  static void ed_putstring(register Edit_t *ep, const char *str)

+ diff -up ksh-20120801/src/cmd/ksh93/include/defs.h.trajfiks ksh-20120801/src/cmd/ksh93/include/defs.h

+ --- ksh-20120801/src/cmd/ksh93/include/defs.h.trajfiks	2014-02-06 12:18:13.149091836 +0100

+ +++ ksh-20120801/src/cmd/ksh93/include/defs.h	2014-02-06 12:18:13.175091784 +0100

+ @@ -224,6 +224,7 @@ struct shared

+  	int		xargexit; \

+  	int		nenv; \

+  	mode_t		mask; \

+ +	int             lexsize; \

+  	Env_t		*env; \

+  	void		*init_context; \

+  	void		*mac_context; \

+ diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.trajfiks ksh-20120801/src/cmd/ksh93/sh/lex.c

+ --- ksh-20120801/src/cmd/ksh93/sh/lex.c.trajfiks	2014-02-06 12:19:13.587950320 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/lex.c	2014-02-06 12:19:13.623950219 +0100

+ @@ -268,6 +268,7 @@ Lex_t *sh_lexopen(Lex_t *lp, Shell_t *sp

+  	{

+  		lp = (Lex_t*)newof(0,Lex_t,1,0);

+  		lp->sh = sp;

+ +		sp->lexsize = sizeof(Lex_t);

+  	}

+  	fcnotify(lex_advance,lp);

+  	lp->lex.intest = lp->lex.incase = lp->lex.skipword = lp->lexd.warn = 0;

@@ -0,0 +1,26 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.locking ksh-20120801/src/cmd/ksh93/include/jobs.h

+ --- ksh-20120801/src/cmd/ksh93/include/jobs.h.locking	2014-06-27 15:51:07.144923719 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/jobs.h	2014-06-27 15:52:56.463272276 +0200

+ @@ -149,15 +149,18 @@ extern struct jobs job;

+  #define vmbusy()	0

+  #endif

+  

+ -#define job_lock()	(job.in_critical++)

+ +#define asoincint(p)  __sync_fetch_and_add(p,1)

+ +#define asodecint(p)  __sync_fetch_and_sub(p,1)

+ +

+ +#define job_lock()	asoincint(&job.in_critical)

+  #define job_unlock()	\

+  	do { \

+  		int	sig; \

+ -		if (!--job.in_critical && (sig = job.savesig)) \

+ +		if (asodecint(&job.in_critical)==1 && (sig = job.savesig)) \

+  		{ \

+ -			if (!job.in_critical++ && !vmbusy()) \

+ +			if (!asoincint(&job.in_critical) && !vmbusy()) \

+  				job_reap(sig); \

+ -			job.in_critical--; \

+ +			asodecint(&job.in_critical); \

+  		} \

+  	} while(0)

+  

@@ -0,0 +1,178 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/io.h.macro ksh-20120801/src/cmd/ksh93/include/io.h

+ --- ksh-20120801/src/cmd/ksh93/include/io.h.macro	2012-07-18 16:12:38.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/io.h	2013-07-04 16:14:05.809595966 +0200

+ @@ -81,6 +81,7 @@ extern void 	sh_iosave(Shell_t *, int,in

+  extern int 	sh_iovalidfd(Shell_t*, int);

+  extern int 	sh_inuse(Shell_t*, int);

+  extern void 	sh_iounsave(Shell_t*);

+ +extern void	iounpipe(Shell_t*);

+  extern int	sh_chkopen(const char*);

+  extern int	sh_ioaccess(int,int);

+  extern int	sh_devtofd(const char*);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.macro ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.macro	2013-07-04 16:14:05.783595751 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2013-07-04 16:15:46.673432991 +0200

+ @@ -171,7 +171,7 @@ void sh_subfork(void)

+  {

+  	register struct subshell *sp = subshell_data;

+  	Shell_t	*shp = sp->shp;

+ -	int	curenv = shp->curenv;

+ +	int	curenv = shp->curenv, comsub=shp->comsub;

+  	pid_t pid;

+  	char *trap = shp->st.trapcom[0];

+  	if(trap)

+ @@ -204,7 +204,7 @@ void sh_subfork(void)

+  		shp->comsub = 0;

+  		SH_SUBSHELLNOD->nvalue.s = 0;

+  		sp->subpid=0;

+ -		shp->st.trapcom[0] = trap;

+ +		shp->st.trapcom[0] = (comsub==2?NULL:trap);

+  		shp->savesig = 0;

+  	}

+  }

+ @@ -743,7 +743,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		fchdir(shp->pwdfd);

+  	}

+  	shp->subshare = sp->subshare;

+ -	shp->comsub = sp->comsub;

+  	shp->subdup = sp->subdup;

+  #if SHOPT_COSHELL

+  	shp->coshell = sp->coshell;

+ @@ -773,7 +772,12 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  	if(nsig>0)

+  		kill(getpid(),nsig);

+  	if(sp->subpid)

+ +	{

+  		job_wait(sp->subpid);

+ +		if(comsub>1)

+ +			iounpipe(shp);

+ +	}

+ +	shp->comsub = sp->comsub;

+  	if(comsub && iop && sp->pipefd<0)

+  		sfseek(iop,(off_t)0,SEEK_SET);

+  	if(shp->trapnote)

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.macro ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.macro	2013-07-04 16:14:05.800595891 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2013-07-04 16:14:05.810595975 +0200

+ @@ -102,11 +102,11 @@ struct funenv

+   * temp file.

+   */

+  static int      subpipe[3],subdup,tsetio,usepipe;

+ -static void iounpipe(Shell_t*);

+ +void iounpipe(Shell_t*);

+  

+ -static int iousepipe(Shell_t *shp)

+ +int iousepipe(Shell_t *shp)

+  {

+ -	int i;

+ +	int fd=sffileno(sfstdout),i,err=errno;

+  	if(usepipe)

+  	{

+  		usepipe++;

+ @@ -115,13 +115,18 @@ static int iousepipe(Shell_t *shp)

+  	if(sh_rpipe(subpipe) < 0)

+  		return(0);

+  	usepipe++;

+ -	fcntl(subpipe[0],F_SETFD,FD_CLOEXEC);

+ -	subpipe[2] = sh_fcntl(1,F_DUPFD,10);

+ -	fcntl(subpipe[2],F_SETFD,FD_CLOEXEC);

+ +	if(shp->comsub!=1)

+ +	{

+ +		subpipe[2] = sh_fcntl(subpipe[1],F_DUPFD,10);

+ +		sh_close(subpipe[1]);

+ +		return(1);

+ +	}

+ +	subpipe[2] = sh_fcntl(fd,F_dupfd_cloexec,10);

+  	shp->fdstatus[subpipe[2]] = shp->fdstatus[1];

+ -	close(1);

+ -	fcntl(subpipe[1],F_DUPFD,1);

+ -	shp->fdstatus[1] = shp->fdstatus[subpipe[1]];

+ +	while(close(fd)<0 && errno==EINTR)

+ +		errno = err;

+ +	fcntl(subpipe[1],F_DUPFD,fd);

+ +	shp->fdstatus[1] = shp->fdstatus[subpipe[1]]&~IOCLEX;

+  	sh_close(subpipe[1]);

+  	if(subdup=shp->subdup) for(i=0; i < 10; i++)

+  	{

+ @@ -135,14 +140,23 @@ static int iousepipe(Shell_t *shp)

+  	return(1);

+  }

+  

+ -static void iounpipe(Shell_t *shp)

+ +void iounpipe(Shell_t *shp)

+  {

+ -	int n;

+ +	int fd=sffileno(sfstdout),n,err=errno;

+  	char buff[SF_BUFSIZE];

+ -	close(1);

+ -	fcntl(subpipe[2], F_DUPFD, 1);

+ -	shp->fdstatus[1] = shp->fdstatus[subpipe[2]];

+ +	if(!usepipe)

+ +		return;

+  	--usepipe;

+ +	if(shp->comsub>1)

+ +	{

+ +		sh_close(subpipe[2]);

+ +		while(read(subpipe[0],buff,sizeof(buff))>0);

+ +		goto done;

+ +	}

+ +	while(close(fd)<0 && errno==EINTR)

+ +		errno = err;

+ +	fcntl(subpipe[2], F_DUPFD, fd);

+ +	shp->fdstatus[1] = shp->fdstatus[subpipe[2]];

+  	if(subdup) for(n=0; n < 10; n++)

+  	{

+  		if(subdup&(1<<n))

+ @@ -174,6 +188,7 @@ static void iounpipe(Shell_t *shp)

+  		else if(errno!=EINTR)

+  			break;

+  	}

+ +done:

+  	sh_close(subpipe[0]);

+  	subpipe[0] = -1;

+  	tsetio = 0;

+ @@ -725,7 +740,7 @@ static void unset_instance(Namval_t *nq,

+  }

+  

+  #if SHOPT_COSHELL

+ -uintmax_t	coused;

+ +static uintmax_t	coused;

+  /*

+   * print out function definition

+   */

+ @@ -1619,10 +1634,14 @@ int sh_exec(register const Shnode_t *t,

+  			if(shp->subshell)

+  			{

+  				sh_subtmpfile(shp);

+ -				if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK))

+ -					unpipe=iousepipe(shp);

+  				if((type&(FAMP|TFORK))==(FAMP|TFORK))

+ -					sh_subfork();

+ +				{

+ +					if(shp->comsub && !(shp->fdstatus[1]&IONOSEEK))

+ +					{

+ +						unpipe = iousepipe(shp);

+ +						sh_subfork();

+ +					}

+ +				}

+  			}

+  			no_fork = !ntflag && !(type&(FAMP|FPOU)) && !shp->subshell &&

+  			    !(shp->st.trapcom[SIGINT] && *shp->st.trapcom[SIGINT]) &&

+ @@ -3495,8 +3514,7 @@ static void sh_funct(Shell_t *shp,Namval

+  	struct funenv fun;

+  	char *fname = nv_getval(SH_FUNNAMENOD);

+  	struct Level	*lp =(struct Level*)(SH_LEVELNOD->nvfun);

+ -	int		level, pipepid=shp->pipepid, comsub=shp->comsub;

+ -	shp->comsub = 0;

+ +	int		level, pipepid=shp->pipepid;

+  	shp->pipepid = 0;

+  	sh_stats(STAT_FUNCT);

+  	if(!lp->hdr.disc)

+ @@ -3539,7 +3557,6 @@ static void sh_funct(Shell_t *shp,Namval

+  	lp->maxlevel = level;

+  	SH_LEVELNOD->nvalue.s = lp->maxlevel;

+  	shp->last_root = nv_dict(DOTSHNOD);

+ -	shp->comsub = comsub;

+  #if 0

+  	nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE);

+  #else

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh.1.manfix4 ksh-20120801/src/cmd/ksh93/sh.1

+ --- ksh-20120801/src/cmd/ksh93/sh.1.manfix4	2014-05-22 12:04:51.593750721 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh.1	2014-05-22 12:05:32.561556452 +0200

+ @@ -4147,7 +4147,7 @@ command are ignored if the command is fo

+  .B &

+  and the

+  .B monitor

+ -option is not active.

+ +option is active.

+  Otherwise, signals have the values

+  inherited by the shell from its parent

+  (but see also

@@ -0,0 +1,15 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.orig ksh-20120801/src/cmd/ksh93/sh/macro.c

+ --- ksh-20120801/src/cmd/ksh93/sh/macro.c.orig	2015-08-24 14:29:58.602967855 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2015-08-24 14:31:13.682850008 -0300

+ @@ -1479,7 +1479,10 @@ retry1:

+  	    default:

+  		goto nosub;

+  	}

+ -	c = fcmbget(&LEN);

+ +	if(type)

+ +		c = fcmbget(&LEN);

+ +	else

+ +		c = fcget();

+  	if(type>M_TREE)

+  	{

+  		if(c!=RBRACE)

@@ -0,0 +1,37 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/array.c.memlik ksh-20120801/src/cmd/ksh93/sh/array.c

+ --- ksh-20120801/src/cmd/ksh93/sh/array.c.memlik	2012-06-07 00:00:42.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/array.c	2013-06-11 16:52:47.557123973 +0200

+ @@ -1701,7 +1701,11 @@ void *nv_associative(register Namval_t *

+  			ap->header.scope = 0;

+  		}

+  		else

+ -			dtclose(ap->header.table);

+ + 		{

+ + 			if((ap->header.nelem&ARRAY_MASK)==0 && (ap->cur=nv_search("0",ap->header.table,0)))

+ + 				nv_associative(np,(char*)0,NV_ADELETE);

+ + 			dtclose(ap->header.table);

+ + 		}

+  		return((void*)ap);

+  	    case NV_ANEXT:

+  		if(!ap->pos)

+ diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.memlik ksh-20120801/src/cmd/ksh93/sh/name.c

+ --- ksh-20120801/src/cmd/ksh93/sh/name.c.memlik	2012-07-23 18:21:57.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/name.c	2013-06-11 16:19:41.036648218 +0200

+ @@ -2465,6 +2465,8 @@ static void table_unset(Shell_t *shp, re

+  			}

+  		}

+  		npnext = (Namval_t*)dtnext(root,np);

+ +               if(nv_arrayptr(np))

+ +                       nv_putsub(np,NIL(char*),ARRAY_SCAN);

+  		_nv_unset(np,flags);

+  		nv_delete(np,root,0);

+  	}

+ @@ -3326,7 +3328,7 @@ int nv_rename(register Namval_t *np, int

+  	shp->last_root = last_root;

+  	if(flags&NV_MOVE)

+  	{

+ -		if(arraynp && !nv_isattr(np,NV_MINIMAL) && (mp=(Namval_t*)np->nvenv) && (ap=nv_arrayptr(mp)))

+ +		if(arraynp && !nv_isattr(np,NV_MINIMAL) && (mp=(Namval_t*)np->nvenv) && (ap=nv_arrayptr(mp)) && !ap->fun)

+  			ap->nelem++;

+  	}

+  	if((nv_arrayptr(nr) && !arraynr) || nv_isvtree(nr))

@@ -0,0 +1,76 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/name.h.memlik3 ksh-20120801/src/cmd/ksh93/include/name.h

+ --- ksh-20120801/src/cmd/ksh93/include/name.h.memlik3	2012-05-10 18:33:41.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/name.h	2014-01-22 14:14:32.774483776 +0100

+ @@ -215,7 +215,7 @@ extern Namval_t		*nv_mount(Namval_t*, co

+  extern Namval_t		*nv_arraychild(Namval_t*, Namval_t*, int);

+  extern int		nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);

+  extern void		nv_outnode(Namval_t*,Sfio_t*, int, int);

+ -extern int		nv_subsaved(Namval_t*);

+ +extern int		nv_subsaved(Namval_t*,int);

+  extern void		nv_typename(Namval_t*, Sfio_t*);

+  extern void		nv_newtype(Namval_t*);

+  extern int		nv_istable(Namval_t*);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.memlik3 ksh-20120801/src/cmd/ksh93/sh/name.c

+ --- ksh-20120801/src/cmd/ksh93/sh/name.c.memlik3	2014-01-22 14:14:32.751483987 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/name.c	2014-01-22 14:14:32.775483767 +0100

+ @@ -1297,7 +1297,7 @@ void nv_delete(Namval_t* np, Dt_t *root,

+  	{

+  		if(dtdelete(root,np))

+  		{

+ -			if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np)))

+ +			if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np,flags&NV_TABLE)))

+  				free((void*)np);

+  		}

+  #if 0

+ @@ -2461,14 +2461,14 @@ static void table_unset(Shell_t *shp, re

+  			{

+  				_nv_unset(nq,flags);

+  				npnext = (Namval_t*)dtnext(root,nq);

+ -				nv_delete(nq,root,0);

+ +				nv_delete(nq,root,NV_TABLE);

+  			}

+  		}

+  		npnext = (Namval_t*)dtnext(root,np);

+                 if(nv_arrayptr(np))

+                         nv_putsub(np,NIL(char*),ARRAY_SCAN);

+  		_nv_unset(np,flags);

+ -		nv_delete(np,root,0);

+ +		nv_delete(np,root,NV_TABLE);

+  	}

+  }

+  

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.memlik3 ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.memlik3	2014-01-22 14:14:32.768483831 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-01-22 14:20:50.810236676 +0100

+ @@ -218,16 +218,28 @@ void sh_subfork(void)

+  	}

+  }

+  

+ -int nv_subsaved(register Namval_t *np)

+ +int nv_subsaved(register Namval_t *np,int table)

+  {

+  	register struct subshell	*sp;

+ -	register struct Link		*lp;

+ +	register struct Link		*lp, *lpprev;

+  	for(sp = (struct subshell*)subshell_data; sp; sp=sp->prev)

+  	{

+ -		for(lp=sp->svar; lp; lp = lp->next)

+ +		lpprev = 0;

+ +		for(lp=sp->svar; lp; lpprev=lp, lp=lp->next)

+  		{

+  			if(lp->node==np)

+ +			{

+ +				if(table&NV_TABLE)

+ +				{

+ +					if(lpprev)

+ +						lpprev->next = lp->next;

+ +					else

+ +						sp->svar = lp->next;

+ +					free((void*)np);

+ +					free((void*)lp);

+ +				}

+  				return(1);

+ +			}

+  		}

+  	}

+  	return(0);

@@ -0,0 +1,34 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/lex.c.mlikfiks ksh-20120801/src/cmd/ksh93/sh/lex.c

+ --- ksh-20120801/src/cmd/ksh93/sh/lex.c.mlikfiks	2013-07-22 12:45:30.923170264 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/lex.c	2013-07-22 12:46:25.235556905 +0200

+ @@ -2465,7 +2465,7 @@ static int alias_exceptf(Sfio_t *iop,int

+  			if(dp!=handle)

+  				sfdisc(iop,dp);

+  		}

+ -		else if(type==SF_FINAL)

+ +		else if(type==SF_DPOP || type==SF_FINAL)

+  			free((void*)ap);

+  		goto done;

+  	}

+ diff -up ksh-20120801/src/cmd/ksh93/sh/path.c.mlikfiks ksh-20120801/src/cmd/ksh93/sh/path.c

+ --- ksh-20120801/src/cmd/ksh93/sh/path.c.mlikfiks	2013-07-22 12:47:23.149990016 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/path.c	2013-07-22 12:48:33.363283877 +0200

+ @@ -613,6 +613,7 @@ static void funload(Shell_t *shp,int fno

+  		}

+  		while((rp=dtnext(shp->fpathdict,rp)) && strcmp(pname,rp->fname)==0);

+  		sh_close(fno);

+ +		free((void*)pname);

+  		return;

+  	}

+  	sh_onstate(SH_NOLOG);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.aliasfix ksh-20120801/src/cmd/ksh93/sh/macro.c

+ --- ksh-20120801/src/cmd/ksh93/sh/macro.c.aliasfix	2013-07-29 15:03:45.841680475 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2013-07-29 15:04:23.871336821 +0200

+ @@ -2085,6 +2085,7 @@ static void comsubst(Mac_t *mp,register

+  			}

+  			sfputc(stkp,c);

+  		}

+ +		sfputc(stkp,' ');

+  		c = stktell(stkp);

+  		str=stkfreeze(stkp,1);

+  		/* disable verbose and don't save in history file */

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.mtty ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.mtty	2014-01-22 16:52:06.441608750 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-01-22 16:52:06.485608361 +0100

+ @@ -3163,7 +3169,7 @@ pid_t _sh_fork(Shell_t *shp,register pid

+  			 * completed.  Make parent the job group id.

+  			 */

+  			if(postid==0)

+ -				job.curpgid = parent;

+ +				job.curpgid = job.jobcontrol?parent:getpid();

+  			if(job.jobcontrol || (flags&FAMP))

+  			{

+  				if(setpgid(parent,job.curpgid)<0 && errno==EPERM)

@@ -0,0 +1,40 @@ 

+ From b8260293a8ed7849a358291faae7b58f4a05dcc9 Mon Sep 17 00:00:00 2001

+ From: Kamil Dudka <kdudka@redhat.com>

+ Date: Mon, 10 Nov 2014 18:23:34 +0100

+ Subject: [PATCH] Resolves: #1160923 - handle failure of fchdir()

+ 

+ ... and chdir()

+ ---

+  src/cmd/ksh93/bltins/cd_pwd.c | 6 ++++--

+  1 file changed, 4 insertions(+), 2 deletions(-)

+ 

+ diff --git a/src/cmd/ksh93/bltins/cd_pwd.c b/src/cmd/ksh93/bltins/cd_pwd.c

+ index a972da6..c20959c 100644

+ --- a/src/cmd/ksh93/bltins/cd_pwd.c

+ +++ b/src/cmd/ksh93/bltins/cd_pwd.c

+ @@ -329,18 +329,20 @@ int	b_cd(int argc, char *argv[],Shbltin_t *context)

+  		if(newdirfd >=0)

+  		{

+  			/* chdir for directories on HSM/tapeworms may take minutes */

+ -			if(fchdir(newdirfd) >= 0)

+ +			if((rval=fchdir(newdirfd)) >= 0)

+  			{

+  				if(shp->pwdfd >= 0)

+  					sh_close(shp->pwdfd);

+  				shp->pwdfd=newdirfd;

+  				goto success;

+  			}

+ +			else

+ +				sh_close(newdirfd);

+  		}

+  #ifndef O_SEARCH

+  		else

+  		{

+ -			if(chdir(dir) >=0)

+ +			if((rval=chdir(dir)) >=0)

+  			{

+  				if(shp->pwdfd >= 0)

+  				{

+ -- 

+ 2.1.0

+ 

@@ -0,0 +1,11 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.nohupfork ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.nohupfork	2015-08-27 14:25:38.925378019 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2015-08-27 14:30:42.267058087 +0200

+ @@ -2067,6 +2067,7 @@ int sh_exec(register const Shnode_t *t,

+  				{

+  					sh_exec(t->par.partre,flags);

+  					shp->st.trapcom[0]=0;

+ +					sh_offoption(SH_INTERACTIVE);

+  					sh_done(shp,0);

+  				}

+  			}

@@ -0,0 +1,11 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.nomulti ksh-20120801/src/cmd/ksh93/sh/init.c

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c.nomulti	2013-10-08 20:46:46.202471042 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2013-10-08 20:46:57.912331483 +0200

+ @@ -1446,7 +1446,6 @@ Shell_t *sh_init(register int argc,regis

+  #endif /* SHOPT_TIMEOUT */

+  	/* initialize jobs table */

+  	job_clear();

+ -	sh_onoption(SH_MULTILINE);

+  	if(argc>0)

+  	{

+  		/* check for restricted shell */

@@ -0,0 +1,12 @@ 

+ diff --git a/src/cmd/ksh93/sh/name.c b/src/cmd/ksh93/sh/name.c

+ --- a/src/cmd/ksh93/sh/name.c

+ +++ b/src/cmd/ksh93/sh/name.c

+ @@ -1425,7 +1425,7 @@ Namval_t *nv_open(const char *name, Dt_t *root, int flags)

+  	{

+  		if(xp->root!=root)

+  			continue;

+ -		if(*name==*xp->name && xp->namespace==shp->namespace && (flags&(NV_ARRAY|NV_NOSCOPE))==xp->flags && memcmp(xp->name,name,xp->len)==0 && (name[xp->len]==0 || name[xp->len]=='=' || name[xp->len]=='+'))

+ +		if(*name==*xp->name && xp->namespace==shp->namespace && (flags&(NV_ARRAY|NV_NOSCOPE))==xp->flags && strncmp(xp->name,name,xp->len)==0 && (name[xp->len]==0 || name[xp->len]=='=' || name[xp->len]=='+'))

+  		{

+  			sh_stats(STAT_NVHITS);

+  			np = xp->np;

@@ -0,0 +1,95 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.fixset ksh-20120801/src/cmd/ksh93/sh/init.c

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c.fixset	2014-11-03 15:45:36.510997271 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-11-03 16:20:44.398917280 +0100

+ @@ -2003,8 +2003,91 @@ static Dt_t *inittree(Shell_t *shp,const

+   * skip over items that are not name-value pairs

+   */

+  

+ +

+  static void env_init(Shell_t *shp)

+  {

+ +	register char *cp;

+ +	register Namval_t	*np;

+ +	register char **ep=environ;

+ +	register char *next=0;

+ +#ifdef _ENV_H

+ +	shp->env = env_open(environ,3);

+ +	env_delete(shp->env,"_");

+ +#endif

+ +	if(ep)

+ +	{

+ +		while(cp= *ep++)

+ +		{

+ +			if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')

+ +				next = cp+4;

+ +			else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL))) 

+ +			{

+ +				nv_onattr(np,NV_IMPORT);

+ +				np->nvenv = cp;

+ +				nv_close(np);

+ +			}

+ +			else  /* swap with front */

+ +			{

+ +				ep[-1] = environ[shp->nenv];

+ +				environ[shp->nenv++] = cp;

+ +			}

+ +		}

+ +		while(cp=next)

+ +		{

+ +			if(next = strchr(++cp,'='))

+ +				*next = 0;

+ +			np = nv_search(cp+2,shp->var_tree,NV_ADD);

+ +			if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))

+ +			{

+ +				int flag = *(unsigned char*)cp-' ';

+ +				int size = *(unsigned char*)(cp+1)-' ';

+ +				if((flag&NV_INTEGER) && size==0)

+ +				{

+ +					/* check for floating*/

+ +					char *ep,*val = nv_getval(np);

+ +					strtol(val,&ep,10);

+ +					if(*ep=='.' || *ep=='e' || *ep=='E')

+ +					{

+ +						char *lp;

+ +						flag |= NV_DOUBLE;

+ +						if(*ep=='.')

+ +						{

+ +							strtol(ep+1,&lp,10);

+ +							if(*lp)

+ +								ep = lp;

+ +						}

+ +						if(*ep && *ep!='.')

+ +						{

+ +							flag |= NV_EXPNOTE;

+ +							size = ep-val;

+ +						}

+ +						else

+ +							size = strlen(ep);

+ +						size--;

+ +					}

+ +				}

+ +				nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);

+ +			}

+ +			else

+ +				cp += 2;

+ +		}

+ +	}

+ +#ifdef _ENV_H

+ +	env_delete(shp->env,e_envmarker);

+ +#endif

+ +	if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED))

+ +	{

+ +		nv_offattr(PWDNOD,NV_TAGGED);

+ +		path_pwd(shp,0);

+ +	}

+ +	if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))

+ +		sh_onoption(SH_RESTRICTED); /* restricted shell */

+ +	return;

+ +}

+ +

+ +

+ +static void env_init_backup(Shell_t *shp)

+ +{

+  	register char		*cp;

+  	register Namval_t	*np,*mp;

+  	register char		**ep=environ;

@@ -0,0 +1,26 @@ 

+ --- ksh_20120801/src/cmd/ksh93/sh/lex.c	2012-06-12 21:05:18.000000000 +0200

+ +++ ksh_20120801/src/cmd/ksh93/sh/lex.c	2015-08-18 17:42:06.138076565 +0200

+ @@ -1603,7 +1603,14 @@ static int comsub(register Lex_t *lp, in

+  				if(n==4)

+  					break;

+  				if(sh_lexstates[ST_NAME][c])

+ +				{

+ +					if(c==' ' || c=='\t')

+ +					{

+ +						n = 0;

+ +						continue;

+ +					}

+  					goto skip;

+ +				}

+  				word[n++] = c;

+  			}

+  			if(sh_lexstates[ST_NAME][c]==S_BREAK)

+ --- ksh_20120801/src/cmd/ksh93/tests/subshell.sh	2012-07-25 23:40:29.000000000 +0200

+ +++ ksh_20120801/src/cmd/ksh93/tests/subshell.sh	2015-08-18 17:42:06.143076553 +0200

+ @@ -617,4 +617,6 @@ do	if	[[ -e $f ]]

+  	fi

+  done

+  

+ +$SHELL > /dev/null -c 'echo $(for x in whatever; do case y in *) true;; esac; done)' || err_exit 'syntax error with case in command substitution'

+ +

+  exit $((Errors<125?Errors:125))

@@ -0,0 +1,24 @@ 

+ diff --git a/src/cmd/ksh93/sh/fault.c b/src/cmd/ksh93/sh/fault.c

+ --- a/src/cmd/ksh93/sh/fault.c

+ +++ b/src/cmd/ksh93/sh/fault.c

+ @@ -643,7 +643,7 @@ void sh_done(void *ptr, register int sig)

+  	sfsync((Sfio_t*)sfstdin);

+  	sfsync((Sfio_t*)shp->outpool);

+  	sfsync((Sfio_t*)sfstdout);

+ -	if(savxit&SH_EXITSIG)

+ +	if((savxit&SH_EXITMASK) == shp->lastsig)

+  		sig = savxit&SH_EXITMASK;

+  	if(sig)

+  	{

+ @@ -668,6 +668,12 @@ void sh_done(void *ptr, register int sig)

+  	if(sh_isoption(SH_NOEXEC))

+  		kiaclose((Lex_t*)shp->lex_context);

+  #endif /* SHOPT_KIA */

+ +

+ +	/* Return POSIX exit code if last process exits due to signal */

+ +	if (savxit & SH_EXITSIG) {

+ +		exit(128 + (savxit&SH_EXITMASK));

+ +	}

+ +

+  	exit(savxit&SH_EXITMASK);

+  }

@@ -0,0 +1,14 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix	2014-10-01 17:34:47.720532950 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-10-01 17:35:25.850350378 +0200

+ @@ -655,7 +655,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  			job.hack1_waitall=0;

+  			if(comsub!=1 && shp->spid)

+  			{

+ +				int c = shp->exitval;

+  				job_wait(shp->spid);

+ +				shp->exitval = c;

+ +				exitset();

+  				if(shp->pipepid==shp->spid)

+  					shp->spid = 0;

+  				shp->pipepid = 0;

@@ -0,0 +1,505 @@ 

+ diff -up ksh20120801/src/cmd/ksh93/sh/subshell.c.orig ksh20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh20120801/src/cmd/ksh93/sh/subshell.c.orig	2012-07-17 23:54:21.000000000 +0200

+ +++ ksh20120801/src/cmd/ksh93/sh/subshell.c	2012-10-24 15:03:44.436870792 +0200

+ @@ -40,14 +40,6 @@

+  #   define PIPE_BUF	512

+  #endif

+  

+ -#ifndef O_SEARCH

+ -#   ifdef O_PATH

+ -#	define O_SEARCH	O_PATH

+ -#   else

+ -#	define O_SEARCH	0

+ -#   endif

+ -#endif

+ -

+  /*

+   * Note that the following structure must be the same

+   * size as the Dtlink_t structure

+ @@ -84,7 +76,7 @@ static struct subshell

+  	char		*pwd;	/* present working directory */

+  	const char	*shpwd;	/* saved pointer to sh.pwd */

+  	void		*jobs;	/* save job info */

+ -	int		pwdfd;	/* file descritor for pwd */

+ +	int		shpwdfd;/* fd for present working directory */

+  	mode_t		mask;	/* saved umask */

+  	short		tmpfd;	/* saved tmp file descriptor */

+  	short		pipefd;	/* read fd if pipe is created */

+ @@ -101,7 +93,6 @@ static struct subshell

+  	int		subdup;

+  	char		subshare;

+  	char		comsub;

+ -	char		pwdclose;

+  #if SHOPT_COSHELL

+  	void		*coshell;

+  #endif /* SHOPT_COSHELL */

+ @@ -518,7 +509,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		shp->pathinit = 0;

+  	}

+  	sp->pathlist = path_dup((Pathcomp_t*)shp->pathlist);

+ -	sp->pwdfd = -1;

+  	if(!shp->pwd)

+  		path_pwd(shp,0);

+  	sp->bckpid = shp->bckpid;

+ @@ -531,39 +521,14 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  	shp->subshare = comsub==2 ||  (comsub==1 && sh_isoption(SH_SUBSHARE));

+  	if(comsub)

+  		shp->comsub = comsub;

+ +	sp->shpwdfd=-1;

+  	if(!comsub || !shp->subshare)

+  	{

+ -		struct subshell *xp;

+  		sp->shpwd = shp->pwd;

+ -#ifdef _lib_fchdir

+ -		for(xp=sp->prev; xp; xp=xp->prev) 

+ -		{

+ -			if(xp->pwdfd>0 && strcmp(xp->pwd,shp->pwd)==0)

+ -			{

+ -				sp->pwdfd = xp->pwdfd;

+ -				break;

+ -			}

+ -		}

+ -		if(sp->pwdfd<0)

+ -		{

+ -			int n = open(".",O_RDONLY);

+ -			if(O_SEARCH && errno==EACCES)

+ -				n =  open(".",O_RDONLY);

+ -			if(n>=0)

+ -			{

+ -				sp->pwdfd = n;

+ -				if(n<10)

+ -				{

+ -					sp->pwdfd = sh_fcntl(n,F_DUPFD,10);

+ -					close(n);

+ -				}

+ -				if(sp->pwdfd>0)

+ -				{

+ -					fcntl(sp->pwdfd,F_SETFD,FD_CLOEXEC);

+ -					sp->pwdclose = 1;

+ -				}

+ -			}

+ -		}

+ +		sp->shpwdfd=((shp->pwdfd >= 0))?sh_fcntl(shp->pwdfd, F_dupfd_cloexec, 10):-1;

+ +#ifdef O_SEARCH

+ +		if(sp->shpwdfd<0)

+ +			errormsg(SH_DICT,ERROR_system(1), "Can't obtain directory fd.");

+  #endif

+  		sp->pwd = (shp->pwd?strdup(shp->pwd):0);

+  		sp->mask = shp->mask;

+ @@ -741,14 +706,11 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  			Namval_t *pwdnod = sh_scoped(shp,PWDNOD);

+  			if(shp->pwd)

+  			{

+ -				if(sp->pwdfd >=0)

+ -				{

+ -					if(fchdir(sp->pwdfd)<0)

+ -						chdir(sp->pwd);

+ -				}

+ -				else

+ -					chdir(sp->pwd);

+  				shp->pwd=sp->pwd;

+ +#ifndef O_SEARCH

+ +				if (sp->shpwdfd < 0)

+ +					chdir(shp->pwd);

+ +#endif

+  				path_newdir(shp,shp->pathlist);

+  			}

+  			if(nv_isattr(pwdnod,NV_NOFREE))

+ @@ -762,8 +724,6 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		}

+  		else

+  			free((void*)sp->pwd);

+ -		if(sp->pwdclose)

+ -			close(sp->pwdfd);

+  		if(sp->mask!=shp->mask)

+  			umask(shp->mask=sp->mask);

+  		if(shp->coutpipe!=sp->coutpipe)

+ @@ -775,6 +735,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		shp->cpipe[1] = sp->cpipe;

+  		shp->coutpipe = sp->coutpipe;

+  	}

+ +	if(sp->shpwdfd >=0)

+ +	{

+ +		if(shp->pwdfd >=0)

+ +			sh_close(shp->pwdfd);

+ +		shp->pwdfd=sp->shpwdfd;

+ +		fchdir(shp->pwdfd);

+ +	}

+  	shp->subshare = sp->subshare;

+  	shp->comsub = sp->comsub;

+  	shp->subdup = sp->subdup;

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.orig ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.orig	2012-08-02 16:50:40.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c	2012-10-24 15:37:46.814469045 +0200

+ @@ -38,6 +38,10 @@

+  #include	"builtins.h"

+  #include	<ls.h>

+  

+ +#ifndef EINTR_REPEAT

+ +#   define EINTR_REPEAT(expr) while((expr) && (errno == EINTR)) errno=0;

+ +#endif

+ +

+  /*

+   * Invalidate path name bindings to relative paths

+   */

+ @@ -49,6 +53,95 @@ static void rehash(register Namval_t *np

+  		_nv_unset(np,0);

+  }

+  

+ +/*

+ + * Obtain a file handle to the directory "path" relative to directory

+ + * "dir", or open a NFSv4 xattr directory handle for file dir/path.

+ + */

+ +int sh_diropenat(Shell_t *shp, int dir, const char *path, bool xattr)

+ +{

+ +	int fd,shfd;

+ +	int savederrno=errno;

+ +#ifndef AT_FDCWD

+ +	NOT_USED(dir);

+ +#endif

+ +#ifndef O_XATTR

+ +	NOT_USED(xattr);

+ +#endif

+ +

+ +#ifdef O_XATTR

+ +	if(xattr)

+ +	{

+ +		int apfd; /* attribute parent fd */

+ +		/* open parent node... */

+ +		EINTR_REPEAT((apfd = openat(dir, path, O_RDONLY|O_NONBLOCK|O_cloexec)) < 0);

+ +		if(apfd < 0)

+ +			return -1;

+ +

+ +		/* ... and then open a fd to the attribute directory */

+ +		 EINTR_REPEAT((fd = openat(apfd, e_dot, O_XATTR|O_cloexec)) < 0);

+ +

+ +		savederrno = errno;

+ +		EINTR_REPEAT(close(apfd) < 0);

+ +		errno = savederrno;

+ +	}

+ +	else

+ +#endif

+ +	{

+ +#ifdef AT_FDCWD

+ +		/*

+ +		 * Open directory. First we try without |O_SEARCH| and

+ +		 * if this fails with EACCESS we try with |O_SEARCH|

+ +		 * again.

+ +		 * This is required ...

+ +		 * - ... because some platforms may require that it can

+ +		 * only be used for directories while some filesystems

+ +		 * (e.g. Reiser4 or HSM systems) allow a |fchdir()| into

+ +		 * files, too)

+ +		 * - ... to preserve the semantics of "cd", e.g.

+ +		 * otherwise "cd" would return [No access] instead of

+ +		 * [Not a directory] for files on filesystems which do

+ +		 * not allow a "cd" into files.

+ +		 * - ... to allow that a

+ +		 * $ redirect {n}</etc ; cd /dev/fd/$n # works on most

+ +		 * platforms.

+ +		 */

+ +		EINTR_REPEAT((fd = openat(dir, path, O_RDONLY|O_NONBLOCK|O_cloexec)) < 0);

+ +#   ifdef O_SEARCH

+ +		if((fd < 0) && (errno == EACCES))

+ +		{

+ +			EINTR_REPEAT((fd = openat(dir, path, O_SEARCH|O_cloexec)) < 0)

+ +		}

+ +#   endif

+ +#else

+ +		/*

+ +		 * Version of openat() call above for systems without

+ +		 * openat API. This only works because we basically

+ +		 * gurantee that |dir| is always the same place as

+ +		 * |cwd| on such machines (but this won't be the case

+ +		 * in the future).

+ +		 */

+ +		/*

+ +		 * This |fchdir()| call is not needed (yet) since

+ +		 * all consumers do not use |dir| when |AT_FDCWD|

+ +		 * is not available.

+ +		 *

+ +		 * fchdir(dir);

+ +		 */

+ +		EINTR_REPEAT((fd = open(path, O_cloexec)) < 0);

+ +#endif

+ +	}

+ +

+ +	if(fd < 0)

+ +		return fd;

+ +

+ +	/* Move fd to a number > 10 and *register* the fd number with the shell */

+ +	shfd = sh_fcntl(fd, F_dupfd_cloexec, 10);

+ +	savederrno=errno;

+ +	sh_close(fd);

+ +	errno=savederrno;

+ +	return(shfd);

+ +}

+ +

+  int	b_cd(int argc, char *argv[],Shbltin_t *context)

+  {

+  	register char *dir;

+ @@ -56,18 +149,20 @@ int	b_cd(int argc, char *argv[],Shbltin_

+  	register const char *dp;

+  	register Shell_t *shp = context->shp;

+  	int saverrno=0;

+ -	int rval,flag=0;

+ +	int rval;

+ +	bool flag=false,xattr=false;

+  	char *oldpwd;

+ +	int newdirfd;

+  	Namval_t *opwdnod, *pwdnod;

+  	if(sh_isoption(SH_RESTRICTED))

+  		errormsg(SH_DICT,ERROR_exit(1),e_restricted+4);

+  	while((rval = optget(argv,sh_optcd))) switch(rval)

+  	{

+  		case 'L':

+ -			flag = 0;

+ +			flag = false;

+  			break;

+  		case 'P':

+ -			flag = 1;

+ +			flag = true;

+  			break;

+  		case ':':

+  			errormsg(SH_DICT,2, "%s", opt_info.arg);

+ @@ -179,14 +274,72 @@ int	b_cd(int argc, char *argv[],Shbltin_

+  					continue;

+  #endif /* SHOPT_FS_3D */

+  		}

+ +		rval = newdirfd = sh_diropenat(shp, shp->pwdfd,

+ +			path_relative(shp,stakptr(PATH_OFFSET)), xattr);

+ +		if(newdirfd >=0)

+ +		{

+ +			/* chdir for directories on HSM/tapeworms may take minutes */

+ +			if(fchdir(newdirfd) >= 0)

+ +			{

+ +				if(shp->pwdfd >= 0)

+ +					sh_close(shp->pwdfd);

+ +				shp->pwdfd=newdirfd;

+ +				goto success;

+ +			}

+ +		}

+ +#ifndef O_SEARCH

+ +		else

+ +		{

+  		if((rval=chdir(path_relative(shp,stakptr(PATH_OFFSET)))) >= 0)

+ -			goto success;

+ -		if(errno!=ENOENT && saverrno==0)

+ +			{

+ +				if(shp->pwdfd >= 0)

+ +				{

+ +					sh_close(shp->pwdfd);

+ +#ifdef AT_FDCWD

+ +					shp->pwdfd = AT_FDCWD;

+ +#else

+ +					shp->pwdfd = -1;

+ +#endif

+ +				}

+ +			}

+ +		}

+ +#endif

+ +		if(saverrno==0)

+  			saverrno=errno;

+ +		if(newdirfd >=0)

+ +			sh_close(newdirfd);

+  	}

+  	while(cdpath);

+  	if(rval<0 && *dir=='/' && *(path_relative(shp,stakptr(PATH_OFFSET)))!='/')

+ -		rval = chdir(dir);

+ +	{

+ +		rval = newdirfd = sh_diropenat(shp,

+ +			shp->pwdfd,

+ +			dir, xattr);

+ +		if(newdirfd >=0)

+ +		{

+ +			/* chdir for directories on HSM/tapeworms may take minutes */

+ +			if(fchdir(newdirfd) >= 0)

+ +			{

+ +				if(shp->pwdfd >= 0)

+ +					sh_close(shp->pwdfd);

+ +				shp->pwdfd=newdirfd;

+ +				goto success;

+ +			}

+ +		}

+ +#ifndef O_SEARCH

+ +		else

+ +		{

+ +			if(chdir(dir) >=0)

+ +			{

+ +				if(shp->pwdfd >= 0)

+ +				{

+ +					sh_close(shp->pwdfd);

+ +					shp->pwdfd=-1;

+ +				}

+ +			}

+ +		}

+ +#endif

+ +	}

+  	/* use absolute chdir() if relative chdir() fails */

+  	if(rval<0)

+  	{

+ @@ -213,7 +366,7 @@ success:

+  	if(*dir != '/')

+  		return(0);

+  	nv_putval(opwdnod,oldpwd,NV_RDONLY);

+ -	flag = strlen(dir);

+ +	flag = (strlen(dir)>0)?true:false;

+  	/* delete trailing '/' */

+  	while(--flag>0 && dir[flag]=='/')

+  		dir[flag] = 0;

+ diff -up ksh-20120801/src/cmd/ksh93/include/shell.h.orig ksh-20120801/src/cmd/ksh93/include/shell.h

+ --- ksh-20120801/src/cmd/ksh93/include/shell.h.orig	2012-07-17 22:07:40.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/shell.h	2012-10-24 15:42:10.756987230 +0200

+ @@ -145,6 +145,7 @@ struct Shell_s

+  	unsigned char	trapnote;	/* set when trap/signal is pending */

+  	char		shcomp;		/* set when runing shcomp */

+  	short		subshell;	/* set for virtual subshell */

+ +	int		pwdfd;		/* file descriptor for pwd */

+  #ifdef _SH_PRIVATE

+  	_SH_PRIVATE

+  #endif /* _SH_PRIVATE */

+ diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.orig ksh-20120801/src/cmd/ksh93/sh/init.c

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c.orig	2012-05-11 19:19:10.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2012-10-24 15:31:59.659485151 +0200

+ @@ -1365,6 +1365,18 @@ Shell_t *sh_init(register int argc,regis

+  		}

+  	}

+  	sh_ioinit(shp);

+ +#ifdef AT_FDCWD

+ +       shp->pwdfd = sh_diropenat(shp, AT_FDCWD, e_dot, false);

+ +#else

+ +       /* Systems without AT_FDCWD/openat() do not use the |dir| argument */

+ +       shp->pwdfd = sh_diropenat(shp, -1, e_dot, false);

+ +#endif

+ +#ifdef O_SEARCH

+ +       /* This should _never_ happen, guranteed by design and goat sacrifice */

+ +       if(shp->pwdfd < 0)

+ +               errormsg(SH_DICT,ERROR_system(1), "Can't obtain directory fd.");

+ +#endif

+ +

+  	/* initialize signal handling */

+  	sh_siginit(shp);

+  	stakinstall(NIL(Stak_t*),nospace);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig	2012-07-23 16:49:32.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2012-10-24 15:35:02.209539671 +0200

+ @@ -1348,8 +1348,12 @@ int sh_exec(register const Shnode_t *t,

+  						{

+  							if(!shp->pwd)

+  								path_pwd(shp,0);

+ -							if(shp->pwd)

+ -								stat(".",&statb);

+ +#ifndef O_SEARCH

+ +							else if (shp->pwdfd>=0)

+ +								fstat(shp->pwdfd,&statb);

+ +							else if (shp->pwd)

+ +								stat(e_dot,&statb);

+ +#endif

+  							sfsync(NULL);

+  							share = sfset(sfstdin,SF_SHARE,0);

+  							sh_onstate(SH_STOPOK);

+ @@ -1428,14 +1432,32 @@ int sh_exec(register const Shnode_t *t,

+  						sh_offstate(SH_NOFORK);

+  					if(!(nv_isattr(np,BLT_ENV)))

+  					{

+ -						if(shp->pwd)

+ +#ifdef O_SEARCH

+ +						while((fchdir(shp->pwdfd) < 0) && errno==EINTR)

+ +							errno = 0;

+ +#else

+ +						if(shp->pwd || (shp->pwdfd >= 0))

+  						{

+  							struct stat stata;

+  							stat(".",&stata);

+  							/* restore directory changed */

+  							if(statb.st_ino!=stata.st_ino || statb.st_dev!=stata.st_dev)

+ -								chdir(shp->pwd);

+ +							{

+ +								/* chdir for directories on HSM/tapeworms may take minutes */

+ +								int err=errno;

+ +								if(shp->pwdfd >= 0)

+ +								{

+ +									 while((fchdir(shp->pwdfd) < 0) && errno==EINTR)

+ +										errno = err;

+ +								}

+ +								else

+ +								{

+ +									 while((chdir(shp->pwd) < 0) && errno==EINTR)

+ +										errno = err;

+ +								}

+ +							}

+  						}

+ +#endif /* O_SEARCH */

+  						sh_offstate(SH_STOPOK);

+  						if(share&SF_SHARE)

+  							sfset(sfstdin,SF_PUBLIC|SF_SHARE,1);

+ diff -up ksh-20120801/src/lib/libast/features/common.orig ksh-20120801/src/lib/libast/features/common

+ --- ksh-20120801/src/lib/libast/features/common.orig	2011-12-12 20:55:33.000000000 +0100

+ +++ ksh-20120801/src/lib/libast/features/common	2012-10-24 15:54:35.433885131 +0200

+ @@ -463,6 +463,66 @@ typ uintptr_t stdint.h inttypes.h no{

+  	typedef unsigned _ast_int4_t uintptr_t;

+  	#endif

+  }end

+ +typ _Bool = uint8_t

+ +cat{

+ +	#if defined(_STDC_C99) || __STDC_VERSION__ >= 199901L

+ +	#include <stdbool.h>

+ +	#else

+ +	#define bool	_Bool

+ +	#define false	0

+ +	#define true	1

+ +	#endif

+ +}end

+ +tst key __thread -lpthread note{ __thread keyword exists and works with -lpthread }end execute{

+ +	#include	<pthread.h>

+ +	

+ +	#define INITIAL		1

+ +	#define LOOP		100

+ +	

+ +	static __thread int	specific = INITIAL;

+ +	static int		global = 0;

+ +	

+ +	static void* worker(void* arg)

+ +	{

+ +		int	k;

+ +		int	v;

+ +		v = (int)(arg - 0);

+ +		for (k = 0; k < LOOP; ++k)

+ +		{	

+ +			specific += v;

+ +			usleep(1);

+ +		}

+ +		if (specific != (INITIAL + LOOP * v)) 

+ +			global = 1;

+ +		return 0;

+ +	}

+ +	int main()

+ +	{

+ +		pthread_t	th[2];

+ +	

+ +		if (pthread_create(&th[0], 0, worker, (void*)0 + 5) ||

+ +		    pthread_create(&th[1], 0, worker, (void*)0 + 7))

+ +		{

+ +			NOTE("pthread_create failed");

+ +			return 1;

+ +		}

+ +		pthread_join(th[0], 0);

+ +		pthread_join(th[1], 0);

+ +		if (global)

+ +		{

+ +			NOTE("__thread variable not thread specific");

+ +			return 1;

+ +		}

+ +		if (specific != INITIAL)

+ +		{

+ +			NOTE("main __thread variable changed by another thread");

+ +			return 1;

+ +		}

+ +		return 0;

+ +	}

+ +}end no{

+ +	#define __thread		/* __thread keyword does not exist or does not work with -lpthread */

+ +}end

+  

+  tst	- -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{

+  	#if _STD_ && _hdr_stdarg

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/lib/libast/sfio/sfcvt.c.rounditgood ksh-20120801/src/lib/libast/sfio/sfcvt.c

+ --- ksh-20120801/src/lib/libast/sfio/sfcvt.c.rounditgood	2014-02-27 16:45:54.630161032 +0100

+ +++ ksh-20120801/src/lib/libast/sfio/sfcvt.c	2014-02-27 16:45:54.658161205 +0100

+ @@ -491,7 +491,7 @@ int		format;		/* conversion format		*/

+  				*decpt += 1;

+  				if(!(format&SFFMT_EFORMAT))

+  				{	/* add one more 0 for %f precision */

+ -					ep[-1] = '0';

+ +					if(ep-sp>1) ep[-1] = '0';

+  					ep += 1;

+  				}

+  			}

@@ -0,0 +1,79 @@ 

+ diff --git a/src/cmd/ksh93/include/io.h b/src/cmd/ksh93/include/io.h

+ --- a/src/cmd/ksh93/include/io.h

+ +++ b/src/cmd/ksh93/include/io.h

+ @@ -79,7 +79,7 @@ extern Sfio_t 	*sh_iostream(Shell_t*,int);

+  extern int	sh_redirect(Shell_t*,struct ionod*,int);

+  extern void 	sh_iosave(Shell_t *, int,int,char*);

+  extern int 	safefdnumber(Shell_t* shp, int sfd);

+ -extern int 	sh_iovalidfd(Shell_t*, int);

+ +extern bool 	sh_iovalidfd(Shell_t*, int);

+  extern int 	sh_inuse(Shell_t*, int);

+  extern void 	sh_iounsave(Shell_t*);

+  extern void	iounpipe(Shell_t*);

+ diff --git a/src/cmd/ksh93/sh/io.c b/src/cmd/ksh93/sh/io.c

+ --- a/src/cmd/ksh93/sh/io.c

+ +++ b/src/cmd/ksh93/sh/io.c

+ @@ -403,38 +403,50 @@ static short		filemapsize;

+  

+  /* ======== input output and file copying ======== */

+  

+ -int  sh_iovalidfd(Shell_t *shp, int fd)

+ +bool  sh_iovalidfd(Shell_t *shp, int fd)

+  {

+  	Sfio_t		**sftable = shp->sftable;

+  	int		max,n, **fdptrs = shp->fdptrs;

+  	unsigned char	*fdstatus = shp->fdstatus;

+  	if(fd<0)

+ -		return(0);

+ +		return(false);

+  	if(fd < shp->gd->lim.open_max)

+ -		return(1);

+ +		return(true);

+  	max = strtol(astconf("OPEN_MAX",NiL,NiL),NiL,0);

+  	if(fd >= max)

+  	{

+  		errno = EBADF;

+ -		return(0);

+ +		return(false);

+  	}

+  	n = (fd+16)&~0xf;

+ -	if(n > max)

+ -		n = max;

+ +	if(n++ > max)

+ +		n = max+1;

+  	max = shp->gd->lim.open_max;

+ -	shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+1),1);

+ -	if(max)

+ -		memcpy(shp->sftable,sftable,max*sizeof(Sfio_t*));

+ +	shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+sizeof(*fdstatus)),1);

+ +

+ +	if(sftable)

+ +	{

+ +		--sftable;

+ +		if(max)

+ +			memcpy(shp->sftable,sftable,++max*sizeof(Sfio_t*));

+ +

+ +	}

+ +

+  	shp->fdptrs = (int**)(&shp->sftable[n]);

+  	if(max)

+ -		memcpy(shp->fdptrs,fdptrs,max*sizeof(int*));

+ +		memcpy(shp->fdptrs,--fdptrs,max*sizeof(int*));

+  	shp->fdstatus = (unsigned char*)(&shp->fdptrs[n]);

+  	if(max)

+ -		memcpy(shp->fdstatus,fdstatus,max);

+ +		memcpy(shp->fdstatus,--fdstatus,max);

+ +

+  	if(sftable)

+  		free((void*)sftable);

+ -	shp->gd->lim.open_max = n;

+ -	return(1);

+ +

+ +	shp->sftable++;

+ +	shp->fdptrs++;

+ +	shp->fdstatus++;

+ +	shp->gd->lim.open_max = n-1;

+ +	return(true);

+  }

+  

+  int  sh_inuse(Shell_t *shp, int fd)

@@ -0,0 +1,14 @@ 

+ diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c

+ --- a/src/cmd/ksh93/sh/xec.c

+ +++ b/src/cmd/ksh93/sh/xec.c

+ @@ -1647,8 +1647,9 @@ int sh_exec(register const Shnode_t *t, int flags)

+  					{

+  						if (!unpipe)

+  							unpipe = iousepipe(shp);

+ -						sh_subfork();

+  					}

+ +

+ +					sh_subfork();

+  				}

+  			}

+  			no_fork = !ntflag && !(type&(FAMP|FPOU)) && !shp->subshell &&

@@ -0,0 +1,20 @@ 

+ diff --git a/src/cmd/ksh93/sh/path.c b/src/cmd/ksh93/sh/path.c

+ index d723987..9965bf5 100644

+ --- a/src/cmd/ksh93/sh/path.c

+ +++ b/src/cmd/ksh93/sh/path.c

+ @@ -1791,8 +1791,12 @@ void path_alias(register Namval_t *np,register Pathcomp_t *pp)

+  	{

+  		struct stat statb;

+  		char *sp;

+ +		Pathcomp_t *old = 0;

+  		nv_offattr(np,NV_NOPRINT);

+  		nv_stack(np,&talias_init);

+ +		old = (Pathcomp_t*)np->nvalue.cp;

+ +		if (old && (--old->refcount <= 0))

+ +			free((void*)old);

+  		np->nvalue.cp = (char*)pp;

+  		pp->refcount++;

+  		nv_setattr(np,NV_TAGGED|NV_NOFREE);

+ -- 

+ 2.9.3

+ 

@@ -0,0 +1,11 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.sufix ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.sufix	2014-04-08 14:30:14.412343555 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2014-04-08 14:31:18.403876587 +0200

+ @@ -2144,6 +2144,7 @@ static int	io_prompt(Shell_t *shp,Sfio_t

+  			}

+  #endif	/* TIOCLBIC */

+  			cp = sh_mactry(shp,nv_getval(sh_scoped(shp,PS1NOD)));

+ +			shp->exitval = 0;

+  			for(;c= *cp;cp++)

+  			{

+  				if(c==HIST_CHAR)

@@ -0,0 +1,12 @@ 

+ diff --git a/src/cmd/ksh93/sh/parse.c b/src/cmd/ksh93/sh/parse.c

+ --- a/src/cmd/ksh93/sh/parse.c

+ +++ b/src/cmd/ksh93/sh/parse.c

+ @@ -742,7 +742,7 @@ static Shnode_t *funct(Lex_t *lexp)

+  	register Shnode_t *t;

+  	register int flag;

+  	struct slnod *volatile slp=0;

+ -	Stak_t *savstak;

+ +	Stak_t *volatile savstak=0;

+  	Sfoff_t	first, last;

+  	struct functnod *volatile fp;

+  	Sfio_t *iop;

@@ -0,0 +1,18 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/edit/emacs.c.tabfix ksh-20120801/src/cmd/ksh93/edit/emacs.c

+ --- ksh-20120801/src/cmd/ksh93/edit/emacs.c.tabfix	2012-07-17 22:44:44.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/edit/emacs.c	2013-03-07 15:58:59.902161711 +0100

+ @@ -1011,10 +1011,13 @@ static int escape(register Emacs_t* ep,r

+  					ep->ed->e_tabcount=0;

+  				else

+  				{

+ +					int oldi = i;

+  					i=ed_getchar(ep->ed,0);

+  					ed_ungetchar(ep->ed,i);

+ -					if(isdigit(i))

+ +					if(isdigit(i) && oldi=='=')

+  						ed_ungetchar(ep->ed,ESC);

+ +					else if (isdigit(i) || i=='\t')

+ +						ep->ed->e_tabcount=0;

+  				}

+  			}

+  			else

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.tpstl ksh-20120801/src/cmd/ksh93/sh/init.c

+ --- ksh-20120801/src/cmd/ksh93/sh/init.c.tpstl	2014-04-03 11:21:25.395547276 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-04-03 11:26:03.908867208 +0200

+ @@ -332,7 +332,7 @@ static Namfun_t *clone_optindex(Namval_t

+  /* Trap for restricted variables FPATH, PATH, SHELL, ENV */

+  static void put_restricted(register Namval_t* np,const char *val,int flags,Namfun_t *fp)

+  {

+ -	Shell_t *shp = nv_shell(np);

+ +	Shell_t *shp = sh_getinterp();

+  	int	path_scoped = 0, fpath_scoped=0;

+  	Pathcomp_t *pp;

+  	char *name = nv_name(np);

@@ -0,0 +1,98 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig	2015-08-13 15:20:14.022167794 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2015-08-13 15:21:43.263088168 -0300

+ @@ -481,12 +481,12 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  {

+  	struct subshell sub_data;

+  	register struct subshell *sp = &sub_data;

+ -	int jmpval,nsig=0,duped=0;

+ +	int jmpval,isig,nsig=0,duped=0;

+  	long savecurenv = shp->curenv;

+  	int savejobpgid = job.curpgid;

+  	int *saveexitval = job.exitval;

+  	int16_t subshell;

+ -	char *savsig;

+ +	char **savsig;

+  	Sfio_t *iop=0;

+  	struct checkpt buff;

+  	struct sh_scoped savst;

+ @@ -561,10 +561,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		/* save trap table */

+  		shp->st.otrapcom = 0;

+  		shp->st.otrap = savst.trap;

+ -		if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0])

+ +		if((nsig=shp->st.trapmax)>0 || shp->st.trapcom[0])

+  		{

+ -			nsig += sizeof(char*);

+ -			memcpy(savsig=malloc(nsig),(char*)&shp->st.trapcom[0],nsig);

+ +			++nsig;

+ +			savsig = malloc(nsig * sizeof(char*));

+ +			/* contents of shp->st.trapcom may change */

+ +			for (isig = 0; isig < nsig; ++isig)

+ +				savsig[isig] = shp->st.trapcom[isig] == Empty ? Empty : (shp->st.trapcom[isig] ? strdup(shp->st.trapcom[isig]) : NULL);

+  			/* this nonsense needed for $(trap) */

+  			shp->st.otrapcom = (char**)savsig;

+  		}

+ @@ -732,7 +735,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  		shp->st.otrap = 0;

+  		if(nsig)

+  		{

+ -			memcpy((char*)&shp->st.trapcom[0],savsig,nsig);

+ +			for (isig = 0; isig < nsig; ++isig)

+ +				if (shp->st.trapcom[isig] && shp->st.trapcom[isig]!=Empty)

+ +					free(shp->st.trapcom[isig]);

+ +			memcpy((char*)&shp->st.trapcom[0],savsig,nsig*sizeof(char*));

+  			free((void*)savsig);

+  		}

+  		shp->options = sp->options;

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.orig ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.orig	2015-08-13 15:22:09.821062351 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2015-08-13 15:28:06.166662530 -0300

+ @@ -3383,10 +3383,10 @@ int sh_funscope(int argn, char *argv[],i

+  	struct dolnod		*argsav=0,*saveargfor;

+  	struct sh_scoped	savst, *prevscope = shp->st.self;

+  	struct argnod		*envlist=0;

+ -	int			jmpval;

+ +	int			isig,jmpval;

+  	volatile int		r = 0;

+  	int			n;

+ -	char 			*savstak;

+ +	char 			**savsig;

+  	struct funenv		*fp = 0;

+  	struct checkpt	*buffp = (struct checkpt*)stkalloc(shp->stk,sizeof(struct checkpt));

+  	Namval_t		*nspace = shp->namespace;

+ @@ -3435,10 +3435,13 @@ int sh_funscope(int argn, char *argv[],i

+  	}

+  	shp->st.cmdname = argv[0];

+  	/* save trap table */

+ -	if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0])

+ +	if((nsig=shp->st.trapmax)>0 || shp->st.trapcom[0])

+  	{

+ -		nsig += sizeof(char*);

+ -		memcpy(savstak=stakalloc(nsig),(char*)&shp->st.trapcom[0],nsig);

+ +		++nsig;

+ +		savsig = malloc(nsig * sizeof(char*));

+ +		/* contents of shp->st.trapcom may change */

+ +		for (isig = 0; isig < nsig; ++isig)

+ +			savsig[isig] = shp->st.trapcom[isig] == Empty ? Empty : (shp->st.trapcom[isig] ? strdup(shp->st.trapcom[isig]) : NULL);

+  	}

+  	sh_sigreset(0);

+  	argsav = sh_argnew(shp,argv,&saveargfor);

+ @@ -3502,10 +3505,14 @@ int sh_funscope(int argn, char *argv[],i

+  	shp->topscope = (Shscope_t*)prevscope;

+  	nv_getval(sh_scoped(shp,IFSNOD));

+  	if(nsig)

+ -		memcpy((char*)&shp->st.trapcom[0],savstak,nsig);

+ +	{

+ +		for (isig = 0; isig < nsig; ++isig)

+ +			if (shp->st.trapcom[isig] && shp->st.trapcom[isig]!=Empty)

+ +				free(shp->st.trapcom[isig]);

+ +		memcpy((char*)&shp->st.trapcom[0],savsig,nsig*sizeof(char*));

+ +		free((void*)savsig);

+ +	}

+  	shp->trapnote=0;

+ -	if(nsig)

+ -		stakset(savstak,0);

+  	shp->options = options;

+  	shp->last_root = last_root;

+  	if(jmpval == SH_JMPSUB)

@@ -0,0 +1,16 @@ 

+ diff --git a/src/cmd/ksh93/bltins/typeset.c b/src/cmd/ksh93/bltins/typeset.c

+ index 15fcd58..8939011 100644

+ --- a/src/cmd/ksh93/bltins/typeset.c

+ +++ b/src/cmd/ksh93/bltins/typeset.c

+ @@ -1442,7 +1442,7 @@ static void print_scan(Sfio_t *file, int flag, Dt_t *root, int option,struct tda

+  		tp->scanmask |= (NV_DOUBLE|NV_EXPNOTE);

+  	if(flag==NV_LTOU || flag==NV_UTOL)

+  		tp->scanmask |= NV_UTOL|NV_LTOU;

+ -	namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag);

+ +	namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag&~NV_IARRAY);

+  	argv = tp->argnam  = (char**)stkalloc(tp->sh->stk,(namec+1)*sizeof(char*));

+  	namec = nv_scan(root, pushname, (void*)tp, tp->scanmask, flag&~NV_IARRAY);

+  	if(mbcoll())

+ -- 

+ 2.9.3

+ 

@@ -0,0 +1,17 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.bz1222025 ksh-20120801/src/cmd/ksh93/sh/macro.c

+ --- ksh-20120801/src/cmd/ksh93/sh/macro.c.bz1222025	2015-09-15 17:28:47.304722569 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2015-09-17 17:49:46.842891942 +0200

+ @@ -1195,6 +1195,13 @@ retry1:

+  		}

+  		else

+  			v = 0;

+ +		if(!v && sh_isoption(SH_NOUNSET))

+ +		{

+ +			d=fcget();

+ +			fcseek(-1);

+ +			if(!(d && strchr(":+-?=",d)))

+ +				errormsg(SH_DICT,ERROR_exit(1),e_notset,ltos(c));

+ +		}

+  		break;

+  	    case S_ALP:

+  		if(c=='.' && type==0)

@@ -0,0 +1,11 @@ 

+ diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c

+ --- a/src/cmd/ksh93/sh/xec.c

+ +++ b/src/cmd/ksh93/sh/xec.c

+ @@ -122,6 +122,7 @@ int iousepipe(Shell_t *shp)

+  		return(1);

+  	}

+  	subpipe[2] = sh_fcntl(fd,F_dupfd_cloexec,10);

+ + 	sh_iovalidfd(shp,subpipe[2]);

+  	shp->fdstatus[subpipe[2]] = shp->fdstatus[1];

+  	while(close(fd)<0 && errno==EINTR)

+  		errno = err;

@@ -0,0 +1,29 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/typeset.c.xufix ksh-20120801/src/cmd/ksh93/bltins/typeset.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/typeset.c.xufix	2015-02-03 14:47:23.266022137 +0100

+ +++ ksh-20120801/src/cmd/ksh93/bltins/typeset.c	2015-02-03 14:47:23.308022046 +0100

+ @@ -93,6 +93,8 @@ int    b_readonly(int argc,char *argv[],

+  	memset((void*)&tdata,0,sizeof(tdata));

+  	tdata.sh = context->shp;

+  	tdata.aflag = '-';

+ +	/* do not change size */

+ +	tdata.argnum = -1;

+  	while((flag = optget(argv,*command=='e'?sh_optexport:sh_optreadonly))) switch(flag)

+  	{

+  		case 'p':

+ diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.xufix ksh-20120801/src/cmd/ksh93/sh/name.c

+ --- ksh-20120801/src/cmd/ksh93/sh/name.c.xufix	2015-02-03 14:47:23.281022105 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/name.c	2015-02-03 14:52:08.768404194 +0100

+ @@ -3019,10 +3019,12 @@ void nv_newattr (register Namval_t *np,

+  			nv_onattr(np,NV_EXPORT);

+  			sh_envput(shp->env,np);

+  		}

+ -		if((n^newatts)==NV_EXPORT)

+ +		if((n^newatts)==NV_EXPORT && size==-1)

+  			return;

+  	}

+  	oldsize = nv_size(np);

+ +	if (size == -1)

+ +		size = oldsize;

+  	if((size==oldsize|| (n&NV_INTEGER)) && !trans && ((n^newatts)&~NV_NOCHANGE)==0)

+  	{

+  		if(size)

@@ -0,0 +1,21 @@ 

+ diff -up ksh-20130214/src/cmd/ksh93/sh/jobs.c.fixkill ksh-20130214/src/cmd/ksh93/sh/jobs.c

+ --- ksh-20130214/src/cmd/ksh93/sh/jobs.c.fixkill	2012-09-26 17:43:04.000000000 +0200

+ +++ ksh-20130214/src/cmd/ksh93/sh/jobs.c	2013-02-22 16:38:05.080161740 +0100

+ @@ -1104,6 +1104,8 @@ static struct process *job_bystring(regi

+  

+  int job_kill(register struct process *pw,register int sig)

+  {

+ +	if(pw==0)

+ +		goto error;

+  	Shell_t	*shp = pw->p_shp;

+  	register pid_t pid;

+  	register int r;

+ @@ -1127,8 +1129,6 @@ int job_kill(register struct process *pw

+  #endif	/* SIGTSTP */

+  	job_lock();

+  	errno = ECHILD;

+ -	if(pw==0)

+ -		goto error;

+  	pid = pw->p_pid;

+  #if SHOPT_COSHELL

+  	if(pw->p_cojob)

@@ -0,0 +1,15 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix4 ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c

+ --- ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c.cdfix4	2014-08-26 15:24:57.276953822 +0200

+ +++ ksh-20120801/src/cmd/ksh93/bltins/cd_pwd.c	2014-08-26 15:25:34.738770361 +0200

+ @@ -143,9 +143,9 @@ int sh_diropenat(Shell_t *shp, int dir,

+  	}

+  

+  	/* Move fd to a number > 10 and *register* the fd number with the shell */

+ -	shfd = sh_fcntl(fd, F_dupfd_cloexec, 10);

+ +	shfd = fcntl(fd, F_dupfd_cloexec, 10);

+  	savederrno=errno;

+ -	sh_close(fd);

+ +	close(fd);

+  	errno=savederrno;

+  	return(shfd);

+  }

@@ -0,0 +1,58 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/defs.h.longer ksh-20120801/src/cmd/ksh93/include/defs.h

+ --- ksh-20120801/src/cmd/ksh93/include/defs.h.longer	2012-06-25 20:47:47.000000000 +0200

+ +++ ksh-20120801/src/cmd/ksh93/include/defs.h	2013-07-08 17:33:42.238534376 +0200

+ @@ -162,8 +162,8 @@ struct shared

+  	Namval_t	*prev_table;	/* previous table used in nv_open  */ \

+  	Sfio_t		*outpool;	/* ouput stream pool */ \

+  	long		timeout;	/* read timeout */ \

+ -	short		curenv;		/* current subshell number */ \

+ -	short		jobenv;		/* subshell number for jobs */ \

+ +	long		curenv;		/* current subshell number */ \

+ +	long		jobenv;		/* subshell number for jobs */ \

+  	int		infd;		/* input file descriptor */ \

+  	short		nextprompt;	/* next prompt is PS<nextprompt> */ \

+  	short		poolfiles; \

+ diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.longer ksh-20120801/src/cmd/ksh93/include/jobs.h

+ --- ksh-20120801/src/cmd/ksh93/include/jobs.h.longer	2011-12-19 13:36:37.000000000 +0100

+ +++ ksh-20120801/src/cmd/ksh93/include/jobs.h	2013-07-08 17:32:52.881124147 +0200

+ @@ -87,7 +87,7 @@ struct process

+  	unsigned short	p_exit;		/* exit value or signal number */

+  	unsigned short	p_exitmin;	/* minimum exit value for xargs */

+  	unsigned short	p_flag;		/* flags - see below */

+ -	int		p_env;		/* subshell environment number */

+ +	long		p_env;		/* subshell environment number */

+  #ifdef JOBS

+  	off_t		p_name;		/* history file offset for command */

+  	struct termios	p_stty;		/* terminal state for job */

+ diff -up ksh-20120801/src/cmd/ksh93/sh/jobs.c.longer ksh-20120801/src/cmd/ksh93/sh/jobs.c

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.longer ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.longer	2013-07-08 17:32:52.874124090 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2013-07-08 17:32:52.882124156 +0200

+ @@ -98,7 +98,7 @@ static struct subshell

+  #endif /* SHOPT_COSHELL */

+  } *subshell_data;

+  

+ -static int subenv;

+ +static long subenv;

+  

+  

+  /*

+ @@ -171,7 +171,8 @@ void sh_subfork(void)

+  {

+  	register struct subshell *sp = subshell_data;

+  	Shell_t	*shp = sp->shp;

+ -	int	curenv = shp->curenv, comsub=shp->comsub;

+ +	long	curenv = shp->curenv;

+ +	int	comsub=shp->comsub;

+  	pid_t pid;

+  	char *trap = shp->st.trapcom[0];

+  	if(trap)

+ @@ -461,7 +462,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  	struct subshell sub_data;

+  	register struct subshell *sp = &sub_data;

+  	int jmpval,nsig=0,duped=0;

+ -	int savecurenv = shp->curenv;

+ +	long savecurenv = shp->curenv;

+  	int savejobpgid = job.curpgid;

+  	int *saveexitval = job.exitval;

+  	int16_t subshell;

@@ -0,0 +1,12 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/expand.c.fikspand ksh-20120801/src/cmd/ksh93/sh/expand.c

+ --- ksh-20120801/src/cmd/ksh93/sh/expand.c.fikspand	2010-11-24 05:46:30.000000000 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/expand.c	2014-05-22 12:55:46.252717371 +0200

+ @@ -278,6 +278,8 @@ int path_generate(Shell_t *shp,struct ar

+  	char comma, range=0;

+  	int first, last, incr, count = 0;

+  	char tmp[32], end[1];

+ +	if(!sh_isoption(SH_BRACEEXPAND))

+ +		return path_expand(shp,todo->argval,arghead);

+  	todo->argchn.ap = 0;

+  again:

+  	apin = ap = todo;

@@ -0,0 +1,37 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.hokaido ksh-20120801/src/cmd/ksh93/sh/xec.c

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c.hokaido	2014-09-18 14:41:57.696756230 +0200

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-09-18 14:43:55.439205247 +0200

+ @@ -1633,12 +1633,20 @@ int sh_exec(register const Shnode_t *t,

+  #endif /* SHOPT_COSHELL */

+  			if(shp->subshell)

+  			{

+ +				int comsubsave = shp->comsub;

+ +				if(comsubsave==1)

+ +					shp->comsub = 2;

+  				sh_subtmpfile(shp);

+ +				shp->comsub = comsubsave;

+ +				if(shp->comsub==1 && (!(shp->fdstatus[1]&IONOSEEK)))

+ +					unpipe = iousepipe(shp);

+ +

+  				if((type&(FAMP|TFORK))==(FAMP|TFORK))

+  				{

+  					if(shp->comsub && !(shp->fdstatus[1]&IONOSEEK))

+  					{

+ -						unpipe = iousepipe(shp);

+ +						if (!unpipe)

+ +							unpipe = iousepipe(shp);

+  						sh_subfork();

+  					}

+  				}

+ @@ -2107,7 +2115,11 @@ int sh_exec(register const Shnode_t *t,

+  			job.curjobid = 0;

+  			if(shp->subshell)

+  			{

+ +				int comsubsave = shp->comsub;

+ +				if(comsubsave==1)

+ +					shp->comsub = 2;

+  				sh_subtmpfile(shp);

+ +				shp->comsub = comsubsave;

+  				if(shp->comsub==1 && !(shp->fdstatus[1]&IONOSEEK))

+  					iousepipe(shp);

+  			}

@@ -0,0 +1,11 @@ 

+ --- ksh-20120801/src/cmd/ksh93/sh/xec.c	2015-04-02 10:55:26.228017873 -0400

+ +++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2015-04-02 10:56:04.099017700 -0400

+ @@ -1234,7 +1234,7 @@ int sh_exec(register const Shnode_t *t, 

+  			if((io||argn))

+  			{

+  				Shbltin_t *bp=0;

+ -				static char *argv[1];

+ +				static char *argv[2];

+  				int tflags = 1;

+  				if(np &&  nv_isattr(np,BLT_DCL))

+  					tflags |= 2;

@@ -0,0 +1,21 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/sh/main.c.orig ksh-20120801/src/cmd/ksh93/sh/main.c

+ --- ksh-20120801/src/cmd/ksh93/sh/main.c.orig	2015-04-29 16:49:11.502958000 -0300

+ +++ ksh-20120801/src/cmd/ksh93/sh/main.c	2015-05-08 18:19:55.688776922 -0300

+ @@ -423,7 +423,7 @@ static void	exfile(register Shell_t *shp

+  		sfsync(shp->outpool);

+  		shp->st.execbrk = shp->st.breakcnt = 0;

+  		/* check for return from profile or env file */

+ -		if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT))

+ +		if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT || jmpval==SH_JMPERREXIT))

+  		{

+  			sh_setstate(states);

+  			goto done;

+ @@ -598,7 +598,7 @@ done:

+  	}

+  	if(jmpval == SH_JMPSCRIPT)

+  		siglongjmp(*shp->jmplist,jmpval);

+ -	else if(jmpval == SH_JMPEXIT)

+ +	else if(jmpval == SH_JMPEXIT || jmpval == SH_JMPERREXIT)

+  		sh_done(shp,0);

+  	if(fno>0)

+  		sh_close(fno);

@@ -0,0 +1,52 @@ 

+ diff -up ksh-20120801/src/cmd/ksh93/include/io.h.safefd ksh-20120801/src/cmd/ksh93/include/io.h

+ --- ksh-20120801/src/cmd/ksh93/include/io.h.safefd	2015-03-03 18:21:40.544732158 +0100

+ +++ ksh-20120801/src/cmd/ksh93/include/io.h	2015-03-03 18:22:16.284447849 +0100

+ @@ -78,6 +78,7 @@ extern void 	sh_iorestore(Shell_t*,int,i

+  extern Sfio_t 	*sh_iostream(Shell_t*,int);

+  extern int	sh_redirect(Shell_t*,struct ionod*,int);

+  extern void 	sh_iosave(Shell_t *, int,int,char*);

+ +extern int 	safefdnumber(Shell_t* shp, int sfd);

+  extern int 	sh_iovalidfd(Shell_t*, int);

+  extern int 	sh_inuse(Shell_t*, int);

+  extern void 	sh_iounsave(Shell_t*);

+ diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.safefd ksh-20120801/src/cmd/ksh93/sh/io.c

+ --- ksh-20120801/src/cmd/ksh93/sh/io.c.safefd	2015-03-03 18:21:40.511732421 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/io.c	2015-03-03 18:21:40.544732158 +0100

+ @@ -1724,6 +1724,25 @@ void sh_iosave(Shell_t *shp, register in

+  	}

+  }

+  

+ +int safefdnumber(Shell_t* shp, int sfd)

+ +{

+ +	register int fd;

+ +

+ +	while(1)

+ +	{

+ +		for(fd=0; fd < shp->topfd; fd++)

+ +		{

+ +			if (filemap[fd].save_fd==sfd || filemap[fd].orig_fd==sfd || (fcntl(sfd, F_GETFD) != -1 || errno != EBADF))

+ +			{

+ +				sfd++;

+ +				continue;

+ +			}

+ +		}

+ +		break;

+ +	}

+ +	return sfd;

+ +}

+ +

+  /*

+   *  close all saved file descriptors

+   */

+ diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd ksh-20120801/src/cmd/ksh93/sh/subshell.c

+ --- ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd	2015-03-03 18:21:40.531732261 +0100

+ +++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2015-03-03 18:21:40.544732158 +0100

+ @@ -673,7 +673,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_

+  			}

+  			if(iop && sffileno(iop)==1)

+  			{

+ -				int fd=sfsetfd(iop,3);

+ +				int fd=sfsetfd(iop,safefdnumber(shp,3));

+  				if(fd<0)

+  				{

+  					shp->toomany = 1;

@@ -1,78 +0,0 @@ 

- diff --git a/src/cmd/ksh93/sh/arith.c b/src/cmd/ksh93/sh/arith.c

- --- a/src/cmd/ksh93/sh/arith.c

- +++ b/src/cmd/ksh93/sh/arith.c

- @@ -567,19 +567,32 @@ Sfdouble_t sh_strnum(Shell_t *shp, const char *str, char **ptr, int mode) {

-      char *last;

-  

-      if (*str == 0) {

- -        if (ptr) *ptr = (char *)str;

- -        return 0;

- -    }

- -    errno = 0;

- -    d = number(str, &last, shp->inarith ? 0 : 10, NULL);

- -    if (*last) {

- -        if (*last != '.' || last[1] != '.') {

- -            d = strval(shp, str, &last, arith, mode);

- -            Varsubscript = true;

- +        d = 0.0;

- +        last = (char *)str;

- +    } else {

- +        d = number(str, &last, shp->inarith ? 0 : 10, NULL);

- +        if (*last && !shp->inarith && sh_isstate(shp, SH_INIT)) {

- +            // This call is to handle "base#value" literals if we're importing untrusted env vars.

- +            d = number(str, &last, 0, NULL);

- +        }

- +        if (*last) {

- +            if (sh_isstate(shp, SH_INIT)) {

- +                // Initializing means importing untrusted env vars. Since the string does not appear

- +                // to be a recognized numeric literal give up. We can't safely call strval() since

- +                // that allows arbitrary expressions which would create a security vulnerability.

- +                d = 0.0;

- +            } else {

- +                if (*last != '.' || last[1] != '.') {

- +                    d = strval(shp, str, &last, arith, mode);

- +                    Varsubscript = true;

- +                }

- +                if (!ptr && *last && mode > 0) {

- +                    errormsg(SH_DICT, ERROR_exit(1), e_lexbadchar, *last, str);

- +                }

- +            }

- +        } else if (d == 0.0 && *str == '-') {

- +            d = -0.0;

-          }

- -        if (!ptr && *last && mode > 0) errormsg(SH_DICT, ERROR_exit(1), e_lexbadchar, *last, str);

- -    } else if (!d && *str == '-') {

- -        d = -0.0;

-      }

-      if (ptr) *ptr = last;

-      return d;

- diff --git a/src/cmd/ksh93/tests/subshell.sh b/src/cmd/ksh93/tests/subshell.sh

- --- a/src/cmd/ksh93/tests/subshell.sh

- +++ b/src/cmd/ksh93/tests/subshell.sh

- @@ -856,3 +856,26 @@ for exp in 65535 65536

-  do    got=$($SHELL -c 'x=$(printf "%.*c" '$exp' x); print ${#x}' 2>&1)

-      [[ $got == $exp ]] || log_error "large command substitution failed" "$exp" "$got"

-  done

- +

- +# ==========

- +# Verify that importing untrusted env vars does not allow evaluating arbitrary expressions but does

- +# recognize all integer literals recognized by ksh.

- +expect=8

- +actual=$(env SHLVL='7' $SHELL -c 'echo $SHLVL')

- +[[ $actual == $expect ]] || log_error "decimal int literal not recognized" "$expect" "$actual"

- +

- +expect=14

- +actual=$(env SHLVL='013' $SHELL -c 'echo $SHLVL')

- +[[ $actual == $expect ]] || log_error "leading zeros int literal not recognized" "$expect" "$actual"

- +

- +expect=4

- +actual=$(env SHLVL='2#11' $SHELL -c 'echo $SHLVL')

- +[[ $actual == $expect ]] || log_error "base#value int literal not recognized" "$expect" "$actual"

- +

- +expect=12

- +actual=$(env SHLVL='16#B' $SHELL -c 'echo $SHLVL')

- +[[ $actual == $expect ]] || log_error "base#value int literal not recognized" "$expect" "$actual"

- +

- +expect=1

- +actual=$(env SHLVL="2#11+x[\$($bin_echo DANGER WILL ROBINSON >&2)0]" $SHELL -c 'echo $SHLVL')

- +[[ $actual == $expect ]] || log_error "expression allowed on env var import" "$expect" "$actual"

file modified
+334 -70
@@ -1,115 +1,379 @@ 

+ %global       releasedate 20120801

+ %global       release_date %{lua:reldate=rpm.expand("%{releasedate}");print(("%s-%s-%s"):format(reldate:sub(0,4),reldate:sub(5,6),reldate:sub(7)))}

+ 

  Name:         ksh

  Summary:      The Original ATT Korn Shell

  URL:          http://www.kornshell.com/

  License:      EPL

- Version:      2020.0.0

- Release:      4%{?dist}

- # We are upgrading from ksh-20120801-250, so set epoch.

- Epoch:        1

- Source0:      https://github.com/att/ast/releases/download/%{version}/%{name}-%{version}.tar.gz

- Source1:      kshcomp.conf

- Source2:      kshrc.rhs

- Source3:      dotkshrc

+ Epoch:        2

+ Version:      %{releasedate}

+ Release:      251%{?dist}

+ Source0:      http://www.research.att.com/~gsf/download/tgz/ast-ksh.%{release_date}.tgz

+ Source1:      http://www.research.att.com/~gsf/download/tgz/INIT.%{release_date}.tgz

+ Source2:      kshcomp.conf

+ Source3:      kshrc.rhs

+ Source4:      dotkshrc

  

- Patch1: ksh-2020.0.0-cve-2019-14868.patch

+ # expected results of test suite

+ Source5:      expectedresults.log

  

- Provides: /bin/ksh

+ # don't use not wanted/needed builtins - Fedora/RHEL specific

+ Patch1:       ksh-20070328-builtins.patch

+ 

+ # fix regression test suite to be usable during packagebuild - Fedora/RHEL specific

+ Patch2:      ksh-20100826-fixregr.patch

+ 

+ # fedora/rhel specific, rhbz#619692

+ Patch6:       ksh-20080202-manfix.patch

+ 

+ # rhbz#702008

+ Patch17:      ksh-20100202-pathvar.patch

+ 

+ # rhbz#924440

+ Patch18:      ksh-20100621-fdstatus.patch

+ 

+ # fixes for regressions found in ksh-20120801 rebase

+ Patch19:      ksh-20120801-rmdirfix.patch

+ Patch20:      ksh-20120801-cdfix.patch

+ Patch21:      ksh-20120801-cdfix2.patch

+ Patch22:      ksh-20120801-tabfix.patch

+ Patch23:      ksh-20130214-fixkill.patch

+ 

+ # for ksh <= 2013-05-31, rhbz#960034

+ Patch24:      ksh-20120801-kshmfix.patch

+ 

+ # for ksh <= 2016-06-28, rhbz#921455

+ Patch25:      ksh-20120801-memlik.patch

+ 

+ # for ksh <= 2013-03-20, rhbz#922851

+ Patch26:      ksh-20120801-forkbomb.patch

+ 

+ # for ksh <= 2013-04-19, rhbz#913110

+ Patch27:      ksh-20120801-macro.patch

+ 

+ # not completely upstream yet, rhbz#858263

+ Patch29:      ksh-20130628-longer.patch

+ 

+ # for ksh <= 2013-07-19, rhbz#982142

+ Patch30: ksh-20120801-mlikfiks.patch

+ 

+ # not yet upstream, related to 2012-08-01 rebase

+ Patch31: ksh-20120801-covsfix.patch

+ 

+ # rhbz#1007816

+ Patch32: ksh-20100621-manfix3.patch

+ 

+ # rhbz#1016611

+ Patch33: ksh-20120801-nomulti.patch

+ 

+ # for ksh <= 2014-01-14, rhbz#

+ Patch34: ksh-20120801-mtty.patch

+ 

+ # from upstream, rbzh#1048272

+ Patch35: ksh-20120801-fd2lost.patch

+ 

+ # sent upstream 2014-01, rhbz#1047507

+ Patch36: ksh-20120801-argvfix.patch

+ 

+ # for ksh <= 2014-01-14, rhbz#1048995

+ Patch37: ksh-20120801-memlik3.patch

+ 

+ # for ksh <= 2013-04-09, rhbz#960371

+ Patch38: ksh-20120801-lexfix.patch

+ 

+ # not yet upstream, for ksh <= 2014-02-26, rhbz#1070328

+ Patch39: ksh-20120801-filecomsubst.patch

+ 

+ # for ksh <= 2014-06-25, rhbz#825520,rhbz#1084406

+ Patch40: ksh-20120801-crash.patch

+ 

+ # for ksh < 2013-03-19, rhbz#1085385

+ Patch41: ksh-20120801-sufix.patch

+ 

+ # sent upstream, rhbz#1099935

+ Patch42: ksh-20140301-fikspand.patch

+ 

+ # for ksh < 2014-04-15, rhbz#1070871

+ Patch43: ksh-20120801-roundit.patch

+ 

+ # for ksh < 2014-04-15, rhbz#1111120

+ Patch44: ksh-20120801-heresub.patch

+ 

+ # not included upstream yet, rhbz#1077090

+ Patch45: ksh-20140415-hokaido.patch

+ 

+ # for ksh < 2012-10-04, rhbz#1121960

+ Patch46: ksh-20120801-tpstl.patch

+ 

+ # sent upstream, rhbz#1100215

+ Patch47: ksh-20120801-manfix4.patch

+ 

+ # not upstream yet, rhbz#1100215

+ Patch48: ksh-20120801-fununset.patch

+ 

+ # for ksh < 2014-06-25, rhbz#1109893

+ Patch49: ksh-20120801-cdfix3.patch

+ 

+ # sent upstream, rhbz#1116506

+ Patch50: ksh-20120801-locking.patch

+ 

+ # for ksh <= 2013-06-13, rhbz#1133585

+ Patch51: ksh-20130613-cdfix4.patch

+ 

+ Patch52: ksh-20120801-retfix.patch

+ 

+ # sent upstream, for ksh <= 2014-09-30

+ Patch53: ksh-20120801-cdfork.patch

+ 

+ # not upstream yet, for ksh <= 2015-04-03, rhbz#1200534

+ Patch54: ksh-20140801-arraylen.patch

+ 

+ # sent upstream, for ksh <= 2014-09-29, rhbz#1212993

+ Patch55: ksh-20140801-diskfull.patch

+ 

+ # not upstream yet, rhbz#1192026

+ Patch56: ksh-20120801-xufix.patch

+ 

+ # sent upstream, for ksh <= 2014-12-18, rhbz#1192119

+ Patch58: ksh-20120801-alarmifs.patch

+ 

+ # not yet upstream, rhbz#1202439

+ Patch59: ksh-20140929-safefd.patch

+ 

+ # workaround, for ksh < 2013-05-24, rhbz#1211540

+ Patch60: ksh-20120801-trapcom.patch

+ 

+ # not yet upstream, rhbz#1217237

+ Patch64: ksh-20120801-nohupfork.patch

+ 

+ # from upstream, for ksh <= 20130409, rhbz#1241014

+ Patch65: ksh-20120801-parserfix.patch

+ 

+ # not upstream yet, rhbz#1211538

+ Patch66: ksh-20120801-oldenvinit.patch

+ 

+ # from upsteam, for ksh < 2012-10-04, rhbz#1193557

+ Patch67: ksh-20120801-emptyarrayinit.patch

+ 

+ # not upstream yet, rhbz#1371630

+ Patch68: ksh-20120801-typeset.patch

+ 

+ # not upstream yet, rhbz#1321443

+ Patch69: ksh-20120801-dotdoublefree.patch

  

- BuildRequires:  meson

- BuildRequires:  gcc

- BuildRequires:  glibc-devel

- # This package is require by test cases

- # It should be enabled when we start running test cases in package builds

- # BuildRequires:  glibc-langpack-zh

- BuildRequires:  ed

- Conflicts:      pdksh

- Requires(post): grep, coreutils, systemd-units

+ # not upstream yet, rhbz#1405784

+ Patch70: ksh-20120801-subshell-leak.patch

+ 

+ # rhbz#1189297

+ Patch71: ksh-20120801-assoc-unset-leak.patch

+ 

+ # rhbz#1222025

+ Patch72: ksh-20120801-unset-param.patch

+ 

+ # rhbz#1269088

+ Patch73: ksh-20120801-badgcc.patch

+ 

+ # rhbz#1299484

+ Patch74: ksh-20120801-mb-after-argvar.patch

+ Patch75: ksh-20120801-F_dupfd_cloexec.patch

+ 

+ # rhbz#1441142

+ Patch76: ksh-20120801-kia.patch

+ 

+ # rhbz#1417886

+ Patch77: ksh-20120801-iso8859.patch

+ 

+ # rhbz#1451057

+ Patch78: ksh-20120801-syntax-error.patch

+ 

+ # rhbz#1477082

+ Patch79: ksh-20120801-glibc-build-fix.patch

+ 

+ # rhbz#1459000

+ Patch80: ksh-20120801-jobwait-sigstop.patch

+ 

+ # rhbz#1462347

+ Patch81: ksh-20120801-subshell-jobwait.patch

+ 

+ # rhbz#1471874

+ Patch82: ksh-20120801-posix-exit.patch

+ 

+ # rhbz#1464409

+ Patch83: ksh-20120801-sh_iovalidfd.patch

+ 

+ # rhbz#1537053

+ Patch84: ksh-20120801-validate-fd.patch

+ 

+ # There were couple of places where CCFLAGS variable was not passed while

+ # compiling binaries. This patch fixes it. Loosely related to rhbz#1548549.

+ Patch85: ksh-20120801-ccflags.patch

+ 

+ Patch86: ksh-20120801-nv_open-memcmp.patch

+ 

+ Patch87: ksh-20120801-covsfix2.patch

+ 

+ # rhbz#1624125

+ Patch88: ksh-20120801-annocheck.patch

+ 

+ # rhbz#1790547

+ Patch89: ksh-20120801-cve-2019-14868.patch

+ 

+ Conflicts:    pdksh

+ Requires: coreutils, diffutils

+ BuildRequires: gcc

+ BuildRequires: bison

+ # regression test suite uses 'ps' from procps

+ BuildRequires: procps

+ Requires(post): grep, coreutils, systemd

  Requires(postun): sed

  

- Provides:       /bin/ksh

- Provides:       /usr/bin/ksh

+ Provides: /bin/ksh

  

  %description

+ KSH-93 is the most recent version of the KornShell by David Korn of

+ AT&T Bell Laboratories.

  KornShell is a shell programming language, which is upward compatible

  with "sh" (the Bourne Shell).

  

  %prep

- %autosetup -n %{name}-%{version} -p1

+ %setup -q -c

+ %setup -q -T -D -a 1

+ %autopatch -p1

+ 

+ #/dev/fd test does not work because of mock

+ sed -i 's|ls /dev/fd|ls /proc/self/fd|' src/cmd/ksh93/features/options

+ 

+ # sh/main.c was not using CCFLAGS

+ sed -i '/-c sh\/main.c/s|${mam_cc_FLAGS} |${mam_cc_FLAGS} ${CCFLAGS} |p' src/cmd/ksh93/Mamfile

+ 

+ # disable register for debugging

+ sed -i 1i"#define register" src/lib/libast/include/ast.h

  

  %build

- %meson -Dbuild-api-tests=false

- %meson_build

+ XTRAFLAGS=""

+ for f in -Wno-unknown-pragmas -Wno-missing-braces -Wno-unused-result -Wno-return-type -Wno-int-to-pointer-cast -Wno-parentheses -Wno-unused -Wno-unused-but-set-variable -Wno-cpp -P

+ do

+   gcc $f -E - </dev/null >/dev/null 2>&1 && XTRAFLAGS="$XTRAFLAGS $f"

+ done

+ ./bin/package

+ ./bin/package make mamake ||:

+ ./bin/package make mamake ||:

+ export CCFLAGS="$RPM_OPT_FLAGS $RPM_LD_FLAGS -fno-strict-aliasing $XTRAFLAGS"

+ export CC=gcc

+ ./bin/package make -S

+ 

+ #cp lib/package/LICENSES/epl LICENSE

  

  %install

- %meson_install

- # Allow switching between different ksh implementations (for e.g. mksh) through alternatives.

- mv %{buildroot}/%{_bindir}/ksh %{buildroot}/%{_bindir}/ksh93

- mv %{buildroot}/%{_bindir}/shcomp %{buildroot}/%{_bindir}/shcomp93

- # http://mesonbuild.com/Release-notes-for-0-49-0.html#manpages-are-no-longer-compressed-implicitly

- # meson 0.49 does not compress man pages

- if [[ -e  %{buildroot}/%{_mandir}/man1/ksh.1.gz ]]

+ mkdir -p %{buildroot}{/bin,%{_bindir},%{_mandir}/man1}

+ install -p -m 755 arch/*/bin/ksh %{buildroot}%{_bindir}/ksh93

+ install -p -m 755 arch/*/bin/shcomp %{buildroot}%{_bindir}/shcomp

+ install -p -m 644 arch/*/man/man1/sh.1 %{buildroot}%{_mandir}/man1/ksh93.1

+ mkdir -p %{buildroot}%{_sysconfdir}/skel

+ install -p -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/skel/.kshrc

+ install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/kshrc

+ install -p -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/binfmt.d/kshcomp.conf

+ 

+ ln -s %{_bindir}/ksh93 %{buildroot}/%{_bindir}/rksh

+ 

+ touch %{buildroot}%{_bindir}/ksh

+ touch %{buildroot}%{_mandir}/man1/ksh.1.gz

+ 

+ %check

+ [ -f ./skipcheck -o -f ./../skipcheck ] && exit 0 ||:

+ %if 0%{?rhel} > 6

+ %ifarch s390

+ exit 0

+ %endif

+ %endif

+ 

+ export SHELL=$(ls $(pwd)/arch/*/bin/ksh)

+ cd src/cmd/ksh93/tests/

+ ulimit -c unlimited

+ if [ ! -e /dev/fd ]

  then

-     mv %{buildroot}/%{_mandir}/man1/ksh.1.gz %{buildroot}/%{_mandir}/man1/ksh93.1.gz

- else

-     mv %{buildroot}/%{_mandir}/man1/ksh.1 %{buildroot}/%{_mandir}/man1/ksh93.1

+   echo "ERROR: /dev/fd does not exist, regression tests skipped"

+   exit 0

+ fi

+ $SHELL ./shtests 2>&1 | tee testresults.log

+ ls core.* 2>/dev/null ||:

+ exit 0

+ sed -e '/begins at/d' -e '/ 0 error/d' -e 's/at [^\[]*\[/\[/' testresults.log -e '/tests skipped/d' >filteredresults.log

+ if ! cmp filteredresults.log %{SOURCE5} >/dev/null || ls core.*

+ then

+   echo "Regression tests failed"

+   diff -Naurp %{SOURCE5} filteredresults.log

+   exit -1

  fi

- 

- install -p -D -m 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/binfmt.d/kshcomp.conf

- install -p -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/kshrc

- install -p -D -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/skel/.kshrc

  

  %post

- for s in /bin/ksh /usr/bin/ksh

- do

-   if [ ! -f /etc/shells ]; then

-         echo "$s" > /etc/shells

-   else

-         if ! grep -q '^'"$s"'$' /etc/shells ; then

-                 echo "$s" >> /etc/shells

+ if [ ! -f /etc/shells ]; then

+         echo "/bin/ksh" > /etc/shells

+         echo "/usr/bin/ksh" >> /etc/shells

+ else

+         if ! grep -q '^/bin/ksh$' /etc/shells ; then

+                 echo "/bin/ksh" >> /etc/shells

          fi

-   fi

- done

+         if ! grep -q '^/usr/bin/ksh$' /etc/shells ; then

+                 echo "/usr/bin/ksh" >> /etc/shells

+         fi

+ fi

+ 

+ %{_sbindir}/alternatives --install %{_bindir}/ksh ksh \

+                 %{_bindir}/ksh93 50 \

+         --slave %{_mandir}/man1/ksh.1.gz ksh-man \

+                 %{_mandir}/man1/ksh93.1.gz

+ 

+ #if not symlink we are updating ksh where there was no alternatives before

+ #so replace with symlink and set alternatives

+ if [ ! -L %{_bindir}/ksh ]; then

+         %{_sbindir}/alternatives --auto ksh

+         ln -sf /etc/alternatives/ksh %{_bindir}/ksh

+         ln -sf /etc/alternatives/ksh-man %{_mandir}/man1/ksh.1.gz

+ fi

  

  /bin/systemctl try-restart systemd-binfmt.service >/dev/null 2>&1 || :

  

- # Suppress any error encountered while upgrading from ksh-20120801-250

- %{_sbindir}/alternatives --install /bin/ksh ksh \

-             /bin/ksh93 50 \

-     --slave %{_mandir}/man1/ksh.1.gz ksh-man \

-             %{_mandir}/man1/ksh93.1.gz \

-     --slave /bin/shcomp shcomp93 \

-             /bin/shcomp93 2>/dev/null

+ %postun

+ if [ ! -f /bin/ksh ]; then

+     sed -i '/^\/bin\/ksh$/ d' /etc/shells

+ fi

+ if [ ! -f /usr/bin/ksh ]; then

+     sed -i '/^\/usr\/bin\/ksh$/ d' /etc/shells

+ fi

  

  %preun

- # Do not remove ksh from alternatives on upgrades

- if [ $1 -eq 0 ]; then

-     %{_sbindir}/alternatives --remove ksh /bin/ksh93

+ if [ $1 = 0 ]; then

+         %{_sbindir}/alternatives --remove ksh %{_bindir}/ksh93

  fi

  

- %postun

- for s in /bin/ksh /usr/bin/ksh

- do

-   if [ ! -f $s ]; then

- 	sed -i '\|^'"$s"'$|d' /etc/shells

-   fi

- done

- 

- # ksh-20120801-250 did not use alternatives, so while upgrading ensure that

- # alternatives are set correctly

- %triggerpostun -- ksh < 1:2020.0.0-0.1

- %{_sbindir}/alternatives --auto ksh

+ %verifyscript

+ echo -n "Looking for ksh in /etc/shells... "

+ if ! grep '^/bin/ksh$' /etc/shells > /dev/null; then

+     echo "missing"

+     echo "ksh missing from /etc/shells" >&2

+ else

+     echo "found"

+ fi

  

  %files 

  %doc src/cmd/ksh93/COMPATIBILITY src/cmd/ksh93/RELEASE src/cmd/ksh93/TYPES 

  # LICENSE file is missing, temporarily?

  %{_bindir}/ksh93

- %{_bindir}/shcomp93

+ %ghost %{_bindir}/ksh

+ %{_bindir}/rksh

+ %{_bindir}/shcomp

  %{_mandir}/man1/*

+ %ghost %{_mandir}/man1/ksh.1.gz

  %config(noreplace) %{_sysconfdir}/skel/.kshrc

  %config(noreplace) %{_sysconfdir}/kshrc

  %config(noreplace) %{_sysconfdir}/binfmt.d/kshcomp.conf

  

  %changelog

+ * Thu Aug 13 2020 Siteshwar Vashisht <svashisht@redhat.com> - 2:20120801-251

+ - Restore ksh to version 20120801

+   Resolves: #1868715

+ 

  * Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:2020.0.0-4

  - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild

  

file modified
+2 -1
@@ -1,1 +1,2 @@ 

- SHA512 (ksh-2020.0.0.tar.gz) = 7d6da3af341a62718d691ddc52e10bdf3b7290d74f1cd01610093c587af47b6d6d04b74b210eb31f93a3559855a5bc5155f9b188d2f8bb4444042c26bfaf1792

+ 3a6e2d01b1b049bdef968dc5a24c1ea7  ast-ksh.2012-08-01.tgz

+ af699318bea7398f0f413b839bfcd762  INIT.2012-08-01.tgz

rebased onto 74f768b

3 years ago

rebased onto 2c49a53

3 years ago

rebased onto 29dc296

3 years ago

rebased onto 642af4d

3 years ago

Pull-Request has been merged by svashisht

3 years ago
Changes Summary 76
+0 -3
file changed
.gitignore
+11
file added
ksh-20070328-builtins.patch
+47
file added
ksh-20080202-manfix.patch
+20
file added
ksh-20100202-pathvar.patch
+54
file added
ksh-20100621-fdstatus.patch
+12
file added
ksh-20100621-manfix3.patch
+68
file added
ksh-20100826-fixregr.patch
+22
file added
ksh-20120801-F_dupfd_cloexec.patch
+33
file added
ksh-20120801-alarmifs.patch
+150
file added
ksh-20120801-annocheck.patch
+13
file added
ksh-20120801-argvfix.patch
+20
file added
ksh-20120801-assoc-unset-leak.patch
+22
file added
ksh-20120801-badgcc.patch
+21
file added
ksh-20120801-ccflags.patch
+14
file added
ksh-20120801-cdfix.patch
+25
file added
ksh-20120801-cdfix2.patch
+12
file added
ksh-20120801-cdfix3.patch
+40
file added
ksh-20120801-cdfork.patch
+58
file added
ksh-20120801-covsfix.patch
+57
file added
ksh-20120801-covsfix2.patch
+64
file added
ksh-20120801-crash.patch
+52
file added
ksh-20120801-cve-2019-14868.patch
+19
file added
ksh-20120801-dotdoublefree.patch
+11
file added
ksh-20120801-emptyarrayinit.patch
+72
file added
ksh-20120801-fd2lost.patch
+11
file added
ksh-20120801-filecomsubst.patch
+12
file added
ksh-20120801-forkbomb.patch
+12
file added
ksh-20120801-fununset.patch
+38
file added
ksh-20120801-glibc-build-fix.patch
+32
file added
ksh-20120801-heresub.patch
+74
file added
ksh-20120801-iso8859.patch
+11
file added
ksh-20120801-jobwait-sigstop.patch
+12
file added
ksh-20120801-kia.patch
+66
file added
ksh-20120801-kshmfix.patch
+56
file added
ksh-20120801-lexfix.patch
+26
file added
ksh-20120801-locking.patch
+178
file added
ksh-20120801-macro.patch
+12
file added
ksh-20120801-manfix4.patch
+15
file added
ksh-20120801-mb-after-argvar.patch
+37
file added
ksh-20120801-memlik.patch
+76
file added
ksh-20120801-memlik3.patch
+34
file added
ksh-20120801-mlikfiks.patch
+12
file added
ksh-20120801-mtty.patch
+40
file added
ksh-20120801-noexeccdfix.patch
+11
file added
ksh-20120801-nohupfork.patch
+11
file added
ksh-20120801-nomulti.patch
+12
file added
ksh-20120801-nv_open-memcmp.patch
+95
file added
ksh-20120801-oldenvinit.patch
+26
file added
ksh-20120801-parserfix.patch
+24
file added
ksh-20120801-posix-exit.patch
+14
file added
ksh-20120801-retfix.patch
+505
file added
ksh-20120801-rmdirfix.patch
+12
file added
ksh-20120801-roundit.patch
+79
file added
ksh-20120801-sh_iovalidfd.patch
+14
file added
ksh-20120801-subshell-jobwait.patch
+20
file added
ksh-20120801-subshell-leak.patch
+11
file added
ksh-20120801-sufix.patch
+12
file added
ksh-20120801-syntax-error.patch
+18
file added
ksh-20120801-tabfix.patch
+12
file added
ksh-20120801-tpstl.patch
+98
file added
ksh-20120801-trapcom.patch
+16
file added
ksh-20120801-typeset.patch
+17
file added
ksh-20120801-unset-param.patch
+11
file added
ksh-20120801-validate-fd.patch
+29
file added
ksh-20120801-xufix.patch
+21
file added
ksh-20130214-fixkill.patch
+15
file added
ksh-20130613-cdfix4.patch
+58
file added
ksh-20130628-longer.patch
+12
file added
ksh-20140301-fikspand.patch
+37
file added
ksh-20140415-hokaido.patch
+11
file added
ksh-20140801-arraylen.patch
+21
file added
ksh-20140801-diskfull.patch
+52
file added
ksh-20140929-safefd.patch
-78
file removed
ksh-2020.0.0-cve-2019-14868.patch
+334 -70
file changed
ksh.spec
+2 -1
file changed
sources