Browse Source

Avoid write mode when opening save files

pull/7696/head
staphen 1 year ago committed by Anders Jenbo
parent
commit
a4f38d5dd4
  1. 33
      Source/mpq/mpq_writer.cpp

33
Source/mpq/mpq_writer.cpp

@ -93,19 +93,28 @@ MpqWriter::MpqWriter(const char *path)
LogVerbose("Opening {}", path);
std::string error;
bool exists = FileExists(path);
const char *mode = "wbx";
if (exists) {
mode = "r+b";
std::uintmax_t fileSize;
if (!GetFileSize(path, &fileSize)) {
error = R"(GetFileSize failed: "{}")";
LogError(error, path, std::strerror(errno));
goto on_error;
}
size_ = static_cast<uint32_t>(fileSize);
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)) {
std::uintmax_t fileSize;
if (!GetFileSize(path, &fileSize)) {
error = R"(GetFileSize failed: "{}")";
LogError(error, path, std::strerror(errno));
goto on_error;
}
size_ = static_cast<uint32_t>(fileSize);
LogVerbose("GetFileSize(\"{}\") = {}", path, size_);
if (!stream_.Open(path, "r+b")) {
stream_.Close();
error = "Failed to open file";
goto on_error;

Loading…
Cancel
Save