diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2024-04-15 10:00:22 +0200 |
|---|---|---|
| committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-04-15 10:00:22 +0200 |
| commit | 50fd380359257615035fd02b2dc244cc9b17e041 (patch) | |
| tree | 508c57c4379f9627ec097c1446c17c70353056c4 | |
| parent | fac55137a1f282540931931ec54ceee8b7a9d797 (diff) | |
| parent | 57fde36f31b742d5ba3b74a78b90c173513c51d0 (diff) | |
| download | redot-engine-50fd380359257615035fd02b2dc244cc9b17e041.tar.gz | |
Merge pull request #90562 from bruvzg/fix_links
[Unix / DirAccess] Fix removing directory symlinks with `remove`, ensure `erase_contents_recursive` is not following directory symlinks.
| -rw-r--r-- | core/io/dir_access.cpp | 2 | ||||
| -rw-r--r-- | drivers/unix/dir_access_unix.cpp | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/core/io/dir_access.cpp b/core/io/dir_access.cpp index 680a653dfc..e99885befa 100644 --- a/core/io/dir_access.cpp +++ b/core/io/dir_access.cpp @@ -84,7 +84,7 @@ static Error _erase_recursive(DirAccess *da) { String n = da->get_next(); while (!n.is_empty()) { if (n != "." && n != "..") { - if (da->current_is_dir()) { + if (da->current_is_dir() && !da->is_link(n)) { dirs.push_back(n); } else { files.push_back(n); diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 46efb45934..2a85a81b91 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -419,7 +419,7 @@ Error DirAccessUnix::remove(String p_path) { return FAILED; } - if (S_ISDIR(flags.st_mode)) { + if (S_ISDIR(flags.st_mode) && !is_link(p_path)) { return ::rmdir(p_path.utf8().get_data()) == 0 ? OK : FAILED; } else { return ::unlink(p_path.utf8().get_data()) == 0 ? OK : FAILED; @@ -435,7 +435,7 @@ bool DirAccessUnix::is_link(String p_file) { struct stat flags = {}; if ((lstat(p_file.utf8().get_data(), &flags) != 0)) { - return FAILED; + return false; } return S_ISLNK(flags.st_mode); |
