diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-11-26 14:54:54 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-11-26 14:56:15 +1000 |
commit | 60dfb023c4afa95047e0fa8db49830ccb46446b2 (patch) | |
tree | fe6022b252e01fe61b5e95c86c4094e6458abc56 | |
parent | 67cfaf5449800e49524377ccb61f6c8221f515dd (diff) | |
download | jimtcl-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.c | 16 | ||||
-rw-r--r-- | regtest.tcl | 5 |
2 files changed, 17 insertions, 4 deletions
@@ -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 ---" |