summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2018-11-02 17:18:57 (GMT)
committerdgp <dgp@users.sourceforge.net>2018-11-02 17:18:57 (GMT)
commite2d299f77176b587e8995a54587bddf210af6560 (patch)
tree29b1c8abd99f4cdccd45d8d885ffbeaf80919fbc /generic
parent2577d3bd45bdf3d447208afa35b8610bd48d0674 (diff)
downloadtcl-e2d299f77176b587e8995a54587bddf210af6560.zip
tcl-e2d299f77176b587e8995a54587bddf210af6560.tar.gz
tcl-e2d299f77176b587e8995a54587bddf210af6560.tar.bz2
Fixed memory leak in TclOO.c:ObjectNamespaceDeleted, object mixins and
object/class mutation.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclOO.c9
-rw-r--r--generic/tclOODefineCmds.c2
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);
}