From aca9c93fa06e266dd44a74410eb129bdbc719607 Mon Sep 17 00:00:00 2001 From: Dongmei Wang Date: Tue, 25 Jul 2017 13:11:04 -0700 Subject: QFileDialog: Fix a crash occurring when deleting a file A crash has been observed on Windows in the use case below: 1) In a non-native QFileDialog, select a file and press "Del" key to delete it, and a warning message box appears for user to confirm the deletion. 2) Delete the file in the Windows Explorer. 3) Click "Yes" on the warning message box, a crash happens In QFileDialog::_q_deleteCurrent(), use QPersistentModelIndex instead of QModelIndex to ensure that the index is valid to be deleted. The change is intended to fix . The patch is to use QPersistentModelIndex instead of QModelIndex in QFileDialog::_q_deleteCurrent() to ensure that the index is valid to be deleted. Change-Id: I8959124dc071f7cf0ab47f954d611211a789978d Reviewed-by: Friedemann Kleint --- src/widgets/dialogs/qfiledialog.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index b638adeaec..b953c63569 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -3417,7 +3417,7 @@ void QFileDialogPrivate::_q_deleteCurrent() QModelIndexList list = qFileDialogUi->listView->selectionModel()->selectedRows(); for (int i = list.count() - 1; i >= 0; --i) { - QModelIndex index = list.at(i); + QPersistentModelIndex index = list.at(i); if (index == qFileDialogUi->listView->rootIndex()) continue; @@ -3443,12 +3443,15 @@ void QFileDialogPrivate::_q_deleteCurrent() QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) return; + // the event loop has run, we have to validate if the index is valid because the model might have removed it. + if (!index.isValid()) + return; + #else if (!(p & QFile::WriteUser)) return; #endif // QT_CONFIG(messagebox) - // the event loop has run, we can NOT reuse index because the model might have removed it. if (isDir) { if (!removeDirectory(filePath)) { #if QT_CONFIG(messagebox) -- cgit v1.2.3