76b1d02
diff -up ksh-20120801/src/cmd/ksh93/sh/macro.c.orig ksh-20120801/src/cmd/ksh93/sh/macro.c
76b1d02
--- ksh-20120801/src/cmd/ksh93/sh/macro.c.orig	2013-12-09 13:13:22.153525239 +0100
76b1d02
+++ ksh-20120801/src/cmd/ksh93/sh/macro.c	2013-12-09 13:20:58.144635385 +0100
96f2657
@@ -391,7 +391,7 @@ void sh_machere(Shell_t *shp,Sfio_t *inf
96f2657
 				break;
96f2657
 			    }
96f2657
 			    case S_PAR:
96f2657
-				comsubst(mp,(Shnode_t*)0,1);
96f2657
+				comsubst(mp,(Shnode_t*)0,3);
96f2657
 				break;
96f2657
 			    case S_EOF:
96f2657
 				if((c=fcfill()) > 0)
96f2657
@@ -1165,7 +1165,7 @@ retry1:
96f2657
 	    case S_PAR:
96f2657
 		if(type)
96f2657
 			goto nosub;
96f2657
-		comsubst(mp,(Shnode_t*)0,1);
96f2657
+		comsubst(mp,(Shnode_t*)0,3);
96f2657
 		return(1);
96f2657
 	    case S_DIG:
96f2657
 		var = 0;
76b1d02
@@ -2152,10 +2152,12 @@ static void comsubst(Mac_t *mp,register
76b1d02
 	mp->ifsp = nv_getval(np);
76b1d02
 	stkset(stkp,savptr,savtop);
76b1d02
 	newlines = 0;
76b1d02
-	if(type/*==3 - don't break `` vs $() */ && mp->shp->spid)
76b1d02
+	if(type==3 && mp->shp->spid)
76b1d02
 	{
76b1d02
 		job_wait(mp->shp->spid);
76b1d02
-		mp->shp->spid = 0;
76b1d02
+		if(mp->shp->pipepid==mp->shp->spid)
76b1d02
+			mp->shp->spid = 0;
76b1d02
+		mp->shp->pipepid = 0;
76b1d02
 	}
76b1d02
 	sfsetbuf(sp,(void*)sp,0);
76b1d02
 	bufsize = sfvalue(sp);
76b1d02
diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.anotherfix ksh-20120801/src/cmd/ksh93/sh/subshell.c
76b1d02
--- ksh-20120801/src/cmd/ksh93/sh/subshell.c.anotherfix	2014-01-20 14:43:46.410416327 +0100
76b1d02
+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-01-20 14:43:46.444416042 +0100
96f2657
@@ -122,7 +122,8 @@ void	sh_subtmpfile(Shell_t *shp)
96f2657
 		else if(errno!=EBADF)
96f2657
 			errormsg(SH_DICT,ERROR_system(1),e_toomany);
96f2657
 		/* popping a discipline forces a /tmp file create */
96f2657
-		sfdisc(sfstdout,SF_POPDISC);
96f2657
+		if(shp->comsub != 1)
96f2657
+			sfdisc(sfstdout,SF_POPDISC);
96f2657
 		if((fd=sffileno(sfstdout))<0)
96f2657
 		{
96f2657
 			/* unable to create the /tmp file so use a pipe */
76b1d02
diff -up ksh-20120801/src/cmd/ksh93/sh/xec.c.anotherfix ksh-20120801/src/cmd/ksh93/sh/xec.c
76b1d02
--- ksh-20120801/src/cmd/ksh93/sh/xec.c.anotherfix	2014-01-20 14:47:30.527524008 +0100
76b1d02
+++ ksh-20120801/src/cmd/ksh93/sh/xec.c	2014-01-20 14:47:30.563523703 +0100
76b1d02
@@ -1773,7 +1773,11 @@ int sh_exec(register const Shnode_t *t,
96f2657
 					if(shp->pipepid)
96f2657
 						shp->pipepid = parent;
96f2657
 					else
96f2657
+					{
96f2657
 						job_wait(parent);
96f2657
+						if(parent==shp->spid)
96f2657
+							shp->spid = 0;
96f2657
+					}
96f2657
 					if(shp->topfd > topfd)
96f2657
 						sh_iorestore(shp,topfd,0);
96f2657
 					if(usepipe && tsetio &&  subdup && unpipe)