ntpd: default to FEATURE_NTP_AUTH=y
[oweals/busybox.git] / editors / awk.c
index 8f523ea28fbfedaa22499789bbd5bb77138088de..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 {
@@ -3149,7 +3152,7 @@ static rstream *next_input_file(void)
 }
 
 int awk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int awk_main(int argc, char **argv)
+int awk_main(int argc UNUSED_PARAM, char **argv)
 {
        unsigned opt;
        char *opt_F;
@@ -3218,7 +3221,7 @@ int awk_main(int argc, char **argv)
        }
        opt = getopt32(argv, OPTSTR_AWK, &opt_F, &list_v, &list_f, IF_FEATURE_AWK_GNU_EXTENSIONS(&list_e,) NULL);
        argv += optind;
-       argc -= optind;
+       //argc -= optind;
        if (opt & OPT_W)
                bb_error_msg("warning: option -W is ignored");
        if (opt & OPT_F) {
@@ -3255,15 +3258,14 @@ int awk_main(int argc, char **argv)
                if (!*argv)
                        bb_show_usage();
                parse_program(*argv++);
-               argc--;
        }
 
        /* fill in ARGV array */
-       setvar_i(intvar[ARGC], argc + 1);
        setari_u(intvar[ARGV], 0, "awk");
        i = 0;
        while (*argv)
                setari_u(intvar[ARGV], ++i, *argv++);
+       setvar_i(intvar[ARGC], i + 1);
 
        evaluate(beginseq.first, &tv);
        if (!mainseq.first && !endseq.first)