Просмотр исходного кода

Fix Unix temp file creations when using is_backup_save_enabled.

bruvzg 2 лет назад
Родитель
Сommit
ca58a5d56f
1 измененных файлов с 17 добавлено и 5 удалено
  1. 17 5
      drivers/unix/file_access_unix.cpp

+ 17 - 5
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: {