diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2010-11-09 16:26:30 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2010-11-09 16:26:30 (GMT) |
commit | 4d87c9384732b96a6df2c2c5f0ab765137c8c130 (patch) | |
tree | 73b5bad088e94faf68d908c447ecc2886e903f6e | |
parent | d7713341347e9aaeab071ffb6d697e221219cabb (diff) | |
download | tcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.zip tcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.tar.gz tcl-4d87c9384732b96a6df2c2c5f0ab765137c8c130.tar.bz2 |
Fix [Bug 3105999]; deallocate temporary structure.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | generic/tclOOMethod.c | 15 |
2 files changed, 14 insertions, 5 deletions
@@ -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] |