diff options
author | Dongmei Wang <dongmei.wang@qt.io> | 2017-07-25 13:11:04 -0700 |
---|---|---|
committer | Dongmei Wang <dongmei.wang@qt.io> | 2017-07-27 21:31:28 +0000 |
commit | aca9c93fa06e266dd44a74410eb129bdbc719607 (patch) | |
tree | c9cc19c374bf522cbfa84ecfff43668213950215 | |
parent | 763b0a68beb3b1502f6f4c1b979f0a576fc9980b (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>
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 7 |
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) |