From 0b1b4d8f7e7df0d3645bd7569c0b5ec9e030e42f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 5 Jun 2023 21:08:34 +0300 Subject: [PATCH] Kernel: exec now has better posix errors --- kernel/include/kernel/Process.h | 2 ++ kernel/kernel/Process.cpp | 56 ++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index dbfd09910d..326d24a9f5 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -49,6 +49,8 @@ namespace Kernel pid_t pid() const { return m_pid; } + static BAN::ErrorOr load_elf_for_exec(BAN::StringView); + BAN::ErrorOr fork(uintptr_t rsp, uintptr_t rip); BAN::ErrorOr exec(BAN::StringView path, const char* const* argv, const char* const* envp); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 3d03fce173..9529b4c16d 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -46,19 +46,7 @@ namespace Kernel BAN::ErrorOr Process::create_userspace(BAN::StringView path) { - auto* elf = TRY(LibELF::ELF::load_from_file(path)); - if (!elf->is_native()) - { - derrorln("ELF has invalid architecture"); - delete elf; - return BAN::Error::from_errno(EINVAL); - } - if (elf->file_header_native().e_type != LibELF::ET_EXEC) - { - derrorln("Not an executable"); - delete elf; - return BAN::Error::from_errno(EINVAL); - } + auto* elf = TRY(load_elf_for_exec(path)); auto* process = create_process(); MUST(process->m_working_directory.push_back('/')); @@ -167,6 +155,34 @@ namespace Kernel return {}; } + BAN::ErrorOr Process::load_elf_for_exec(BAN::StringView path) + { + auto elf_or_error = LibELF::ELF::load_from_file(path); + if (elf_or_error.is_error()) + { + if (elf_or_error.error().get_error_code() == EINVAL) + return BAN::Error::from_errno(ENOEXEC); + return elf_or_error.error(); + } + + auto* elf = elf_or_error.release_value(); + if (!elf->is_native()) + { + derrorln("ELF has invalid architecture"); + delete elf; + return BAN::Error::from_errno(EINVAL); + } + + if (elf->file_header_native().e_type != LibELF::ET_EXEC) + { + derrorln("Not an executable"); + delete elf; + return BAN::Error::from_errno(ENOEXEC); + } + + return elf; + } + BAN::ErrorOr Process::fork(uintptr_t rsp, uintptr_t rip) { Process* forked = create_process(); @@ -212,19 +228,7 @@ namespace Kernel if (str_envp.emplace_back(*envp++).is_error()) return BAN::Error::from_errno(ENOMEM); - auto* elf = TRY(LibELF::ELF::load_from_file(path)); - if (!elf->is_native()) - { - derrorln("ELF has invalid architecture"); - delete elf; - return BAN::Error::from_errno(EINVAL); - } - if (elf->file_header_native().e_type != LibELF::ET_EXEC) - { - derrorln("Not an executable"); - delete elf; - return BAN::Error::from_errno(EINVAL); - } + auto* elf = TRY(load_elf_for_exec(path)); LockGuard lock_guard(m_lock);