ArgsManager: return path by value from GetBlocksDirPath()

`ArgsManager::m_cached_blocks_path` is protected by
`ArgsManager::cs_args` and returning a reference to it after releasing
the mutex is unsafe.

To resolve this, return a copy of the path. This has some performance
penalty which is presumably ok, given that paths are a few 100s bytes
at most and `GetBlocksDirPath()` is not called often.

This silences the following (clang 18):

```
common/args.cpp:288:31: error: returning variable 'm_cached_blocks_path' by reference requires holding mutex 'cs_args' [-Werror,-Wthread-safety-reference-return]
  288 |     if (!path.empty()) return path;
      |                               ^
```

Do the same with
`ArgsManager::GetDataDir()`,
`ArgsManager::GetDataDirBase()` and
`ArgsManager::GetDataDirNet()`.
This commit is contained in:
Vasil Dimov 2023-11-02 13:20:17 +01:00 committed by MarcoFalke
parent fa3d9304e8
commit 856c88776f
2 changed files with 6 additions and 6 deletions

View file

@ -277,7 +277,7 @@ fs::path ArgsManager::GetPathArg(std::string arg, const fs::path& default_value)
return result.has_filename() ? result : result.parent_path(); return result.has_filename() ? result : result.parent_path();
} }
const fs::path& ArgsManager::GetBlocksDirPath() const fs::path ArgsManager::GetBlocksDirPath() const
{ {
LOCK(cs_args); LOCK(cs_args);
fs::path& path = m_cached_blocks_path; fs::path& path = m_cached_blocks_path;
@ -302,7 +302,7 @@ const fs::path& ArgsManager::GetBlocksDirPath() const
return path; return path;
} }
const fs::path& ArgsManager::GetDataDir(bool net_specific) const fs::path ArgsManager::GetDataDir(bool net_specific) const
{ {
LOCK(cs_args); LOCK(cs_args);
fs::path& path = net_specific ? m_cached_network_datadir_path : m_cached_datadir_path; fs::path& path = net_specific ? m_cached_network_datadir_path : m_cached_datadir_path;

View file

@ -215,21 +215,21 @@ protected:
* *
* @return Blocks path which is network specific * @return Blocks path which is network specific
*/ */
const fs::path& GetBlocksDirPath() const; fs::path GetBlocksDirPath() const;
/** /**
* Get data directory path * Get data directory path
* *
* @return Absolute path on success, otherwise an empty path when a non-directory path would be returned * @return Absolute path on success, otherwise an empty path when a non-directory path would be returned
*/ */
const fs::path& GetDataDirBase() const { return GetDataDir(false); } fs::path GetDataDirBase() const { return GetDataDir(false); }
/** /**
* Get data directory path with appended network identifier * Get data directory path with appended network identifier
* *
* @return Absolute path on success, otherwise an empty path when a non-directory path would be returned * @return Absolute path on success, otherwise an empty path when a non-directory path would be returned
*/ */
const fs::path& GetDataDirNet() const { return GetDataDir(true); } fs::path GetDataDirNet() const { return GetDataDir(true); }
/** /**
* Clear cached directory paths * Clear cached directory paths
@ -420,7 +420,7 @@ private:
* @param net_specific Append network identifier to the returned path * @param net_specific Append network identifier to the returned path
* @return Absolute path on success, otherwise an empty path when a non-directory path would be returned * @return Absolute path on success, otherwise an empty path when a non-directory path would be returned
*/ */
const fs::path& GetDataDir(bool net_specific) const; fs::path GetDataDir(bool net_specific) const;
/** /**
* Return -regtest/-signet/-testnet/-chain= setting as a ChainType enum if a * Return -regtest/-signet/-testnet/-chain= setting as a ChainType enum if a