awk: do not allow $(-1)

function                                             old     new   delta
EMSG_NEGATIVE_FIELD                                    -      25     +25
evaluate                                            3390    3403     +13
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/0 up/down: 38/0)               Total: 38 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-23 10:53:18 +02:00
parent c21dfaf836
commit 2454e678cb
2 changed files with 9 additions and 0 deletions

View File

@ -598,6 +598,7 @@ static const char EMSG_NOT_ARRAY[] ALIGN1 = "Not an array";
static const char EMSG_POSSIBLE_ERROR[] ALIGN1 = "Possible syntax error"; static const char EMSG_POSSIBLE_ERROR[] ALIGN1 = "Possible syntax error";
static const char EMSG_UNDEF_FUNC[] ALIGN1 = "Call to undefined function"; static const char EMSG_UNDEF_FUNC[] ALIGN1 = "Call to undefined function";
static const char EMSG_NO_MATH[] ALIGN1 = "Math support is not compiled in"; static const char EMSG_NO_MATH[] ALIGN1 = "Math support is not compiled in";
static const char EMSG_NEGATIVE_FIELD[] ALIGN1 = "Access to negative field";
static void zero_out_var(var *vp) static void zero_out_var(var *vp)
{ {
@ -2949,6 +2950,8 @@ static var *evaluate(node *op, var *res)
case XC( OC_FIELD ): { case XC( OC_FIELD ): {
int i = (int)getvar_i(R.v); int i = (int)getvar_i(R.v);
if (i < 0)
syntax_error(EMSG_NEGATIVE_FIELD);
if (i == 0) { if (i == 0) {
res = intvar[F0]; res = intvar[F0];
} else { } else {

View File

@ -339,5 +339,11 @@ testing "awk handles invalid for loop" \
"awk '{ for() }' 2>&1" "awk: cmd. line:1: Unexpected token\n" "" "" "awk '{ for() }' 2>&1" "awk: cmd. line:1: Unexpected token\n" "" ""
# testing "description" "command" "result" "infile" "stdin" # testing "description" "command" "result" "infile" "stdin"
testing 'awk negative field access' \
'awk 2>&1 -- '\''{ $(-1) }'\' \
"awk: cmd. line:1: Access to negative field\n" \
'' \
'anything'
exit $FAILCOUNT exit $FAILCOUNT