From a531a1ec2dce97c1507a45abd4795b1aea1edc9e Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Thu, 23 May 2019 01:05:01 +0200 Subject: 44345: fix wordcode traversal where ! without a following command could result in a crash --- ChangeLog | 5 +++++ Src/text.c | 9 +++++++-- Test/A01grammar.ztst | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c67d53356..16a643e7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-05-23 Oliver Kiddle + + * 44345: Src/text.c, Test/A01grammar.ztst: fix wordcode traversal + where ! without a following command could result in a crash + 2019-05-20 Oliver Kiddle * 44307: Src/exec.c, Src/init.c, Src/params.c, Src/utils.c: diff --git a/Src/text.c b/Src/text.c index 3658b1bc6..a4191bf1a 100644 --- a/Src/text.c +++ b/Src/text.c @@ -470,8 +470,13 @@ gettext2(Estate state) " || " : " && "); s->code = *state->pc++; s->pop = (WC_SUBLIST_TYPE(s->code) == WC_SUBLIST_END); - if (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_NOT) - taddstr("! "); + if (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_NOT) { + if (WC_SUBLIST_SKIP(s->code) == 0) + stack = 1; + taddstr((stack || (!(WC_SUBLIST_FLAGS(s->code) & + WC_SUBLIST_SIMPLE) && wc_code(*state->pc) != + WC_PIPE)) ? "!" : "! "); + } if (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_COPROC) taddstr("coproc "); } diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst index 1ed3cb6b7..c8600d4cb 100644 --- a/Test/A01grammar.ztst +++ b/Test/A01grammar.ztst @@ -76,6 +76,39 @@ 0:Basic current shell list with error >false + fn() { : && ! ; : } + functions -x3 fn + fn +0:End of sublist containing ! with no command +>fn () { +> : && ! +> : +>} + + if [[ m -eq y ]]; then + : && ! + : + fi +0:! followed by no further commands + + fn() { ! {!} && ! (!) || ! {!} } + functions -x2 fn + fn +0:exclamation marks without following commands +>fn () { +> ! { +> ! +> } && ! ( +> ! +> ) || ! { +> ! +> } +>} + + ! | true +1:! followed by no command but by a pipe +?(eval):1: parse error near `|' + # # Tests for `Precommand Modifiers' # -- cgit 1.4.1