summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2011-08-17 12:19:17 (GMT)
committerdgp <dgp@users.sourceforge.net>2011-08-17 12:19:17 (GMT)
commit1df484aa4e500a19662de2ddad6dcc4772ca71fa (patch)
tree47c34567a16b21be531baac5dc0e26ac3cbb79a9
parent5f6458590d2630066c197d4c91986c175c8820e3 (diff)
parent07e716801399c0843c58d8c3c6b43f183f1fd378 (diff)
downloadtcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.zip
tcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.tar.gz
tcl-1df484aa4e500a19662de2ddad6dcc4772ca71fa.tar.bz2
3392070 More complete prevention of Tcl_Obj reference cycles
when producing an intrep of ByteCode.
-rw-r--r--ChangeLog5
-rw-r--r--generic/tclCompile.c10
2 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b8832e6..567bfd2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-16 Don Porter <dgp@users.sourceforge.net>
+
+ * generic/tclCompile.c: [Bug 3392070] More complete prevention of
+ Tcl_Obj reference cycles when producing an intrep of ByteCode.
+
2011-08-16 Donal K. Fellows <dkf@users.sf.net>
* generic/tclListObj.c (TclLindexList, TclLsetFlat): Silence warnings
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index ae633ea..026503b 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -2449,8 +2449,16 @@ TclInitByteCodeObj(
* a value contains a literal which is that same value.
* If this is allowed to happen, refcount decrements may not
* reach zero, and memory may leak. Bugs 467523, 3357771
+ *
+ * NOTE: [Bugs 3392070, 3389764] We make a copy based completely
+ * on the string value, and do not call Tcl_DuplicateObj() so we
+ * can be sure we do not have any lingering cycles hiding in
+ * the intrep.
*/
- codePtr->objArrayPtr[i] = Tcl_DuplicateObj(objPtr);
+ int numBytes;
+ const char *bytes = Tcl_GetStringFromObj(objPtr, &numBytes);
+
+ codePtr->objArrayPtr[i] = Tcl_NewStringObj(bytes, numBytes);
Tcl_IncrRefCount(codePtr->objArrayPtr[i]);
Tcl_DecrRefCount(objPtr);
} else {