summaryrefslogtreecommitdiffstats
path: root/drivers/unix
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2023-03-18 20:13:11 +0200
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2023-03-18 20:28:30 +0200
commitca58a5d56f45709ff2860471de14130a6cfa9c13 (patch)
tree8e7e9b82618e9ba7e18ffe3d558471fbd684ff65 /drivers/unix
parenta7d0e18a317085068c43be29bca1d280d03423a2 (diff)
downloadredot-engine-ca58a5d56f45709ff2860471de14130a6cfa9c13.tar.gz
Fix Unix temp file creations when using is_backup_save_enabled.
Diffstat (limited to 'drivers/unix')
-rw-r--r--drivers/unix/file_access_unix.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index 12b11da10a..3c2f36c7c0 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -102,14 +102,26 @@ Error FileAccessUnix::open_internal(const String &p_path, int p_mode_flags) {
save_path = path;
// Create a temporary file in the same directory as the target file.
path = path + "-XXXXXX";
- if (!mkstemp(path.utf8().ptrw())) {
- return ERR_FILE_CANT_OPEN;
+ CharString cs = path.utf8();
+ int fd = mkstemp(cs.ptrw());
+ if (fd == -1) {
+ last_error = ERR_FILE_CANT_OPEN;
+ return last_error;
}
- path = path + ".tmp";
+ path = String::utf8(cs.ptr());
+
+ f = fdopen(fd, mode_string);
+ if (f == nullptr) {
+ // Delete temp file and close descriptor if open failed.
+ ::unlink(cs.ptr());
+ ::close(fd);
+ last_error = ERR_FILE_CANT_OPEN;
+ return last_error;
+ }
+ } else {
+ f = fopen(path.utf8().get_data(), mode_string);
}
- f = fopen(path.utf8().get_data(), mode_string);
-
if (f == nullptr) {
switch (errno) {
case ENOENT: {