diff options
author | Gabriel de Dietrich <gabriel.dietrich-de@nokia.com> | 2011-02-15 10:19:26 (GMT) |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dietrich-de@nokia.com> | 2011-02-15 14:07:04 (GMT) |
commit | e340844bd614add505a39a3a6b915632476f6305 (patch) | |
tree | 39359464e4c5839bad36c3fea951950ea5310e7c /src | |
parent | 1c5596b514d3a590bd624c9e83606b435e5d4889 (diff) | |
download | Qt-e340844bd614add505a39a3a6b915632476f6305.zip Qt-e340844bd614add505a39a3a6b915632476f6305.tar.gz Qt-e340844bd614add505a39a3a6b915632476f6305.tar.bz2 |
Fix crash in KPackageKit
QTreeViewPrivate::itemHeight() may refer to an invalid QModelIndex
after calling QTreeView::indexRowSizeHint().
Same thing inside QTreeView::indexRowSizeHint(), since
QHeaderView::count() will call
QAbstractItemViewPrivate::executePostedLayout() which may invalidate
all the QModelIndex.
Reviewed-by: Olivier
Task-number: QTBUG-16292
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/itemviews/qtreeview.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index f1f3236..c0573bb 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2753,6 +2753,7 @@ int QTreeView::indexRowSizeHint(const QModelIndex &index) const int start = -1; int end = -1; + int indexRow = index.row(); int count = d->header->count(); bool emptyHeader = (count == 0); QModelIndex parent = index.parent(); @@ -2789,7 +2790,7 @@ int QTreeView::indexRowSizeHint(const QModelIndex &index) const int logicalColumn = emptyHeader ? column : d->header->logicalIndex(column); if (d->header->isSectionHidden(logicalColumn)) continue; - QModelIndex idx = d->model->index(index.row(), logicalColumn, parent); + QModelIndex idx = d->model->index(indexRow, logicalColumn, parent); if (idx.isValid()) { QWidget *editor = d->editorForIndex(idx).editor; if (editor && d->persistent.contains(editor)) { @@ -3224,14 +3225,14 @@ int QTreeViewPrivate::itemHeight(int item) const if (viewItems.isEmpty()) return 0; const QModelIndex &index = viewItems.at(item).index; + if (!index.isValid()) + return 0; int height = viewItems.at(item).height; - if (height <= 0 && index.isValid()) { + if (height <= 0) { height = q_func()->indexRowSizeHint(index); viewItems[item].height = height; } - if (!index.isValid() || height < 0) - return 0; - return height; + return qMax(height, 0); } |