summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2018-11-01 20:10:06 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2018-11-01 20:10:06 (GMT)
commitd739e9b6a832caa5729f3d77aaf3017b0c1fb867 (patch)
tree04ecbf6c28938c7d491b7c03cd06e2896305e063
parent3788abb994534d04420c18ac71f18ad05fd98b88 (diff)
downloadtcl-d739e9b6a832caa5729f3d77aaf3017b0c1fb867.zip
tcl-d739e9b6a832caa5729f3d77aaf3017b0c1fb867.tar.gz
tcl-d739e9b6a832caa5729f3d77aaf3017b0c1fb867.tar.bz2
Fixed memory leak in TclOO.c:ObjectNamespaceDeleted, object mixins and
object/class mutation.
-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 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);
}