aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2017-08-05 12:33:39 +1000
committerSteve Bennett <steveb@workware.net.au>2017-08-07 20:36:40 +1000
commitbbe51b64485764195f4fa3be4dee240fb6b66e34 (patch)
tree6aa0da35f468724b1c9a566576e91aabf213400d
parent028dd5dd2f58456e27cd6c54b1539fc16406bc9a (diff)
downloadjimtcl-bbe51b64485764195f4fa3be4dee240fb6b66e34.zip
jimtcl-bbe51b64485764195f4fa3be4dee240fb6b66e34.tar.gz
jimtcl-bbe51b64485764195f4fa3be4dee240fb6b66e34.tar.bz2
expr: Fix refcount issue converting invalid boolean
Reported-by: Ryan Whitworth <me@ryanwhitworth.com> Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c18
-rw-r--r--regtest.tcl5
2 files changed, 17 insertions, 6 deletions
diff --git a/jim.c b/jim.c
index cf9b758..ea70d35 100644
--- a/jim.c
+++ b/jim.c
@@ -8240,17 +8240,23 @@ static int ExprBool(Jim_Interp *interp, Jim_Obj *obj)
long l;
double d;
int b;
+ int ret = -1;
+
+ /* In case the object is interp->result with refcount 1*/
+ Jim_IncrRefCount(obj);
if (Jim_GetLong(interp, obj, &l) == JIM_OK) {
- return l != 0;
+ ret = (l != 0);
}
- if (Jim_GetDouble(interp, obj, &d) == JIM_OK) {
- return d != 0;
+ else if (Jim_GetDouble(interp, obj, &d) == JIM_OK) {
+ ret = (d != 0);
}
- if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) {
- return b != 0;
+ else if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) {
+ ret = (b != 0);
}
- return -1;
+
+ Jim_DecrRefCount(interp, obj);
+ return ret;
}
static int JimExprOpAnd(Jim_Interp *interp, struct JimExprNode *node)
diff --git a/regtest.tcl b/regtest.tcl
index 0833b39..a46b849 100644
--- a/regtest.tcl
+++ b/regtest.tcl
@@ -345,6 +345,11 @@ puts "TEST 49 PASSED"
catch {expr {>>-$x}}
puts "TEST 50 PASSED"
+# REGTEST 51
+# expr convert invalid value to boolean
+catch {expr {2 && "abc$"}}
+puts "TEST 51 PASSED"
+
# TAKE THE FOLLOWING puts AS LAST LINE
puts "--- ALL TESTS PASSED ---"