summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorDongmei Wang <dongmei.wang@qt.io>2017-07-25 13:11:04 -0700
committerDongmei Wang <dongmei.wang@qt.io>2017-07-27 21:31:28 +0000
commitaca9c93fa06e266dd44a74410eb129bdbc719607 (patch)
treec9cc19c374bf522cbfa84ecfff43668213950215 /src/widgets
parent763b0a68beb3b1502f6f4c1b979f0a576fc9980b (diff)
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 <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp7
1 files 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)