summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornijtmans@users.sourceforge.net <jan.nijtmans>2013-01-03 09:46:57 (GMT)
committernijtmans@users.sourceforge.net <jan.nijtmans>2013-01-03 09:46:57 (GMT)
commit1aadee4441bc13b5b4c2d6c4fea564d91282f15c (patch)
tree16df47ff0c9462b72d6c4f1a1094e4ed9b149948
parent72a0c22658e03f3c3addfcac620f998859b08ee7 (diff)
parentc6b82cb34b585579c8434e6d9954ddd8304686fc (diff)
downloadtcl-1aadee4441bc13b5b4c2d6c4fea564d91282f15c.zip
tcl-1aadee4441bc13b5b4c2d6c4fea564d91282f15c.tar.gz
tcl-1aadee4441bc13b5b4c2d6c4fea564d91282f15c.tar.bz2
test case for bug-3598580: Tcl_ListObjReplace may release deleted elements too early
-rw-r--r--generic/tclTestObj.c11
-rw-r--r--tests/listObj.test4
2 files changed, 15 insertions, 0 deletions
diff --git a/generic/tclTestObj.c b/generic/tclTestObj.c
index 7494beb..4bddc42 100644
--- a/generic/tclTestObj.c
+++ b/generic/tclTestObj.c
@@ -963,6 +963,17 @@ TestobjCmd(
}
SetVarToObj(varPtr, destIndex, varPtr[varIndex]);
Tcl_SetObjResult(interp, varPtr[destIndex]);
+ } else if (strcmp(subCmd, "bug3598580") == 0) {
+ Tcl_Obj *listObjPtr, *elemObjPtr;
+ if (objc != 2) {
+ goto wrongNumArgs;
+ }
+ elemObjPtr = Tcl_NewIntObj(123);
+ listObjPtr = Tcl_NewListObj(1, &elemObjPtr);
+ /* Replace the single list element through itself, nonsense but legal. */
+ Tcl_ListObjReplace(interp, listObjPtr, 0, 1, 1, &elemObjPtr);
+ Tcl_SetObjResult(interp, listObjPtr);
+ return TCL_OK;
} else if (strcmp(subCmd, "convert") == 0) {
const char *typeName;
diff --git a/tests/listObj.test b/tests/listObj.test
index 8b24aa9..937fb1d 100644
--- a/tests/listObj.test
+++ b/tests/listObj.test
@@ -196,6 +196,10 @@ test listobj-10.1 {Bug [2971669]} {*}{
-result {{a b c d e} {} {a b c d e f}}
}
+test listobj-11.1 {bug 3598580} {
+ testobj bug3598580
+} 123
+
# cleanup
::tcltest::cleanupTests
return