Currently, our ksh/sh accepts things like:
while do done
which cannot be interrupted via ^C by default.
If, However, the expression is not empty everything is fine. E.g.
while :; do done
Most other shells require a non-empty expression which avoids this
problem (zsh is the outlier here). AT&T ksh and other shells also
require a non-empty loop body so I've added a check for that too.
So now the expression has to be at least:
while :; do :; done
There are other places we could tighten up the syntax checking but
I'll leave that for someone else ;-)
The new behavior is:
$ while do done
ksh: syntax error: `do' unexpected
$ while :; do done
ksh: syntax error: `done' unexpected
Which is similar to the error produced by bash and AT&T ksh.
The ksh regress still passes.
- todd
Index: bin/ksh/syn.c
===================================================================
RCS file: /cvs/src/bin/ksh/syn.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 syn.c
--- bin/ksh/syn.c 24 Apr 2018 08:25:16 -0000 1.39
+++ bin/ksh/syn.c 2 Jul 2021 18:14:21 -0000
@@ -331,7 +331,11 @@ get_command(int cf)
nesting_push(&old_nesting, c);
t = newtp((c == WHILE) ? TWHILE : TUNTIL);
t->left = c_list(true);
+ if (t->left == NULL)
+ syntaxerr(NULL);
t->right = dogroup();
+ if (t->right == NULL)
+ syntaxerr(NULL);
nesting_pop(&old_nesting);
break;