summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin B Kenny <kennykb@acm.org>2008-06-02 02:19:40 (GMT)
committerKevin B Kenny <kennykb@acm.org>2008-06-02 02:19:40 (GMT)
commit50928f540511857885e1a13fb17a9d0441346c98 (patch)
treeea58882d583beb270cd19a06b1fea4d4b11ad6f6
parentfe88072b187128153a10f1860ef4312d08254b9f (diff)
downloadtcl-50928f540511857885e1a13fb17a9d0441346c98.zip
tcl-50928f540511857885e1a13fb17a9d0441346c98.tar.gz
tcl-50928f540511857885e1a13fb17a9d0441346c98.tar.bz2
* generic/tclOO.c (ReleaseClassContents): Fix the one remaining
valgrind complaint about oo.test, caused by failing to protect the Object as well as the Class corresponding to a subclass being deleted and hence getting a freed-memory read when attempting to delete the class command. [Bug 1981001]
-rw-r--r--ChangeLog8
-rw-r--r--generic/tclOO.c6
2 files changed, 13 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index bd674eb..bc2e6d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-06-02 Kevin B. Kenny <kennykb@acm.org>
+
+ * generic/tclOO.c (ReleaseClassContents): Fix the one remaining
+ valgrind complaint about oo.test, caused by failing to protect
+ the Object as well as the Class corresponding to a subclass being
+ deleted and hence getting a freed-memory read when attempting to
+ delete the class command. [Bug 1981001]
+
2008-06-01 Donal K. Fellows <dkf@users.sf.net>
* generic/tclOOMethod.c (Tcl_NewMethod): Complete the fix of [Bug
diff --git a/generic/tclOO.c b/generic/tclOO.c
index ef939e8..f374876 100644
--- a/generic/tclOO.c
+++ b/generic/tclOO.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: tclOO.c,v 1.6 2008/05/31 23:35:27 das Exp $
+ * RCS: @(#) $Id: tclOO.c,v 1.7 2008/06/02 02:19:41 kennykb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -618,12 +618,14 @@ ReleaseClassContents(
clsPtr->mixinSubs.size = 0;
for (i=0 ; i<n ; i++) {
AddRef(list[i]);
+ AddRef(list[i]->thisPtr);
}
for (i=0 ; i<n ; i++) {
if (!(list[i]->thisPtr->flags & OBJECT_DELETED)) {
list[i]->thisPtr->flags |= OBJECT_DELETED;
Tcl_DeleteCommandFromToken(interp, list[i]->thisPtr->command);
}
+ DelRef(list[i]->thisPtr);
DelRef(list[i]);
}
if (list != NULL) {
@@ -637,12 +639,14 @@ ReleaseClassContents(
clsPtr->subclasses.size = 0;
for (i=0 ; i<n ; i++) {
AddRef(list[i]);
+ AddRef(list[i]->thisPtr);
}
for (i=0 ; i<n ; i++) {
if (!(list[i]->thisPtr->flags & OBJECT_DELETED)) {
list[i]->thisPtr->flags |= OBJECT_DELETED;
Tcl_DeleteCommandFromToken(interp, list[i]->thisPtr->command);
}
+ DelRef(list[i]->thisPtr);
DelRef(list[i]);
}
if (list != NULL) {