aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-11-26 14:54:54 +1000
committerSteve Bennett <steveb@workware.net.au>2010-11-26 14:56:15 +1000
commit60dfb023c4afa95047e0fa8db49830ccb46446b2 (patch)
treefe6022b252e01fe61b5e95c86c4094e6458abc56
parent67cfaf5449800e49524377ccb61f6c8221f515dd (diff)
downloadjimtcl-60dfb023c4afa95047e0fa8db49830ccb46446b2.zip
jimtcl-60dfb023c4afa95047e0fa8db49830ccb46446b2.tar.gz
jimtcl-60dfb023c4afa95047e0fa8db49830ccb46446b2.tar.bz2
Bug fix: crash parsing invalid dict sugar
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c16
-rw-r--r--regtest.tcl5
2 files changed, 17 insertions, 4 deletions
diff --git a/jim.c b/jim.c
index b431e42..b2c0054 100644
--- a/jim.c
+++ b/jim.c
@@ -1327,6 +1327,7 @@ static int JimParseVar(struct JimParserCtx *pc)
/* Parse [dict get] syntax sugar. */
if (*pc->p == '(') {
int count = 1;
+ const char *paren = pc->p;
while (count && pc->len) {
pc->p++;
@@ -1342,11 +1343,18 @@ static int JimParseVar(struct JimParserCtx *pc)
count--;
}
}
- if (*pc->p != '\0') {
- pc->p++;
- pc->len--;
+ if (count == 0) {
+ if (*pc->p != '\0') {
+ pc->p++;
+ pc->len--;
+ }
+ ttype = JIM_TT_DICTSUGAR;
+ }
+ else {
+ /* Missing '(', so back up */
+ pc->len += pc->p - paren;
+ pc->p = paren;
}
- ttype = JIM_TT_DICTSUGAR;
}
pc->tend = pc->p - 1;
}
diff --git a/regtest.tcl b/regtest.tcl
index 08e6339..b9f3f00 100644
--- a/regtest.tcl
+++ b/regtest.tcl
@@ -105,6 +105,11 @@ catch {a $msg $opts(-errorinfo)}
proc a {} { rename a newa}
a
+# REGTEST 17
+# 26 Nov 2010 - crashes on invalid dict sugar
+catch {eval {$x(}}
+puts "TEST 17 PASSED"
+
# TAKE THE FOLLOWING puts AS LAST LINE
puts "--- ALL TESTS PASSED ---"