From e2d299f77176b587e8995a54587bddf210af6560 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 2 Nov 2018 17:18:57 +0000 Subject: Fixed memory leak in TclOO.c:ObjectNamespaceDeleted, object mixins and object/class mutation. --- generic/tclOO.c | 9 +++++++-- generic/tclOODefineCmds.c | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/generic/tclOO.c b/generic/tclOO.c index 573df3e..39d3806 100644 --- a/generic/tclOO.c +++ b/generic/tclOO.c @@ -1035,7 +1035,6 @@ TclOOReleaseClassContents( if (IsRootClass(oPtr) && !Deleted(fPtr->objectCls->thisPtr)) { Tcl_DeleteCommandFromToken(interp, fPtr->objectCls->thisPtr->command); } - oPtr->classPtr = NULL; } /* @@ -1149,7 +1148,9 @@ ObjectNamespaceDeleted( TclOORemoveFromInstances(oPtr, mixinPtr); TclOODecrRefCount(mixinPtr->thisPtr); } - ckfree(oPtr->mixins.list); + if (oPtr->mixins.list != NULL) { + ckfree(oPtr->mixins.list); + } } FOREACH(filterObj, oPtr->filters) { @@ -1350,6 +1351,10 @@ TclOORemoveFromMixins( break; } } + if (oPtr->mixins.num == 0) { + ckfree(oPtr->mixins.list); + oPtr->mixins.list = NULL; + } return res; } diff --git a/generic/tclOODefineCmds.c b/generic/tclOODefineCmds.c index d5f4878..0271a43 100644 --- a/generic/tclOODefineCmds.c +++ b/generic/tclOODefineCmds.c @@ -1157,6 +1157,8 @@ TclOODefineClassObjCmd( TclOODeleteDescendants(interp, oPtr); oPtr->flags &= ~DONT_DELETE; TclOOReleaseClassContents(interp, oPtr); + ckfree(oPtr->classPtr); + oPtr->classPtr = NULL; } else if (!wasClass && willBeClass) { TclOOAllocClass(interp, oPtr); } -- cgit v0.12