diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2017-05-03 11:27:52 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2017-05-03 10:36:35 +0000 |
commit | 3438b427191fdb686c8f4c9ed136046f162724f6 (patch) | |
tree | 6907381e35dd9866710e0ac456b1b378bf21066d | |
parent | db352bfc809dafbed1ed74b2268ee1bcc7fd4090 (diff) | |
download | qt-creator-3438b427191fdb686c8f4c9ed136046f162724f6.tar.gz |
CodeAssist: Fix use-after-free crash
...caused by
commit fab4dd068ed51f612e7beaf0985bcbe4411d2f01
CodeAssist: Fix auto completion if function signature is shown
The crash occurs when e.g. typing "lib" in a *.pro file.
Ensure to remove duplicates before filtering, otherwise the duplicates
are removed afterwards and leave dangling pointers in the already
filtered items (GenericProposalModel::m_currentItems).
Change-Id: If6f027378beea2386d25389e366047a29513b553
Reviewed-by: David Schulz <david.schulz@qt.io>
3 files changed, 9 insertions, 0 deletions
diff --git a/src/plugins/texteditor/codeassist/genericproposal.cpp b/src/plugins/texteditor/codeassist/genericproposal.cpp index 7d0105319c..5feac5810b 100644 --- a/src/plugins/texteditor/codeassist/genericproposal.cpp +++ b/src/plugins/texteditor/codeassist/genericproposal.cpp @@ -52,6 +52,8 @@ bool GenericProposal::isFragile() const bool GenericProposal::hasItemsToPropose(const QString &prefix, AssistReason reason) const { if (!prefix.isEmpty()) { + if (m_model->containsDuplicates()) + m_model->removeDuplicates(); m_model->filter(prefix); m_model->setPrefilterPrefix(prefix); } diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp index 34ed001823..3e2c8816ad 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp @@ -141,6 +141,7 @@ void GenericProposalModel::loadContent(const QList<AssistProposalItemInterface * { m_originalItems = items; m_currentItems = items; + m_duplicatesRemoved = false; for (int i = 0; i < m_originalItems.size(); ++i) m_idByText.insert(m_originalItems.at(i)->text(), i); } @@ -229,6 +230,9 @@ QString GenericProposalModel::detail(int index) const void GenericProposalModel::removeDuplicates() { + if (m_duplicatesRemoved) + return; + QHash<QString, quint64> unique; auto it = m_originalItems.begin(); while (it != m_originalItems.end()) { @@ -242,6 +246,8 @@ void GenericProposalModel::removeDuplicates() ++it; } } + + m_duplicatesRemoved = true; } void GenericProposalModel::filter(const QString &prefix) diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.h b/src/plugins/texteditor/codeassist/genericproposalmodel.h index 538ed81712..32cfd008a8 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.h +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.h @@ -78,5 +78,6 @@ private: QHash<QString, int> m_idByText; QList<AssistProposalItemInterface *> m_originalItems; QString m_prefilterPrefix; + bool m_duplicatesRemoved = false; }; } // TextEditor |