Skip to content
Snippets Groups Projects
Commit 64c060e1 authored by Perttu Ahola's avatar Perttu Ahola
Browse files

filesys: safeWriteToFile(): Remove the target file before rename only on Windows

Removing the target file on other platforms was enabled likely unintentionally
by commit 5f1f1151.

This may be the reason why there has been corruption of files on Linux on hard
shutdowns.

Previously I described the problem and this fix in issue #3084.
parent 43c804a0
No related branches found
No related tags found
No related merge requests found
......@@ -693,13 +693,22 @@ bool safeWriteToFile(const std::string &path, const std::string &content)
os.flush();
os.close();
if (os.fail()) {
// Remove the temporary file because writing it failed and it's useless.
remove(tmp_file.c_str());
return false;
}
// Copy file
// Move the finished temporary file over the real file
#ifdef _WIN32
// On POSIX compliant systems rename() is specified to be able to swap the
// file in place of the destination file, making this a truly error-proof
// transaction.
// However, on Windows, the target file has to be removed first.
remove(path.c_str());
#endif
if(rename(tmp_file.c_str(), path.c_str())) {
// Remove the temporary file because moving it over the target file
// failed.
remove(tmp_file.c_str());
return false;
} else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment