From 2428db2a3025c06b9c6b28a28c8375b35351f0f8 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 7 Mar 2024 07:01:54 +0100 Subject: [PATCH] TextEditor: Fix crash in SyntaxHighlighter The SyntaxHighlighterRunner is deleted by deleteLater in the TextDocument destructor. This makes it possible that the SyntaxHighlighter inside the runner lives longer than the document itself. Avoid this by making the document the parent of the SyntaxHighlighter like before the async highlighter patch series. Fixes: QTCREATORBUG-30494 Change-Id: I6ce9c35ab400b17f2a1a6f3c3bd98df23f41c71e Reviewed-by: Artem Sokolovskii --- .../texteditor/syntaxhighlighterrunner.cpp | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/plugins/texteditor/syntaxhighlighterrunner.cpp b/src/plugins/texteditor/syntaxhighlighterrunner.cpp index 1a649af5329..874f8254abf 100644 --- a/src/plugins/texteditor/syntaxhighlighterrunner.cpp +++ b/src/plugins/texteditor/syntaxhighlighterrunner.cpp @@ -35,11 +35,11 @@ public: if (async) { m_document = new QTextDocument(this); m_document->setDocumentLayout(new TextDocumentLayout(m_document)); - m_highlighter->setParent(m_document); } else { m_document = document; } + m_highlighter->setParent(m_document); m_highlighter->setDocument(m_document); connect(m_highlighter, @@ -66,45 +66,67 @@ public: void setExtraFormats(const QMap> &formatMap) { + QTC_ASSERT(m_highlighter, return); for (auto it = formatMap.cbegin(); it != formatMap.cend(); ++it) m_highlighter->setExtraFormats(m_document->findBlockByNumber(it.key()), it.value()); } void clearExtraFormats(const QList &blockNumbers) { + QTC_ASSERT(m_highlighter, return); for (auto it = blockNumbers.cbegin(); it != blockNumbers.cend(); ++it) m_highlighter->clearExtraFormats(m_document->findBlockByNumber(*it)); } - void clearAllExtraFormats() { m_highlighter->clearAllExtraFormats(); } + void clearAllExtraFormats() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->clearAllExtraFormats(); + } void setFontSettings(const TextEditor::FontSettings &fontSettings) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setFontSettings(fontSettings); } void setDefinitionName(const QString &name) { - return m_highlighter->setDefinitionName(name); + QTC_ASSERT(m_highlighter, return); + m_highlighter->setDefinitionName(name); } void setLanguageFeaturesFlags(unsigned int flags) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setLanguageFeaturesFlags(flags); } - void setEnabled(bool enabled) { m_highlighter->setEnabled(enabled); } + void setEnabled(bool enabled) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setEnabled(enabled); + } - void rehighlight() { m_highlighter->rehighlight(); } + void rehighlight() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->rehighlight(); + } void reformatBlocks(int from, int charsRemoved, int charsAdded) { + QTC_ASSERT(m_highlighter, return); m_highlighter->reformatBlocks(from, charsRemoved, charsAdded); } - void setInterrupted(bool interrupted) { m_highlighter->setInterrupted(interrupted); } + void setInterrupted(bool interrupted) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setInterrupted(interrupted); + } - SyntaxHighlighter *m_highlighter = nullptr; + QPointer m_highlighter = nullptr; QTextDocument *m_document = nullptr; signals: @@ -200,7 +222,6 @@ SyntaxHighlighterRunner::~SyntaxHighlighterRunner() m_thread->quit(); m_thread->wait(); } else { - delete d->m_highlighter; delete d; } }