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 | |
parent | c2efba1b80559c475a74622d16aa7361fa566251 (diff) | |
download | egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.gz egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.bz2 egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.zip |
Disallow gawk builtin/keyword as variable assignment.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | awkgram.c | 9 | ||||
-rw-r--r-- | awkgram.y | 9 | ||||
-rw-r--r-- | main.c | 18 | ||||
-rw-r--r-- | re.c | 21 |
5 files changed, 50 insertions, 16 deletions
@@ -1,3 +1,12 @@ +Tue May 31 23:01:00 2011 John Haque <j.eh@mchsi.com> + + * re.c (check_bracket_exp): Use mem* routines instead of str* + for searching. + * main.c (arg_assign): Disallow builtin or user-defined function + as the name of a variable. + * awkgram.y (check_special): Rework so can be called from + arg_assign. + Tue May 31 22:23:41 2011 Arnold D. Robbins <arnold@skeeve.com> In order to attain the goal of having ranges act like they are @@ -6180,9 +6180,6 @@ retry: break_allowed++; if (tokentab[mid].flags & CONTINUE) continue_allowed++; - if ((do_traditional && (tokentab[mid].flags & GAWKX)) - || (do_posix && (tokentab[mid].flags & NOT_POSIX))) - goto out; switch (class) { case LEX_INCLUDE: @@ -8646,8 +8643,12 @@ check_special(const char *name) high = mid - 1; else if (i > 0) /* token > mid */ low = mid + 1; - else + else { + if ((do_traditional && (tokentab[mid].flags & GAWKX)) + || (do_posix && (tokentab[mid].flags & NOT_POSIX))) + return -1; return mid; + } } return -1; } @@ -3490,9 +3490,6 @@ retry: break_allowed++; if (tokentab[mid].flags & CONTINUE) continue_allowed++; - if ((do_traditional && (tokentab[mid].flags & GAWKX)) - || (do_posix && (tokentab[mid].flags & NOT_POSIX))) - goto out; switch (class) { case LEX_INCLUDE: @@ -5956,8 +5953,12 @@ check_special(const char *name) high = mid - 1; else if (i > 0) /* token > mid */ low = mid + 1; - else + else { + if ((do_traditional && (tokentab[mid].flags & GAWKX)) + || (do_posix && (tokentab[mid].flags & NOT_POSIX))) + return -1; return mid; + } } return -1; } @@ -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; } @@ -541,16 +541,20 @@ check_bracket_exp(char *s, size_t length) int i; int found = FALSE; char save; - char *sp, *sp2; + char *sp, *sp2, *end; int len; int count = 0; + if (length == 0) + return; + + end = s + length; save = s[length]; s[length] = '\0'; sp = s; again: - sp = sp2 = strchr(sp, '['); + sp = sp2 = memchr(sp, '[', (end - sp)); if (sp == NULL) goto done; @@ -569,8 +573,10 @@ again: warning(_("range of the form `[%c-%c]' is locale dependant"), sp[-1], sp[1]); } - if (count == 0) + if (count == 0) { + sp++; /* skip past ']' */ break; + } } if (count > 0) { /* bad regex, give up */ @@ -580,8 +586,11 @@ again: /* sp2 has start */ for (i = 0; classes[i].name != NULL; i++) { + if (classes[i].warned) + continue; len = classes[i].len; - if (strncmp(sp2, classes[i].name, len) == 0) { + if ( len == (sp - sp2) + && memcmp(sp2, classes[i].name, len) == 0) { found = TRUE; break; } @@ -593,9 +602,7 @@ again: classes[i].warned = TRUE; } - if (*sp != '\0') { - if (*sp == ']') - sp++; + if (*sp < end) { found = FALSE; goto again; } |