diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 8ce170aa7e..37d400b9d9 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -893,4 +893,38 @@ KResult Process::try_set_coredump_property(StringView key, StringView value) return ENOMEM; }; +static constexpr StringView to_string(Pledge promise) +{ +#define __ENUMERATE_PLEDGE_PROMISE(x) \ + case Pledge::x: \ + return #x; + switch (promise) { + ENUMERATE_PLEDGE_PROMISES + } +#undef __ENUMERATE_PLEDGE_PROMISE + VERIFY_NOT_REACHED(); +} + +void Process::require_no_promises() +{ + if (!has_promises()) + return; + dbgln("Has made a promise"); + Process::current().crash(SIGABRT, 0); + VERIFY_NOT_REACHED(); +} + +void Process::require_promise(Pledge promise) +{ + if (!has_promises()) + return; + + if (has_promised(promise)) + return; + + dbgln("Has not pledged {}", to_string(promise)); + (void)try_set_coredump_property("pledge_violation"sv, to_string(promise)); + crash(SIGABRT, 0); +} + } diff --git a/Kernel/Process.h b/Kernel/Process.h index fdcf24f33d..46dadded75 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -509,6 +509,9 @@ public: VirtualAddress signal_trampoline() const { return m_protected_values.signal_trampoline; } + void require_promise(Pledge); + void require_no_promises(); + private: friend class MemoryManager; friend class Scheduler; @@ -955,26 +958,16 @@ inline ProcessID Thread::pid() const return m_process->pid(); } -#define REQUIRE_NO_PROMISES \ - do { \ - if (Process::current().has_promises()) { \ - dbgln("Has made a promise"); \ - Process::current().crash(SIGABRT, 0); \ - VERIFY_NOT_REACHED(); \ - } \ +#define REQUIRE_PROMISE(promise) \ + do { \ + Process::current().require_promise(Pledge::promise); \ } while (0) -#define REQUIRE_PROMISE(promise) \ - do { \ - if (Process::current().has_promises() \ - && !Process::current().has_promised(Pledge::promise)) { \ - dbgln("Has not pledged {}", #promise); \ - (void)Process::current().try_set_coredump_property( \ - "pledge_violation"sv, #promise); \ - Process::current().crash(SIGABRT, 0); \ - VERIFY_NOT_REACHED(); \ - } \ +#define REQUIRE_NO_PROMISES \ + do { \ + Process::current().require_no_promises(); \ } while (0) + } #define VERIFY_PROCESS_BIG_LOCK_ACQUIRED(process) \