Skip to content

Commit

Permalink
Fix memory leak when move to trash fails on Linux
Browse files Browse the repository at this point in the history
(cherry picked from commit 8be4983)
  • Loading branch information
timothyqiu authored and akien-mga committed Jan 25, 2022
1 parent 941879f commit f8afd16
Showing 1 changed file with 3 additions and 5 deletions.
8 changes: 3 additions & 5 deletions platform/x11/os_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3887,7 +3887,7 @@ Error OS_X11::move_to_trash(const String &p_path) {

// Create needed directories for decided trash can location.
{
DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
Error err = dir_access->make_dir_recursive(trash_path);

// Issue an error if trash can is not created proprely.
Expand All @@ -3896,7 +3896,6 @@ Error OS_X11::move_to_trash(const String &p_path) {
ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/files");
err = dir_access->make_dir_recursive(trash_path + "/info");
ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/info");
memdelete(dir_access);
}

// The trash can is successfully created, now we check that we don't exceed our file name length limit.
Expand Down Expand Up @@ -3936,16 +3935,15 @@ Error OS_X11::move_to_trash(const String &p_path) {
String trash_info = "[Trash Info]\nPath=" + p_path.http_escape() + "\nDeletionDate=" + timestamp + "\n";
{
Error err;
FileAccess *file = FileAccess::open(trash_path + "/info/" + file_name + ".trashinfo", FileAccess::WRITE, &err);
FileAccessRef file = FileAccess::open(trash_path + "/info/" + file_name + ".trashinfo", FileAccess::WRITE, &err);
ERR_FAIL_COND_V_MSG(err != OK, err, "Can't create trashinfo file:" + trash_path + "/info/" + file_name + ".trashinfo");
file->store_string(trash_info);
file->close();

// Rename our resource before moving it to the trash can.
DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
err = dir_access->rename(p_path, p_path.get_base_dir() + "/" + file_name);
ERR_FAIL_COND_V_MSG(err != OK, err, "Can't rename file \"" + p_path + "\"");
memdelete(dir_access);
}

// Move the given resource to the trash can.
Expand Down

0 comments on commit f8afd16

Please sign in to comment.