1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-18 21:45:08 +00:00

VirtualFileSystem: Don't let rename() overwrite non-empty directory

According to POSIX, rename shouldn't succeed if newpath is a non-empty
directory.
This commit is contained in:
LuK1337 2021-08-01 22:58:50 +02:00 committed by Andreas Kling
parent f16011e4d1
commit 3dd40535c1

View file

@ -499,6 +499,22 @@ KResult VirtualFileSystem::rename(StringView old_path, StringView new_path, Cust
return EPERM;
}
if (!new_custody_or_error.is_error()) {
auto& new_inode = new_custody_or_error.value()->inode();
if (old_inode.index() != new_inode.index() && old_inode.is_directory() && new_inode.is_directory()) {
size_t child_count = 0;
auto traversal_result = new_inode.traverse_as_directory([&child_count](auto&) {
++child_count;
return child_count <= 2;
});
if (traversal_result.is_error())
return traversal_result;
if (child_count > 2)
return ENOTEMPTY;
}
}
auto& old_parent_inode = old_parent_custody->inode();
auto& new_parent_inode = new_parent_custody->inode();