From 3d57a8490738d9febaa4496eba791e4fbfc91826 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 11 Jul 2021 12:00:31 +0200 Subject: [PATCH] awk: undo TI_PRINT, it introduced a bug (print with any redirect acting as printf) function old new delta evaluate 3329 3337 +8 Patch by Ron Yorston Signed-off-by: Denys Vlasenko --- editors/awk.c | 8 +++++--- testsuite/awk.tests | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/editors/awk.c b/editors/awk.c index 755e68fc7..0aa7c0804 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -462,8 +462,7 @@ static const uint32_t tokeninfo[] ALIGN4 = { 0, 0, /* \n */ ST_IF, ST_DO, ST_FOR, OC_BREAK, -#define TI_PRINT OC_PRINT - OC_CONTINUE, OC_DELETE|Rx, TI_PRINT, + OC_CONTINUE, OC_DELETE|Rx, OC_PRINT, OC_PRINTF, OC_NEXT, OC_NEXTFILE, OC_RETURN|Vx, OC_EXIT|Nx, ST_WHILE, @@ -2944,7 +2943,10 @@ static var *evaluate(node *op, var *res) F = rsm->F; } - if (opinfo == TI_PRINT) { + /* Can't just check 'opinfo == OC_PRINT' here, parser ORs + * additional bits to opinfos of print/printf with redirects + */ + if ((opinfo & OPCLSMASK) == OC_PRINT) { if (!op1) { fputs(getvar_s(intvar[F0]), F); } else { diff --git a/testsuite/awk.tests b/testsuite/awk.tests index 770d8ffce..6b23b91cb 100755 --- a/testsuite/awk.tests +++ b/testsuite/awk.tests @@ -450,4 +450,9 @@ testing "awk exit N propagates through END's exit" \ "42\n" \ '' '' +testing "awk print + redirect" \ + "awk 'BEGIN { print \"STDERR %s\" >\"/dev/stderr\" }' 2>&1" \ + "STDERR %s\n" \ + '' '' + exit $FAILCOUNT