diff options
author | ACB <ansas.bogdan@rwth-aachen.de> | 2023-02-12 14:05:48 +0100 |
---|---|---|
committer | ACB <ansas.bogdan@rwth-aachen.de> | 2023-03-15 19:36:07 +0100 |
commit | 345f5757e56e28a3a25465dcd84b8ddc674315b9 (patch) | |
tree | 00cb0a1990d3a865bd63c68ea23a7a96214c682c /drivers/windows | |
parent | 1d0e7f0222e2f6da16bea959a4170ac754110d56 (diff) | |
download | redot-engine-345f5757e56e28a3a25465dcd84b8ddc674315b9.tar.gz |
Create a safe temporary file with is_backup_save_enabled
Diffstat (limited to 'drivers/windows')
-rw-r--r-- | drivers/windows/file_access_windows.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index ea40622afc..174d9dd842 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -130,10 +130,16 @@ Error FileAccessWindows::open_internal(const String &p_path, int p_mode_flags) { if (is_backup_save_enabled() && p_mode_flags == WRITE) { save_path = path; - path = path + ".tmp"; + // Create a temporary file in the same directory as the target file. + WCHAR tmpFileName[MAX_PATH]; + if (GetTempFileNameW((LPCWSTR)(path.get_base_dir().utf16().get_data()), (LPCWSTR)(path.get_file().utf16().get_data()), 0, tmpFileName) == 0) { + last_error = ERR_FILE_CANT_OPEN; + return last_error; + } + path = tmpFileName; } - f = _wfsopen((LPCWSTR)(path.utf16().get_data()), mode_string, _SH_DENYNO); + f = _wfsopen((LPCWSTR)(path.utf16().get_data()), mode_string, is_backup_save_enabled() ? _SH_SECURE : _SH_DENYNO); if (f == nullptr) { switch (errno) { @@ -178,10 +184,10 @@ void FileAccessWindows::_close() { if (!PathFileExistsW((LPCWSTR)(save_path.utf16().get_data()))) { #endif // Creating new file - rename_error = _wrename((LPCWSTR)((save_path + ".tmp").utf16().get_data()), (LPCWSTR)(save_path.utf16().get_data())) != 0; + rename_error = _wrename((LPCWSTR)(path.utf16().get_data()), (LPCWSTR)(save_path.utf16().get_data())) != 0; } else { // Atomic replace for existing file - rename_error = !ReplaceFileW((LPCWSTR)(save_path.utf16().get_data()), (LPCWSTR)((save_path + ".tmp").utf16().get_data()), nullptr, 2 | 4, nullptr, nullptr); + rename_error = !ReplaceFileW((LPCWSTR)(save_path.utf16().get_data()), (LPCWSTR)(path.utf16().get_data()), nullptr, 2 | 4, nullptr, nullptr); } if (rename_error) { attempts--; |