summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2017-05-03 11:27:52 +0200
committerNikolai Kosjar <nikolai.kosjar@qt.io>2017-05-03 10:36:35 +0000
commit3438b427191fdb686c8f4c9ed136046f162724f6 (patch)
tree6907381e35dd9866710e0ac456b1b378bf21066d
parentdb352bfc809dafbed1ed74b2268ee1bcc7fd4090 (diff)
downloadqt-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>
-rw-r--r--src/plugins/texteditor/codeassist/genericproposal.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/genericproposalmodel.cpp6
-rw-r--r--src/plugins/texteditor/codeassist/genericproposalmodel.h1
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