Page MenuHomePhabricator

ArgsManager: return path by value from GetBlocksDirPath()
ClosedPublic

Authored by Fabien on Oct 26 2024, 12:09.

Details

Reviewers
PiRK
Group Reviewers
Restricted Project
Commits
rABC3ab65b20c797: ArgsManager: return path by value from GetBlocksDirPath()
Summary
`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()`.

Partial backport of core#29040:
https://github.com/bitcoin/bitcoin/pull/29040/commits/856c88776f8486446602476a1c9e133ac0cff510

Test Plan

With Clang 18:

ninja all check