forked from qt-creator/qt-creator
C++: Fix crash after triggering completion and closing editor
Fix use-after-free for the following case:
1. Open an editor
2. Trigger a long processing completion
(e.g. simulate with QThread::msleep in
CppCompletionAssistInterface::getCppSpecifics)
3. ...and immediately close the editor (e.g. with Ctrl+W)
4. Wait until it crashes.
The completion thread relied on the BuiltinEditorDocumentParser object,
which is deleted once the editor is closed. Fixed by sharing the
ownership of that object between the *EditorDocumentProcessor and the
completion assist interface.
This case came up when doing tests for the bug report below.
Task-number: QTCREATORBUG-14991
Change-Id: I0b009229e68fc6b7838740858cdc41a32403fe6f
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
@@ -910,7 +910,7 @@ void CppToolsPlugin::test_modelmanager_precompiled_headers()
|
||||
QCOMPARE(Core::DocumentModel::openedDocuments().size(), 1);
|
||||
QVERIFY(mm->isCppEditor(editor));
|
||||
|
||||
auto *parser = BuiltinEditorDocumentParser::get(fileName);
|
||||
auto parser = BuiltinEditorDocumentParser::get(fileName);
|
||||
QVERIFY(parser);
|
||||
BaseEditorDocumentParser::Configuration config = parser->configuration();
|
||||
config.usePrecompiledHeaders = true;
|
||||
@@ -994,7 +994,7 @@ void CppToolsPlugin::test_modelmanager_defines_per_editor()
|
||||
QVERIFY(mm->isCppEditor(editor));
|
||||
|
||||
const QString filePath = editor->document()->filePath().toString();
|
||||
BaseEditorDocumentParser *parser = BaseEditorDocumentParser::get(filePath);
|
||||
const auto parser = BaseEditorDocumentParser::get(filePath);
|
||||
BaseEditorDocumentParser::Configuration config = parser->configuration();
|
||||
config.editorDefines = editorDefines.toUtf8();
|
||||
parser->setConfiguration(config);
|
||||
|
||||
Reference in New Issue
Block a user