Jelajahi Sumber

Kernel: Properly lock Process protected data in the prctl syscall

Liav A 2 tahun lalu
induk
melakukan
bedd90b1f0
3 mengubah file dengan 12 tambahan dan 16 penghapusan
  1. 0 7
      Kernel/Process.cpp
  2. 0 1
      Kernel/Process.h
  3. 12 8
      Kernel/Syscalls/prctl.cpp

+ 0 - 7
Kernel/Process.cpp

@@ -1017,13 +1017,6 @@ bool Process::add_thread(Thread& thread)
     return is_first;
 }
 
-void Process::set_dumpable(bool dumpable)
-{
-    with_mutable_protected_data([&](auto& protected_data) {
-        protected_data.dumpable = dumpable;
-    });
-}
-
 ErrorOr<void> Process::set_coredump_property(NonnullOwnPtr<KString> key, NonnullOwnPtr<KString> value)
 {
     return m_coredump_properties.with([&](auto& coredump_properties) -> ErrorOr<void> {

+ 0 - 1
Kernel/Process.h

@@ -249,7 +249,6 @@ public:
     {
         return with_protected_data([](auto& protected_data) { return protected_data.dumpable; });
     }
-    void set_dumpable(bool);
 
     mode_t umask() const
     {

+ 12 - 8
Kernel/Syscalls/prctl.cpp

@@ -12,14 +12,18 @@ namespace Kernel {
 ErrorOr<FlatPtr> Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] FlatPtr arg2)
 {
     VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
-    switch (option) {
-    case PR_GET_DUMPABLE:
-        return is_dumpable();
-    case PR_SET_DUMPABLE:
-        set_dumpable(arg1);
-        return 0;
-    }
-    return EINVAL;
+    return with_mutable_protected_data([&](auto& protected_data) -> ErrorOr<FlatPtr> {
+        switch (option) {
+        case PR_GET_DUMPABLE:
+            return protected_data.dumpable;
+        case PR_SET_DUMPABLE:
+            if (arg1 != 0 && arg1 != 1)
+                return EINVAL;
+            protected_data.dumpable = arg1;
+            return 0;
+        }
+        return EINVAL;
+    });
 }
 
 }