diff --git a/kernelmq/init.c b/kernelmq/init.c index 8e1e673..8d0463c 100644 --- a/kernelmq/init.c +++ b/kernelmq/init.c @@ -9,6 +9,7 @@ #include "tasks.h" #include "elf.h" +#include "logger.h" static struct KernelMQ_Info kinfo; @@ -31,6 +32,29 @@ void init(const struct KernelMQ_Info *const kinfo_ptr) paging_load(); if (kinfo.modules_count > 0) { - tasks_switch_to_user(kinfo.modules[0].base); + const struct KernelMQ_ELF_Header *const elf_header = + (void*)kinfo.modules[0].base; + + const unsigned char is_elf_header_valid = + elf_header->magic_0x7F == 0x7F && + elf_header->magic_E == 'E' && + elf_header->magic_L == 'L' && + elf_header->magic_F == 'F' && + elf_header->bitness == 1 && + elf_header->endianness == 1 && + elf_header->header_version == 1 && + elf_header->os_abi == 0 && + elf_header->obj_type == 2 && + elf_header->isa == 3 && + elf_header->elf_version == 1 && + elf_header->arch_flags == 0 && + elf_header->header_size == 52; + + if (is_elf_header_valid) { + tasks_switch_to_user(elf_header->entrypoint); + } + else { + logger_warn_from("init", "Invalid ELF header"); + } } }