diff --git a/Kernel/Devices/BXVGADevice.cpp b/Kernel/Devices/BXVGADevice.cpp index 5da0b771f7b..bb353d2afe6 100644 --- a/Kernel/Devices/BXVGADevice.cpp +++ b/Kernel/Devices/BXVGADevice.cpp @@ -86,6 +86,7 @@ u32 BXVGADevice::find_framebuffer_address() KResultOr BXVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot) { + REQUIRE_PROMISE(video); ASSERT(offset == 0); ASSERT(size == framebuffer_size_in_bytes()); auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes()); @@ -105,6 +106,7 @@ KResultOr BXVGADevice::mmap(Process& process, FileDescription&, Virtual int BXVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg) { + REQUIRE_PROMISE(video); switch (request) { case FB_IOCTL_GET_SIZE_IN_BYTES: { auto* out = (size_t*)arg; diff --git a/Kernel/Devices/MBVGADevice.cpp b/Kernel/Devices/MBVGADevice.cpp index 0c86eccbdd8..39a16a8795d 100644 --- a/Kernel/Devices/MBVGADevice.cpp +++ b/Kernel/Devices/MBVGADevice.cpp @@ -25,6 +25,7 @@ MBVGADevice::MBVGADevice(PhysicalAddress addr, int pitch, int width, int height) KResultOr MBVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot) { + REQUIRE_PROMISE(video); ASSERT(offset == 0); ASSERT(size == framebuffer_size_in_bytes()); auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes()); @@ -44,6 +45,7 @@ KResultOr MBVGADevice::mmap(Process& process, FileDescription&, Virtual int MBVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg) { + REQUIRE_PROMISE(video); switch (request) { case FB_IOCTL_GET_SIZE_IN_BYTES: { auto* out = (size_t*)arg; diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 0fd52f82713..44043f6b2ec 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -53,26 +53,6 @@ //#define SIGNAL_DEBUG //#define SHARED_BUFFER_DEBUG -#define REQUIRE_NO_PROMISES \ - do { \ - if (has_promises()) { \ - dbg() << *current << " has made a promise"; \ - cli(); \ - crash(SIGABRT, 0); \ - ASSERT_NOT_REACHED(); \ - } \ - } while (0) - -#define REQUIRE_PROMISE(promise) \ - do { \ - if (has_promises() && !has_promised(Pledge::promise)) { \ - dbg() << *current << " has not pledged " << #promise; \ - cli(); \ - crash(SIGABRT, 0); \ - ASSERT_NOT_REACHED(); \ - } \ - } while (0) - static void create_signal_trampolines(); static void create_kernel_info_page(); @@ -233,7 +213,6 @@ Region* Process::region_containing(const Range& range) int Process::sys$set_mmap_name(const Syscall::SC_set_mmap_name_params* user_params) { REQUIRE_PROMISE(stdio); - if (!validate_read_typed(user_params)) return -EFAULT; diff --git a/Kernel/Process.h b/Kernel/Process.h index c096e278739..5eb0c61b279 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -46,6 +46,7 @@ extern VirtualAddress g_return_to_ring3_from_signal_trampoline; __ENUMERATE_PLEDGE_PROMISE(chown) \ __ENUMERATE_PLEDGE_PROMISE(chroot) \ __ENUMERATE_PLEDGE_PROMISE(thread) \ + __ENUMERATE_PLEDGE_PROMISE(video) \ __ENUMERATE_PLEDGE_PROMISE(shared_buffer) enum class Pledge : u32 { @@ -567,3 +568,24 @@ inline u32 Thread::effective_priority() const { return m_priority + m_process.priority_boost() + m_priority_boost + m_extra_priority; } + +#define REQUIRE_NO_PROMISES \ + do { \ + if (current->process().has_promises()) { \ + dbg() << *current << " has made a promise"; \ + cli(); \ + current->process().crash(SIGABRT, 0); \ + ASSERT_NOT_REACHED(); \ + } \ + } while (0) + +#define REQUIRE_PROMISE(promise) \ + do { \ + if (current->process().has_promises() \ + && !current->process().has_promised(Pledge::promise)) { \ + dbg() << *current << " has not pledged " << #promise; \ + cli(); \ + current->process().crash(SIGABRT, 0); \ + ASSERT_NOT_REACHED(); \ + } \ + } while (0) diff --git a/Servers/WindowServer/main.cpp b/Servers/WindowServer/main.cpp index aeab64d1e7c..2ad0d052000 100644 --- a/Servers/WindowServer/main.cpp +++ b/Servers/WindowServer/main.cpp @@ -10,7 +10,7 @@ int main(int, char**) { - if (pledge("stdio shared_buffer rpath wpath cpath unix proc exec fattr", nullptr) < 0) { + if (pledge("stdio video shared_buffer rpath wpath cpath unix proc exec fattr", nullptr) < 0) { perror("pledge"); return 1; } @@ -35,7 +35,7 @@ int main(int, char**) WSEventLoop loop; - if (pledge("stdio shared_buffer rpath wpath cpath unix proc exec", nullptr) < 0) { + if (pledge("stdio video shared_buffer rpath wpath cpath unix proc exec", nullptr) < 0) { perror("pledge"); return 1; }