awk: do not allow $(-1)
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 23 Apr 2018 08:53:18 +0000 (10:53 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 23 Apr 2018 08:53:18 +0000 (10:53 +0200)
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>
editors/awk.c
testsuite/awk.tests

index d54249bfd1894c211054c4e01acc693125f0f92f..bafc9ba1d382b6bbb2651469aefd12b1161625b5 100644 (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_UNDEF_FUNC[] ALIGN1 = "Call to undefined function";
 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)
 {
@@ -2949,6 +2950,8 @@ static var *evaluate(node *op, var *res)
 
                case XC( OC_FIELD ): {
                        int i = (int)getvar_i(R.v);
+                       if (i < 0)
+                               syntax_error(EMSG_NEGATIVE_FIELD);
                        if (i == 0) {
                                res = intvar[F0];
                        } else {
index ad0583afbbe8033be71759119efe0e96e7bcbda8..3933fefc9d510755d1ceb2d18730dd932ceb6da6 100755 (executable)
@@ -339,5 +339,11 @@ testing "awk handles invalid for loop" \
     "awk '{ for() }' 2>&1" "awk: cmd. line:1: Unexpected token\n" "" ""
 
 # 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