diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 9f3380c803..2d3c3b1d8a 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -630,6 +630,9 @@ KResult VFS::rmdir(StringView path, Custody& base) if (!inode.is_directory()) return KResult(-ENOTDIR); + if (!parent_custody) + return KResult(-EBUSY); + auto& parent_inode = parent_custody->inode(); if (!parent_inode.metadata().may_write(*Process::current)) diff --git a/Userland/test_io.cpp b/Userland/test_io.cpp index 377b653d5f..d469edc58d 100644 --- a/Userland/test_io.cpp +++ b/Userland/test_io.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -293,6 +294,15 @@ void test_writev() close(pipefds[1]); } +void test_rmdir_root() +{ + int rc = rmdir("/"); + if (rc != -1 || errno != EBUSY) { + warn() << "rmdir(/) didn't fail with EBUSY"; + ASSERT_NOT_REACHED(); + } +} + int main(int, char**) { int rc; @@ -319,6 +329,7 @@ int main(int, char**) test_eoverflow(); test_rmdir_while_inside_dir(); test_writev(); + test_rmdir_root(); EXPECT_ERROR_2(EPERM, link, "/", "/home/anon/lolroot");