mirror of
https://github.com/moparisthebest/minetest
synced 2024-08-13 16:53:49 -04:00
filesys: safeWriteToFile(): Remove the target file before rename only on Windows
Removing the target file on other platforms was enabled likely unintentionally
by commit 5f1f1151d3
.
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.
This commit is contained in:
parent
43c804a00b
commit
64c060e1f2
@ -693,13 +693,22 @@ bool safeWriteToFile(const std::string &path, const std::string &content)
|
|||||||
os.flush();
|
os.flush();
|
||||||
os.close();
|
os.close();
|
||||||
if (os.fail()) {
|
if (os.fail()) {
|
||||||
|
// Remove the temporary file because writing it failed and it's useless.
|
||||||
remove(tmp_file.c_str());
|
remove(tmp_file.c_str());
|
||||||
return false;
|
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());
|
remove(path.c_str());
|
||||||
|
#endif
|
||||||
if(rename(tmp_file.c_str(), path.c_str())) {
|
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());
|
remove(tmp_file.c_str());
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user