From abbe7b79d63436f927be56766e2277aa980148d9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 26 Aug 2025 13:22:30 +0300 Subject: [PATCH] Kernel: Add /proc//exe --- kernel/include/kernel/Process.h | 3 +++ kernel/kernel/FS/ProcFS/Inode.cpp | 11 +++++++++++ kernel/kernel/Process.cpp | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 031e1620..b289cc61 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -226,6 +226,8 @@ namespace Kernel size_t proc_cmdline(off_t offset, BAN::ByteSpan) const; size_t proc_environ(off_t offset, BAN::ByteSpan) const; + BAN::StringView executable() const { return m_executable; } + // Returns error if page could not be allocated // Returns true if the page was allocated successfully // Return false if access was page violation (segfault) @@ -339,6 +341,7 @@ namespace Kernel BAN::Vector m_cmdline; BAN::Vector m_environ; + BAN::String m_executable; BAN::Vector m_child_exit_statuses; ThreadBlocker m_child_exit_blocker; diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp index 14cfe253..91a9ac36 100644 --- a/kernel/kernel/FS/ProcFS/Inode.cpp +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -18,6 +18,16 @@ namespace Kernel TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_cmdline, fs, 0400)), "cmdline"_sv)); TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_environ, fs, 0400)), "environ"_sv)); + TRY(inode->link_inode(*MUST(ProcSymlinkInode::create_new( + [](void* process) -> BAN::ErrorOr + { + BAN::String result; + TRY(result.append(static_cast(process)->executable())); + return result; + }, + &process, fs, 0400, process.credentials().ruid(), process.credentials().ruid() + )), "exe"_sv)); + return inode; } @@ -32,6 +42,7 @@ namespace Kernel (void)TmpDirectoryInode::unlink_impl("meminfo"_sv); (void)TmpDirectoryInode::unlink_impl("cmdline"_sv); (void)TmpDirectoryInode::unlink_impl("environ"_sv); + (void)TmpDirectoryInode::unlink_impl("exe"_sv); } BAN::ErrorOr> ProcROProcessInode::create_new(Process& process, size_t (Process::*callback)(off_t, BAN::ByteSpan) const, TmpFileSystem& fs, mode_t mode) diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 1b94d00d..c2049b9b 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -132,6 +132,8 @@ namespace Kernel auto executable = TRY(ELF::load_from_inode(process->m_root_file.inode, executable_inode, process->m_credentials, process->page_table())); process->m_mapped_regions = BAN::move(executable.regions); + TRY(process->m_executable.append(executable_file.canonical_path)); + if (executable_inode->mode().mode & +Inode::Mode::ISUID) process->m_credentials.set_euid(executable_inode->uid()); if (executable_inode->mode().mode & +Inode::Mode::ISGID) @@ -672,6 +674,9 @@ namespace Kernel auto executable = TRY(ELF::load_from_inode(m_root_file.inode, executable_inode, m_credentials, *new_page_table)); auto new_mapped_regions = BAN::move(executable.regions); + BAN::String executable_path; + TRY(executable_path.append(executable_file.canonical_path)); + BAN::Vector auxiliary_vector; TRY(auxiliary_vector.reserve(1 + executable.open_execfd)); @@ -756,6 +761,7 @@ namespace Kernel m_cmdline = BAN::move(str_argv); m_environ = BAN::move(str_envp); + m_executable = BAN::move(executable_path); } m_has_called_exec = true;