aboutsummaryrefslogtreecommitdiffstats
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
parentc2efba1b80559c475a74622d16aa7361fa566251 (diff)
downloadegawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.gz
egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.tar.bz2
egawk-7c21fd7d7528b0be01ff030f820c5fe7fc242a41.zip
Disallow gawk builtin/keyword as variable assignment.
-rw-r--r--ChangeLog9
-rw-r--r--awkgram.c9
-rw-r--r--awkgram.y9
-rw-r--r--main.c18
-rw-r--r--re.c21
5 files changed, 50 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 28603eda..1772c68d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/awkgram.c b/awkgram.c
index b588bc80..4edec572 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -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;
}
diff --git a/awkgram.y b/awkgram.y
index d5b2a294..6b28b520 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -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;
}
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;
}
diff --git a/re.c b/re.c
index 1f220b3e..a617831a 100644
--- a/re.c
+++ b/re.c
@@ -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;
}