Hello, In my understanding the reason why texec had to be static was because the struct member ioact was never initialised. The call tree is execute() -> comexec() -> exchild() -> execute() and a fork happens in exchild(). The second execute() dereferences t->ioact on line 115 which causes SEGV. Setting ioact to NULL explicitly seems better than doing this via "static". Does this work for you?
- Michael Index: exec.c =================================================================== RCS file: /cvs/src/bin/ksh/exec.c,v retrieving revision 1.68 diff -u -p -u -r1.68 exec.c --- exec.c 11 Dec 2016 17:49:19 -0000 1.68 +++ exec.c 18 Dec 2017 07:05:47 -0000 @@ -409,7 +409,7 @@ comexec(struct op *t, struct tbl *volati volatile int rv = 0; char *cp; char **lastp; - static struct op texec; /* Must be static (XXX but why?) */ + struct op texec; int type_flags; int keepasn_ok; int fcflags = FC_BI|FC_FUNC|FC_PATH; @@ -688,6 +688,7 @@ comexec(struct op *t, struct tbl *volati texec.left = t; /* for tprint */ texec.str = tp->val.s; texec.args = ap; + texec.ioact = NULL; rv = exchild(&texec, flags, xerrok, -1); break; }