Browse Source

Kernel+Tests: Make sys$rmdir() fail with EINVAL if basename is "."

Dr. POSIX says that we should reject attempts to rmdir() the file named
"." so this patch does exactly that. We also add a test.

This solves a FIXME from January 2019. :^)
Andreas Kling 2 years ago
parent
commit
8d781d0216
2 changed files with 26 additions and 1 deletions
  1. 6 1
      Kernel/FileSystem/VirtualFileSystem.cpp
  2. 20 0
      Tests/LibC/TestIo.cpp

+ 6 - 1
Kernel/FileSystem/VirtualFileSystem.cpp

@@ -841,7 +841,12 @@ ErrorOr<void> VirtualFileSystem::rmdir(Credentials const& credentials, StringVie
     auto custody = TRY(resolve_path(credentials, path, base, &parent_custody));
     auto& inode = custody->inode();
 
-    // FIXME: We should return EINVAL if the last component of the path is "."
+    auto last_component = KLexicalPath::basename(path);
+
+    // [EINVAL] The path argument contains a last component that is dot.
+    if (last_component == "."sv)
+        return EINVAL;
+
     // FIXME: We should return ENOTEMPTY if the last component of the path is ".."
 
     if (!inode.is_directory())

+ 20 - 0
Tests/LibC/TestIo.cpp

@@ -317,6 +317,26 @@ TEST_CASE(tmpfs_massive_file)
     EXPECT_EQ(rc, 0);
 }
 
+TEST_CASE(rmdir_dot)
+{
+    int rc = mkdir("/home/anon/rmdir-test-1", 0700);
+    EXPECT_EQ(rc, 0);
+
+    rc = rmdir("/home/anon/rmdir-test-1/.");
+    EXPECT_NE(rc, 0);
+    EXPECT_EQ(errno, EINVAL);
+
+    rc = chdir("/home/anon/rmdir-test-1");
+    EXPECT_EQ(rc, 0);
+
+    rc = rmdir(".");
+    VERIFY(rc != 0);
+    EXPECT_EQ(errno, EINVAL);
+
+    rc = rmdir("/home/anon/rmdir-test-1");
+    EXPECT_EQ(rc, 0);
+}
+
 TEST_CASE(rmdir_while_inside_dir)
 {
     int rc = mkdir("/home/anon/testdir", 0700);