From 402564c396b0f9fbd46d6f1ecd4d0b6f03362df7 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Sat, 11 Jul 2020 15:05:38 +0100 Subject: [PATCH] Fix lack of mutex locking in some GameCache methods --- src/api/game/game_cache.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/api/game/game_cache.cpp b/src/api/game/game_cache.cpp index a706d141..c9ad2521 100644 --- a/src/api/game/game_cache.cpp +++ b/src/api/game/game_cache.cpp @@ -36,11 +36,18 @@ using std::string; namespace loot { GameCache::GameCache() {} -GameCache::GameCache(const GameCache& cache) : - plugins_(cache.plugins_), - archivePaths_(cache.archivePaths_) {} +GameCache::GameCache(const GameCache& cache) { + lock_guard lock(mutex_); + lock_guard otherLock(cache.mutex_); + + plugins_ = cache.plugins_; + archivePaths_ = cache.archivePaths_; +} GameCache& GameCache::operator=(const GameCache& cache) { + lock_guard lock(mutex_); + lock_guard otherLock(cache.mutex_); + if (&cache != this) { plugins_ = cache.plugins_; archivePaths_ = cache.archivePaths_; @@ -50,6 +57,8 @@ GameCache& GameCache::operator=(const GameCache& cache) { } std::set> GameCache::GetPlugins() const { + lock_guard lock(mutex_); + std::set> output; std::transform( begin(plugins_), @@ -64,6 +73,8 @@ std::set> GameCache::GetPlugins() const { std::shared_ptr GameCache::GetPlugin( const std::string& pluginName) const { + lock_guard lock(mutex_); + auto it = plugins_.find(NormalizeFilename(pluginName)); if (it != end(plugins_)) return it->second; @@ -84,6 +95,8 @@ void GameCache::AddPlugin(const Plugin&& plugin) { } std::set GameCache::GetArchivePaths() const { + lock_guard lock(mutex_); + return archivePaths_; }