Browse Source

Avoid write mode when opening save files

pull/7697/head
staphen 1 year ago committed by Anders Jenbo
parent
commit
6456691a3c
  1. 29
      Source/mpq/mpq_writer.cpp

29
Source/mpq/mpq_writer.cpp

@ -92,17 +92,26 @@ MpqWriter::MpqWriter(const char *path)
LogVerbose("Opening {}", path);
std::string error;
bool exists = FileExists(path);
const char *mode = "wbx";
if (exists) {
mode = "r+b";
if (!GetFileSize(path, &size_)) {
error = R"(GetFileSize failed: "{}")";
LogError(error, path, std::strerror(errno));
goto on_error;
}
LogVerbose("GetFileSize(\"{}\") = {}", path, size_);
if (!exists) {
// FileExists() may return false in the case of an error
// so we use "ab" instead of "wb" to avoid accidentally
// truncating an existing file
stream_.Open(path, "ab");
// However, we cannot actually use a file handle that was
// opened in "ab" mode because we need to be able to seek
// and write to the middle of the file
stream_.Close();
}
if (!stream_.Open(path, mode)) {
if (!GetFileSize(path, &size_)) {
error = R"(GetFileSize failed: "{}")";
LogError(error, path, std::strerror(errno));
goto on_error;
}
LogVerbose("GetFileSize(\"{}\") = {}", path, size_);
if (!stream_.Open(path, "r+b")) {
stream_.Close();
error = "Failed to open file";
goto on_error;

Loading…
Cancel
Save