From 6113fe4747e54181167a46c8b882f0356f039802 Mon Sep 17 00:00:00 2001 From: Ralf Donau Date: Wed, 7 Jul 2021 22:31:40 +0200 Subject: [PATCH] Kernel: Pledge promises accessible via /proc/PID/pledge --- Kernel/ProcessExposed.h | 1 + Kernel/ProcessSpecificExposed.cpp | 37 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index f4b5ac032a..5126739709 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -142,6 +142,7 @@ class ProcFSProcessFolder final friend class ProcFSComponentsRegistrar; friend class ProcFSRootFolder; friend class ProcFSProcessInformation; + friend class ProcFSProcessPledge; friend class ProcFSProcessUnveil; friend class ProcFSProcessPerformanceEvents; friend class ProcFSProcessFileDescription; diff --git a/Kernel/ProcessSpecificExposed.cpp b/Kernel/ProcessSpecificExposed.cpp index c4c9fdff47..3c1fbdd4e6 100644 --- a/Kernel/ProcessSpecificExposed.cpp +++ b/Kernel/ProcessSpecificExposed.cpp @@ -242,6 +242,42 @@ RefPtr ProcFSProcessFileDescriptions::lookup(StringView return procfd_fd; } +class ProcFSProcessPledge final : public ProcFSProcessInformation { +public: + static NonnullRefPtr create(const ProcFSProcessFolder& parent_folder) + { + return adopt_ref(*new (nothrow) ProcFSProcessPledge(parent_folder)); + } + +private: + explicit ProcFSProcessPledge(const ProcFSProcessFolder& parent_folder) + : ProcFSProcessInformation("pledge"sv, parent_folder) + { + } + virtual bool output(KBufferBuilder& builder) override + { + auto parent_folder = m_parent_folder.strong_ref(); + if (parent_folder.is_null()) + return false; + auto process = parent_folder->m_associated_process; + JsonObjectSerializer obj { builder }; +#define __ENUMERATE_PLEDGE_PROMISE(x) \ + if (process->has_promised(Pledge::x)) { \ + if (!builder.is_empty()) \ + builder.append(' '); \ + builder.append(#x); \ + } + if (process->has_promises()) { + StringBuilder builder; + ENUMERATE_PLEDGE_PROMISES + obj.add("promises", builder.build()); + } +#undef __ENUMERATE_PLEDGE_PROMISE + obj.finish(); + return true; + } +}; + class ProcFSProcessUnveil final : public ProcFSProcessInformation { public: static NonnullRefPtr create(const ProcFSProcessFolder& parent_folder) @@ -512,6 +548,7 @@ private: void ProcFSProcessFolder::on_attach() { VERIFY(m_components.size() == 0); + m_components.append(ProcFSProcessPledge::create(*this)); m_components.append(ProcFSProcessUnveil::create(*this)); m_components.append(ProcFSProcessPerformanceEvents::create(*this)); m_components.append(ProcFSProcessFileDescriptions::create(*this));