From 66f1759b6f993c237b9652b9aa51ac9df52e5238 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Tue, 13 May 2014 19:04:09 +0200 Subject: Ensure that all children of a collapsed folder are removed Before this patch, any (direct or indirect) children that might have been in m_pendingItemsToInsert, i.e., that were not inserted into the model yet because KDirLister had not finished listing the directory yet, would be added to the model later without a proper parent. This could cause a crash later on. CCBUG: 332102 FIXED-IN: 4.13.2 --- src/kitemviews/kfileitemmodel.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/kitemviews/kfileitemmodel.cpp') diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index a0f9305cb..34a97de4c 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -486,6 +486,18 @@ bool KFileItemModel::setExpanded(int index, bool expanded) m_urlsToExpand.insert(url); } } else { + // Note that there might be (indirect) children of the folder which is to be collapsed in + // m_pendingItemsToInsert. To prevent that they will be inserted into the model later, + // possibly without a parent, which might result in a crash, we insert all pending items + // right now. All new items which would be without a parent will then be removed. + dispatchPendingItemsToInsert(); + + // Check if the index of the collapsed folder has changed. If that is the case, then items + // were inserted before the collapsed folder, and its index needs to be updated. + if (m_itemData.at(index)->item != item) { + index = this->index(item); + } + m_expandedDirs.remove(targetUrl); m_dirLister->stop(url); -- cgit v1.3 From 99e8f8e2e6b6982d1a58185d0980be203d6061ec Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Tue, 13 May 2014 19:06:42 +0200 Subject: Stop listing children of collapsed folders Before this patch, KDirLister would continue listing any children of collapsed folders, even though the children themselves were removed from the model. This could lead to new items being inserted as top-level items at some later point, because no parent could be found for them. This inconsistent model state could lead to a crash later on. Many thanks to Martin Koller for helping to debug this problem! BUG: 332102 REVIEW: 118055 FIXED-IN: 4.13.2 --- src/kitemviews/kfileitemmodel.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/kitemviews/kfileitemmodel.cpp') diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 34a97de4c..de3c3eb22 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -512,7 +512,9 @@ bool KFileItemModel::setExpanded(int index, bool expanded) ItemData* itemData = m_itemData.at(childIndex); if (itemData->values.value("isExpanded").toBool()) { const KUrl targetUrl = itemData->item.targetUrl(); + const KUrl url = itemData->item.url(); m_expandedDirs.remove(targetUrl); + m_dirLister->stop(url); // TODO: try to unit-test this, see https://bugs.kde.org/show_bug.cgi?id=332102#c11 expandedChildren.append(targetUrl); } ++childIndex; -- cgit v1.3