瀏覽代碼

Kernel: Don't allow non-root, non-owners to rmdir any child of sticky

We were not handling sticky parents properly in sys$rmdir(). Child
directories of a sticky parent should not be rmdir'able by just anyone.
Only the owner and root.

Fixes #4875.
Andreas Kling 4 年之前
父節點
當前提交
795bccbf69
共有 1 個文件被更改,包括 7 次插入1 次删除
  1. 7 1
      Kernel/FileSystem/VirtualFileSystem.cpp

+ 7 - 1
Kernel/FileSystem/VirtualFileSystem.cpp

@@ -750,10 +750,16 @@ KResult VFS::rmdir(StringView path, Custody& base)
         return KResult(-EBUSY);
 
     auto& parent_inode = parent_custody->inode();
+    auto parent_metadata = parent_inode.metadata();
 
-    if (!parent_inode.metadata().may_write(*Process::current()))
+    if (!parent_metadata.may_write(*Process::current()))
         return KResult(-EACCES);
 
+    if (parent_metadata.is_sticky()) {
+        if (!Process::current()->is_superuser() && inode.metadata().uid != Process::current()->euid())
+            return KResult(-EACCES);
+    }
+
     KResultOr<size_t> dir_count_result = inode.directory_entry_count();
     if (dir_count_result.is_error())
         return dir_count_result.result();