diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2011-05-31 23:05:18 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2011-05-31 23:05:18 +0300 |
commit | 7c21fd7d7528b0be01ff030f820c5fe7fc242a41 (patch) | |
tree | c15cb23b5aecd7ee9e4d0c7a139d7112795cdc42 /main.c | |
parent | c2efba1b80559c475a74622d16aa7361fa566251 (diff) | |
download | egawk-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.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -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; } |