summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-15 10:00:22 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-15 10:00:22 +0200
commit50fd380359257615035fd02b2dc244cc9b17e041 (patch)
tree508c57c4379f9627ec097c1446c17c70353056c4
parentfac55137a1f282540931931ec54ceee8b7a9d797 (diff)
parent57fde36f31b742d5ba3b74a78b90c173513c51d0 (diff)
downloadredot-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.cpp2
-rw-r--r--drivers/unix/dir_access_unix.cpp4
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);