summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2010-11-09 16:26:30 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2010-11-09 16:26:30 (GMT)
commit4d87c9384732b96a6df2c2c5f0ab765137c8c130 (patch)
tree73b5bad088e94faf68d908c447ecc2886e903f6e
parentd7713341347e9aaeab071ffb6d697e221219cabb (diff)
downloadtcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.zip
tcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.tar.gz
tcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.tar.bz2
Fix [Bug 3105999]; deallocate temporary structure.
-rw-r--r--ChangeLog4
-rw-r--r--generic/tclOOMethod.c15
2 files changed, 14 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 5ab9ee2..a5b8807 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
2010-11-09 Donal K. Fellows <dkf@users.sf.net>
- * tests/oo.test: Various tests for memory leaks.
+ * generic/tclOOMethod.c (ProcedureMethodVarResolver): [Bug 3105999]:
+ * tests/oo.test: Make sure that resolver structures that are
+ only temporarily needed get squelched.
2010-11-05 Jan Nijtmans <nijtmans@users.sf.net>
diff --git a/generic/tclOOMethod.c b/generic/tclOOMethod.c
index 1255f1d..61aeb12 100644
--- a/generic/tclOOMethod.c
+++ b/generic/tclOOMethod.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclOOMethod.c,v 1.28 2010/09/26 14:16:26 msofer Exp $
+ * RCS: @(#) $Id: tclOOMethod.c,v 1.29 2010/11/09 16:26:30 dkf Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -929,7 +929,7 @@ ProcedureMethodVarResolver(
Tcl_Var *varPtr)
{
int result;
- Tcl_ResolvedVarInfo *rPtr;
+ Tcl_ResolvedVarInfo *rPtr = NULL;
result = ProcedureMethodCompiledVarResolver(interp, varName,
strlen(varName), contextNs, &rPtr);
@@ -939,6 +939,14 @@ ProcedureMethodVarResolver(
}
*varPtr = rPtr->fetchProc(interp, rPtr);
+
+ /*
+ * Must not retain reference to resolved information. [Bug 3105999]
+ */
+
+ if (rPtr != NULL) {
+ rPtr->deleteProc(rPtr);
+ }
return (*varPtr? TCL_OK : TCL_CONTINUE);
}
@@ -956,8 +964,6 @@ ProcedureMethodCompiledVarConnect(
int i, isNew, cacheIt, varLen, len;
const char *match, *varName;
- varName = TclGetStringFromObj(infoPtr->variableObj, &varLen);
-
/*
* Check that the variable is being requested in a context that is also a
* method call; if not (i.e. we're evaluating in the object's namespace or
@@ -984,6 +990,7 @@ ProcedureMethodCompiledVarConnect(
* either.
*/
+ varName = TclGetStringFromObj(infoPtr->variableObj, &varLen);
if (contextPtr->callPtr->chain[contextPtr->index]
.mPtr->declaringClassPtr != NULL) {
FOREACH(variableObj, contextPtr->callPtr->chain[contextPtr->index]