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;
}