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 {