aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Foley <bpfoley@google.com>2016-10-15 14:45:40 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-10-24 02:09:56 +0200
commit61d5997b586a28f79d54b28ce6963b643dff6e9e (patch)
tree161fb8911ed9a5bda79d1a1f8ac34534aae40564
parent1336052a490ffe7a3790ee3c1366756ca8a7f5ca (diff)
downloadbusybox-w32-61d5997b586a28f79d54b28ce6963b643dff6e9e.tar.gz
busybox-w32-61d5997b586a28f79d54b28ce6963b643dff6e9e.tar.bz2
busybox-w32-61d5997b586a28f79d54b28ce6963b643dff6e9e.zip
awk: fix segfault on for loop syntax error
Parsing "for()" segfaults as awk fails to find loop iteration expressions. Signed-off-by: Brian Foley <bpfoley@google.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/awk.c2
-rwxr-xr-xtestsuite/awk.tests3
2 files changed, 4 insertions, 1 deletions
diff --git a/editors/awk.c b/editors/awk.c
index d0269b9f4..685e8bed8 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -1514,7 +1514,7 @@ static void chain_group(void)
1514 next_token(TC_SEQSTART); 1514 next_token(TC_SEQSTART);
1515 n2 = parse_expr(TC_SEMICOL | TC_SEQTERM); 1515 n2 = parse_expr(TC_SEMICOL | TC_SEQTERM);
1516 if (t_tclass & TC_SEQTERM) { /* for-in */ 1516 if (t_tclass & TC_SEQTERM) { /* for-in */
1517 if ((n2->info & OPCLSMASK) != OC_IN) 1517 if (!n2 || (n2->info & OPCLSMASK) != OC_IN)
1518 syntax_error(EMSG_UNEXP_TOKEN); 1518 syntax_error(EMSG_UNEXP_TOKEN);
1519 n = chain_node(OC_WALKINIT | VV); 1519 n = chain_node(OC_WALKINIT | VV);
1520 n->l.n = n2->l.n; 1520 n->l.n = n2->l.n;
diff --git a/testsuite/awk.tests b/testsuite/awk.tests
index adab4ae1e..82937bc10 100755
--- a/testsuite/awk.tests
+++ b/testsuite/awk.tests
@@ -316,6 +316,9 @@ testing "awk continue" \
316 "" \ 316 "" \
317 'BEGIN { if (1) continue; else a = 1 }' 317 'BEGIN { if (1) continue; else a = 1 }'
318 318
319testing "awk handles invalid for loop" \
320 "awk '{ for() }' 2>&1" "awk: cmd. line:1: Unexpected token\n" "" ""
321
319# testing "description" "command" "result" "infile" "stdin" 322# testing "description" "command" "result" "infile" "stdin"
320 323
321exit $FAILCOUNT 324exit $FAILCOUNT