From d739e9b6a832caa5729f3d77aaf3017b0c1fb867 Mon Sep 17 00:00:00 2001 From: pooryorick Date: Thu, 1 Nov 2018 20:10:06 +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 2491c2f..01be0fc 100644 --- a/generic/tclOO.c +++ b/generic/tclOO.c @@ -1057,7 +1057,6 @@ TclOOReleaseClassContents( if (IsRootClass(oPtr) && !Deleted(fPtr->objectCls->thisPtr)) { Tcl_DeleteCommandFromToken(interp, fPtr->objectCls->thisPtr->command); } - oPtr->classPtr = NULL; } /* @@ -1183,7 +1182,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) { @@ -1384,6 +1385,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 b4ff283..3e8dd11 100644 --- a/generic/tclOODefineCmds.c +++ b/generic/tclOODefineCmds.c @@ -1449,6 +1449,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