[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

kdenonbeta/kdedebian/kapture



CVS commit by mornfall: 

- fix a double-free bug, caused by the fact that m_item deletes all it's
  children, while we deleted also all the m_items manually, in
  descend-recursion order (so the parent first triggered the delete of
  all m_items in a subtree and then individual nodes delete their respective
  m_items again)


  M +3 -3      libcapture/tree.cpp   1.10
  M +20 -11    libkapture/listtreewidget.h   1.6


--- kdenonbeta/kdedebian/kapture/libcapture/tree.cpp  #1.9:1.10
@@ -221,8 +221,8 @@ void Tree::refresh ()
 void Tree::clear ()
 {
-    if (m_root)
         delete m_root;
-    // m_feed = 0;
     m_root = 0;
+    delete m_stash;
+    m_stash = 0;
 }
 

--- kdenonbeta/kdedebian/kapture/libkapture/listtreewidget.h  #1.5:1.6
@@ -26,4 +26,5 @@ namespace capture {
 namespace kapture {
     using namespace capture;
+    class KListViewItemCustom;
 
     class ListTreeWidget: public KListView, public Tree
@@ -42,17 +43,7 @@ namespace kapture {
             TreeNode *stash () { return m_stash; };
     };
-    class KListViewItemCustom: public KListViewItem
-    {
-        public:
-            TreeNode *m_treeNode;
-            KListViewItemCustom (KListView *v, TreeNode *n)
-                : KListViewItem (v), m_treeNode (n)
-            {};
-            KListViewItemCustom (KListViewItem *i, TreeNode *n)
-                : KListViewItem (i), m_treeNode (n)
-            {};
-    };
     class ListTreeWidgetItem: virtual public TreeNode
     {
+        friend class KListViewItemCustom;
         public:
             ListTreeWidgetItem (ListTreeWidget *list, TreeNode *parent);
@@ -65,4 +56,22 @@ namespace kapture {
             TreeNode *m_itemParent;
     };
+    class KListViewItemCustom: public KListViewItem
+    {
+        public:
+            ListTreeWidgetItem *m_treeNode;
+            KListViewItemCustom (KListView *v, ListTreeWidgetItem *n)
+                : KListViewItem (v), m_treeNode (n)
+            {};
+            KListViewItemCustom (KListViewItem *i, ListTreeWidgetItem *n)
+                : KListViewItem (i), m_treeNode (n)
+            {};
+            virtual ~KListViewItemCustom ()
+            {
+                // *cough* our destructor will delete all m_treeNode childrens'
+                // m_item, meaning that these would go and double-delete them
+                if (m_treeNode)
+                    m_treeNode -> m_item = 0;
+            }
+    };
     class ListTreeWidgetGItem: virtual public ListTreeWidgetItem, virtual public TreeGroupNode
     {




Reply to: