Skip to content

Commit

Permalink
Merge bitcoin#24308: util: use stronger-guarantee rename method
Browse files Browse the repository at this point in the history
ee822d8 util: use stronger-guarantee rename method (Vasil Dimov)

Pull request description:

  Use std::filesystem::rename() instead of std::rename(). We rely on the
  destination to be overwritten if it exists, but std::rename()'s behavior
  is implementation-defined in this case.

  This is a rebase of bitcoin#20435 by vasild.

ACKs for top commit:
  MarcoFalke:
    review ACK ee822d8
  hebasto:
    Approach ACK ee822d8.
  vasild:
    ACK ee822d8

Tree-SHA512: 8f65f154d235c2704f18008d9d40ced3c5d84e4d55653aa70bde345066b6083c84667b5a2f4d69eeaad0bec6c607645e21ddd2bf85617bdec4a2e33752e2059a
  • Loading branch information
MarcoFalke committed Feb 11, 2022
2 parents bcecde6 + ee822d8 commit b79c40b
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
11 changes: 4 additions & 7 deletions src/util/system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
#include <memory>
#include <optional>
#include <string>
#include <system_error>
#include <thread>
#include <typeinfo>

Expand Down Expand Up @@ -1061,13 +1062,9 @@ void ArgsManager::LogArgs() const

bool RenameOver(fs::path src, fs::path dest)
{
#ifdef WIN32
return MoveFileExW(src.wstring().c_str(), dest.wstring().c_str(),
MOVEFILE_REPLACE_EXISTING) != 0;
#else
int rc = std::rename(src.c_str(), dest.c_str());
return (rc == 0);
#endif /* WIN32 */
std::error_code error;
fs::rename(src, dest, error);
return !error;
}

/**
Expand Down
6 changes: 6 additions & 0 deletions src/util/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,13 @@ void DirectoryCommit(const fs::path &dirname);
bool TruncateFile(FILE *file, unsigned int length);
int RaiseFileDescriptorLimit(int nMinFD);
void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length);

/**
* Rename src to dest.
* @return true if the rename was successful.
*/
[[nodiscard]] bool RenameOver(fs::path src, fs::path dest);

bool LockDirectory(const fs::path& directory, const std::string lockfile_name, bool probe_only=false);
void UnlockDirectory(const fs::path& directory, const std::string& lockfile_name);
bool DirIsWritable(const fs::path& directory);
Expand Down

0 comments on commit b79c40b

Please sign in to comment.