From e8262ed9307726fe3311db3b338c63dcec4a8511 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Sat, 2 Dec 2023 12:02:40 +0100 Subject: [PATCH] CMakePM: Fix crash (potential) on CMakeParser::flush Use the Task copy for the inversal of the call stack. Amends edf4280bd97aceb692ead83ac30ecc6d49a93f6b Fixes: QTCREATORBUG-29965 Change-Id: I6119e03c75ff5a7d44f86e91cc93e6417fea1689 Reviewed-by: Eike Ziller Reviewed-by: --- .../cmakeprojectmanager/cmakeparser.cpp | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.cpp b/src/plugins/cmakeprojectmanager/cmakeparser.cpp index fed1a3ffa14..11e2dc721df 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeparser.cpp @@ -202,22 +202,25 @@ void CMakeParser::flush() if (m_lastTask.isNull()) return; - if (m_lastTask.summary.isEmpty() && !m_lastTask.details.isEmpty()) - m_lastTask.summary = m_lastTask.details.takeFirst(); - m_lines += m_lastTask.details.count(); + Task t = m_lastTask; + m_lastTask.clear(); + + if (t.summary.isEmpty() && !t.details.isEmpty()) + t.summary = t.details.takeFirst(); + m_lines += t.details.count(); if (m_callStack.has_value() && !m_callStack.value().isEmpty()) { - m_lastTask.file = m_callStack.value().last().file; - m_lastTask.line = m_callStack.value().last().line; + t.file = m_callStack.value().last().file; + t.line = m_callStack.value().last().line; LinkSpecs specs; - m_lastTask.details << QString(); - m_lastTask.details << Tr::tr("Call stack:"); + t.details << QString(); + t.details << Tr::tr("Call stack:"); m_lines += 2; m_callStack->push_front(m_errorOrWarningLine); - int offset = m_lastTask.details.join('\n').size(); + int offset = t.details.join('\n').size(); Utils::reverseForeach(m_callStack.value(), [&](const auto &line) { const QString fileAndLine = QString("%1:%2").arg(line.file.path()).arg(line.line); const QString completeLine = QString(" %1%2").arg(fileAndLine).arg(line.function); @@ -228,16 +231,14 @@ void CMakeParser::flush() int(fileAndLine.length()), createLinkTarget(line.file, line.line, -1)}); - m_lastTask.details << completeLine; + t.details << completeLine; offset += completeLine.length() - 2; ++m_lines; }); - setDetailsFormat(m_lastTask, specs); + setDetailsFormat(t, specs); } - Task t = m_lastTask; - m_lastTask.clear(); scheduleTask(t, m_lines, 1); m_lines = 0;