From 9d7b0541206085d37b2aacef57a1a8fc37db4b7b Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 6 Nov 2015 16:50:02 +0100 Subject: [PATCH] CppTools: Fix potential race condition ...when acessing m_headerPaths, m_projectFiles or m_definedMacros from different threads. ensureUpdated() locked the mutex before writing the variables, but reading them happened with an unlocked mutex. Change-Id: I4951fd58f1939e4e50534a018dd600004789668e Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppmodelmanager.cpp | 18 ++++++++++++------ src/plugins/cpptools/cppmodelmanager.h | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 61e87cf7a92..f82f414aeea 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -384,9 +384,9 @@ bool CppModelManager::replaceDocument(Document::Ptr newDoc) return true; } +/// Make sure that m_projectMutex is locked when calling this. void CppModelManager::ensureUpdated() { - QMutexLocker locker(&d->m_projectMutex); if (!d->m_dirty) return; @@ -475,8 +475,7 @@ void CppModelManager::dumpModelManagerConfiguration(const QString &logFileId) dumper.dumpProjectInfos(projectInfos()); dumper.dumpSnapshot(globalSnapshot, globalSnapshotTitle, /*isGlobalSnapshot=*/ true); dumper.dumpWorkingCopy(workingCopy()); - ensureUpdated(); - dumper.dumpMergedEntities(d->m_headerPaths, d->m_definedMacros); + dumper.dumpMergedEntities(headerPaths(), definedMacros()); } QSet CppModelManager::abstractEditorSupports() const @@ -941,12 +940,12 @@ QList CppModelManager::projectPartFromDependencies( return parts.values(); } -ProjectPart::Ptr CppModelManager::fallbackProjectPart() const +ProjectPart::Ptr CppModelManager::fallbackProjectPart() { ProjectPart::Ptr part(new ProjectPart); - part->projectDefines = d->m_definedMacros; - part->headerPaths = d->m_headerPaths; + part->projectDefines = definedMacros(); + part->headerPaths = headerPaths(); part->languageVersion = ProjectPart::CXX14; // Do not activate ObjectiveCExtensions since this will lead to the @@ -1259,24 +1258,31 @@ CppIndexingSupport *CppModelManager::indexingSupport() QStringList CppModelManager::projectFiles() { + QMutexLocker locker(&d->m_projectMutex); ensureUpdated(); + return d->m_projectFiles; } ProjectPart::HeaderPaths CppModelManager::headerPaths() { + QMutexLocker locker(&d->m_projectMutex); ensureUpdated(); + return d->m_headerPaths; } void CppModelManager::setHeaderPaths(const ProjectPart::HeaderPaths &headerPaths) { + QMutexLocker locker(&d->m_projectMutex); d->m_headerPaths = headerPaths; } QByteArray CppModelManager::definedMacros() { + QMutexLocker locker(&d->m_projectMutex); ensureUpdated(); + return d->m_definedMacros; } diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index dd856582e59..e3f05640e0b 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -109,7 +109,7 @@ public: QList projectPartFromDependencies(const Utils::FileName &fileName) const; /// \return A synthetic \c ProjectPart which consists of all defines/includes/frameworks from /// all loaded projects. - ProjectPart::Ptr fallbackProjectPart() const; + ProjectPart::Ptr fallbackProjectPart(); CPlusPlus::Snapshot snapshot() const; Document::Ptr document(const QString &fileName) const;