diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index b292fffe34..f2f69b0b1d 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -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();