From dc9f9f55cb6b38b87d8c228ae9abb4b53ebfb25c Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Mon, 15 Mar 2021 22:54:54 +0100 Subject: System hardening and errno impl --- kernel/features/load.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'kernel/features/load.c') diff --git a/kernel/features/load.c b/kernel/features/load.c index 9e6db79..65d76d4 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -1,17 +1,27 @@ // MIT License, Copyright (c) 2020 Marvin Borner +#include #include #include #include #include #include +#include + #define PROC_STACK_SIZE 0x4000 -int bin_load(const char *path, struct proc *proc) +s32 bin_load(const char *path, struct proc *proc) { + if (!path || !memory_valid(path) || !proc) + return -EFAULT; + struct stat s = { 0 }; - vfs_stat(path, &s); + memory_bypass_enable(); + s32 stat = vfs_stat(path, &s); + memory_bypass_disable(); + if (stat != 0) + return stat; strcpy(proc->name, path); @@ -22,9 +32,12 @@ int bin_load(const char *path, struct proc *proc) u32 size = PAGE_ALIGN_UP(s.size); u32 data = (u32)memory_alloc(proc->page_dir, size, MEMORY_USER | MEMORY_CLEAR); - if (!vfs_read(proc->name, (void *)data, 0, s.size)) { + memory_bypass_enable(); + s32 read = vfs_read(proc->name, (void *)data, 0, s.size); + memory_bypass_disable(); + if (read <= 0) { memory_switch_dir(prev); - return 1; + return read; } u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); -- cgit v1.2.3