From 150cc88db1aeccba4b28c587e8037a8424099f2b Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 8 Jun 2021 18:06:40 +0200 Subject: [PATCH] Don't leave m_rootProjectNode in moved-out state After calling FileApiReader::generateProjectTree(), the m_rootProjectNode was left in a moved-out state, meaning that it was in a corrupted state. However, it was still possible, that later FileApiReader::resetData() was called for the same instance of FileApiReader, so a call to m_rootProjectNode.reset() was executed on an invalid object. This might lead to a crash. The fix is to use std::exchange instead and we are leaving the m_rootProjectNode in a valid, default-constructed state. We do the same for other members, for consistency. Task-number: QTCREATORBUG-25837 Change-Id: I5812e410d11c8a3fd5a7c9db002d2ef244ae89cd Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/fileapireader.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index fa54381d69f..551b859c319 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -187,9 +187,7 @@ QSet FileApiReader::projectFilesToWatch() const QList FileApiReader::takeBuildTargets(QString &errorMessage){ Q_UNUSED(errorMessage) - auto result = std::move(m_buildTargets); - m_buildTargets.clear(); - return result; + return std::exchange(m_buildTargets, {}); } CMakeConfig FileApiReader::takeParsedConfiguration(QString &errorMessage) @@ -197,9 +195,7 @@ CMakeConfig FileApiReader::takeParsedConfiguration(QString &errorMessage) if (m_lastCMakeExitCode != 0) errorMessage = tr("CMake returned error code: %1").arg(m_lastCMakeExitCode); - CMakeConfig cache = m_cache; - m_cache.clear(); - return cache; + return std::exchange(m_cache, {}); } QString FileApiReader::ctestPath() const @@ -227,16 +223,14 @@ std::unique_ptr FileApiReader::generateProjectTree( addHeaderNodes(m_rootProjectNode.get(), m_knownHeaders, allFiles); } addFileSystemNodes(m_rootProjectNode.get(), allFiles); - return std::move(m_rootProjectNode); + return std::exchange(m_rootProjectNode, {}); } RawProjectParts FileApiReader::createRawProjectParts(QString &errorMessage) { Q_UNUSED(errorMessage) - RawProjectParts result = std::move(m_projectParts); - m_projectParts.clear(); - return result; + return std::exchange(m_projectParts, {}); } void FileApiReader::startState()