aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2011-05-31 23:05:18 +0300
committerArnold D. Robbins <arnold@skeeve.com>2011-05-31 23:05:18 +0300
commit7c21fd7d7528b0be01ff030f820c5fe7fc242a41 (patch)
treec15cb23b5aecd7ee9e4d0c7a139d7112795cdc42 /main.c
parentc2efba1b80559c475a74622d16aa7361fa566251 (diff)
downloadegawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.gz
egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.bz2
egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.zip
Disallow gawk builtin/keyword as variable assignment.
Diffstat (limited to 'main.c')
-rw-r--r--main.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/main.c b/main.c
index 034de705..b30924b6 100644
--- a/main.c
+++ b/main.c
@@ -1137,6 +1137,7 @@ arg_assign(char *arg, int initing)
NODE *var;
NODE *it;
NODE **lhs;
+ long save_FNR;
if (! initing && disallow_var_assigns)
return FALSE; /* --exec */
@@ -1155,6 +1156,12 @@ arg_assign(char *arg, int initing)
*cp++ = '\0';
+ /* avoid false source indications in a fatal message */
+ source = NULL;
+ sourceline = 0;
+ save_FNR = FNR;
+ FNR = 0;
+
/* first check that the variable name has valid syntax */
badvar = FALSE;
if (! isalpha((unsigned char) arg[0]) && arg[0] != '_')
@@ -1174,6 +1181,15 @@ arg_assign(char *arg, int initing)
lintwarn(_("`%s' is not a variable name, looking for file `%s=%s'"),
arg, arg, cp);
} else {
+ if (check_special(arg) >= 0)
+ fatal(_("cannot use gawk builtin `%s' as variable name"), arg);
+
+ if (! initing) {
+ var = lookup(arg);
+ if (var != NULL && var->type == Node_func)
+ fatal(_("cannot use function `%s' as variable name"), arg);
+ }
+
/*
* BWK awk expands escapes inside assignments.
* This makes sense, so we do it too.
@@ -1214,7 +1230,7 @@ arg_assign(char *arg, int initing)
if (! initing)
*--cp = '='; /* restore original text of ARGV */
-
+ FNR = save_FNR;
return ! badvar;
}