summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclCmdMZ.c6
-rw-r--r--tests/cmdMZ.test18
2 files changed, 24 insertions, 0 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 2671d49..5eb854b 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -4812,18 +4812,24 @@ TryPostBody(
Tcl_Obj *varName;
Tcl_ListObjIndex(NULL, info[3], 0, &varName);
+ Tcl_IncrRefCount(varName);
if (Tcl_ObjSetVar2(interp, varName, NULL, resultObj,
TCL_LEAVE_ERR_MSG) == NULL) {
+ Tcl_DecrRefCount(varName);
Tcl_DecrRefCount(resultObj);
goto handlerFailed;
}
+ Tcl_DecrRefCount(varName);
Tcl_DecrRefCount(resultObj);
if (dummy > 1) {
Tcl_ListObjIndex(NULL, info[3], 1, &varName);
+ Tcl_IncrRefCount(varName);
if (Tcl_ObjSetVar2(interp, varName, NULL, options,
TCL_LEAVE_ERR_MSG) == NULL) {
+ Tcl_DecrRefCount(varName);
goto handlerFailed;
}
+ Tcl_DecrRefCount(varName);
}
} else {
/*
diff --git a/tests/cmdMZ.test b/tests/cmdMZ.test
index d79e9f6..dd299f1 100644
--- a/tests/cmdMZ.test
+++ b/tests/cmdMZ.test
@@ -409,6 +409,24 @@ test cmdMZ-6.10 {Tcl_TimeRateObjCmd: huge overhead cause 0us result} {
[expr {[lindex $m1 6] <= 0.001}]
} {1 1 1 1}
+test cmdMZ-try-1.0 {
+
+ fix for issue 45b9faf103f2
+
+ [try] interaction with local variable names produces segmentation violation
+
+} -body {
+ ::apply {{} {
+ eval {
+ try {
+ lindex 5
+ } on ok res {}
+ }
+ set res
+ }}
+} -result 5
+
+
# The tests for Tcl_WhileObjCmd are in while.test
# cleanup