From c2788174198632e0c8bdbfa7762081f595460bdf Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Tue, 29 Sep 2026 12:53:57 -0400 Subject: move process code into proc. add panic folder --- sys/link.c | 23 +++++++++++++++++++++++ sys/link.h | 6 ++++++ sys/syscall.c | 23 ++++++++++++++--------- sys/syscall_objdir.c | 2 +- sys/syscall_pagedir.c | 27 ++++++++++++--------------- sys/syscall_untyped.c | 23 +++++++++++++++-------- 6 files changed, 71 insertions(+), 33 deletions(-) (limited to 'sys') diff --git a/sys/link.c b/sys/link.c index 592fe8f..45c118a 100644 --- a/sys/link.c +++ b/sys/link.c @@ -1,6 +1,8 @@ #include "link.h" #include "arch/x86_64/hal/obj.h" #include "hal/memory.h" +#include "lib/printf.h" +#include "jove.h" uint8_t link_gettype(jove_owned_obj_t *obj) @@ -57,6 +59,27 @@ link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack) return perm_obj; } +jove_perm_obj_t +link_try_traverse_objdir(jove_owned_obj_t *objdir, lockstack_t *lockstack, + size_t pathlen, objpath_part_t *path) +{ + /*Do a traversal through the passed objdir to get objdir permissions.*/ + jove_perm_obj_t perm_obj = link_try_traverse(objdir, lockstack); + if(perm_obj.obj == 0) return perm_obj; + if(pathlen == 0) return perm_obj; + + /*Get the object pointed to by the head of the path. */ + perm_obj.obj = lockstack_push(lockstack, objdir_trygetlocal(perm_obj.obj, path[0])); + if(pathlen > 1) lockstack_pop(lockstack); /*Don't lock the directory we're traversing. */ + + /*Recurse through the remaining path, resolving as we go. */ + jove_perm_obj_t traverse_obj = link_try_traverse_objdir(perm_obj.obj, lockstack, pathlen - 1, &path[1]); + + /*Mask permissions against the head object. */ + traverse_obj.permissions &= perm_obj.permissions; + return traverse_obj; +} + jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions) { struct obj_link *linkval = obj_deref(dst); diff --git a/sys/link.h b/sys/link.h index 3f7331f..d4bc8d8 100644 --- a/sys/link.h +++ b/sys/link.h @@ -27,6 +27,12 @@ jove_owned_obj_t *link_try_deref(jove_owned_obj_t *link); jove_perm_obj_t link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack); jove_perm_obj_t link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack); +/**Try to retrieve an object from the object directory, resolving each link as it's encountered. + * Permissions are preserved through traversal, meaning objects are limited by their + * objdir permissions.*/ +jove_perm_obj_t link_try_traverse_objdir(jove_owned_obj_t *objdir, + lockstack_t *lockstack, size_t pathlen, objpath_part_t *path); + jove_obj_t link_unlink(jove_owned_obj_t *link); jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions); diff --git a/sys/syscall.c b/sys/syscall.c index 31f9078..5cef3d6 100644 --- a/sys/syscall.c +++ b/sys/syscall.c @@ -1,7 +1,7 @@ #include "sys/syscall.h" #include "arch/x86_64/hal/obj.h" #include "hal/smp.h" -#include "hal/process.h" +#include "proc/process.h" #include "jove.h" #include "lib/printf.h" #include "sys/link.h" @@ -83,14 +83,12 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen) int sysret = 0; - ctx.pcb = lockstack_push(&ctx.lockstack, process_current()); + ctx.pcb = process_current(); pcb_t *pcb = obj_deref(ctx.pcb); ctx.objdir = lockstack_push(&ctx.lockstack, obj_take(pcb_rootdir(pcb))); - ctx.message = link_try_traverse( - lockstack_push(&ctx.lockstack, objdir_trygetobj( - ctx.objdir, message_path, message_pathlen)), - &ctx.lockstack); + ctx.message = link_try_traverse_objdir( + ctx.objdir, &ctx.lockstack, message_pathlen, message_path); if(ctx.message.obj == NULL) { klogf("Process %i failed to get message %P : %s\n", @@ -106,6 +104,13 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen) goto release_return; } + if((ctx.message.permissions & JOVE_PERM_READ) == 0) { + klogf("Process %i tried to call syscall with message object %P without read permissions\n", + pcb_pid(pcb), message_path, message_pathlen); + sysret = -EPERM; + goto release_return; + } + size_t messagelen = message_len(ctx.message.obj); void *messagedata = message_data(ctx.message.obj); struct syscall_header *header = messagedata; @@ -122,8 +127,9 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen) ctx.bytes_left = messagelen - bytes_needed; ctx.payload = (void*)((uintptr_t)header + bytes_needed); - ctx.target.obj = lockstack_push(&ctx.lockstack, - objdir_trygetobj(ctx.objdir, header->path, header->pathlen)); + ctx.target = link_try_traverse_objdir( + ctx.objdir, &ctx.lockstack, ctx.header->pathlen, ctx.header->path); + if(ctx.target.obj == 0) { //Could not find payload target in pcb rootdir. klogf("Process %i tried to call syscall with bad target path %P : %s\n", @@ -132,7 +138,6 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen) goto release_return; } - ctx.target.permissions = JOVE_PERM_ALL; sysret = _syscall_handle_switch(&ctx); release_return: diff --git a/sys/syscall_objdir.c b/sys/syscall_objdir.c index b4d3800..9243af1 100644 --- a/sys/syscall_objdir.c +++ b/sys/syscall_objdir.c @@ -1,5 +1,5 @@ #include "arch/x86_64/hal/obj.h" -#include "hal/process.h" +#include "proc/process.h" #include "jove.h" #include "lib/printf.h" #include "syscall.h" diff --git a/sys/syscall_pagedir.c b/sys/syscall_pagedir.c index 961c477..7b8f315 100644 --- a/sys/syscall_pagedir.c +++ b/sys/syscall_pagedir.c @@ -28,10 +28,9 @@ s_get_untyped( "Message too small for untyped path."); errno = 0; - jove_perm_obj_t untyped = link_try_traverse( - lockstack_push(lockstack, objdir_trygetobj( - objdir, payload->untyped_path, payload->untyped_pathlen)), - lockstack); + jove_perm_obj_t untyped = link_try_traverse_objdir( + objdir, lockstack, payload->untyped_pathlen, payload->untyped_path); + if(errno) { kprintf("%s: Untyped obj failed for the reason: %s\n", __func__, errstr(errno)); return errno; @@ -81,10 +80,9 @@ s_syscall_pagedir_unmap( CHECK_TOOSMALL(bytes_needed, payload_bytes, "Message too small for none path"); - jove_perm_obj_t none = link_try_traverse( - lockstack_push(lockstack, objdir_trygetobj( - objdir, payload->none_path, payload->none_pathlen)), - lockstack); + jove_perm_obj_t none = link_try_traverse_objdir( + objdir, lockstack, payload->none_pathlen, payload->none_path); + if(errno) { kprintf("%s: None obj retrieval failed for the reason: %s\n", __func__, errstr(errno)); @@ -163,15 +161,14 @@ s_syscall_pagedir_map_shmem( bytes_needed += payload->shmem_pathlen << 1; CHECK_TOOSMALL(bytes_needed, payload_bytes, - "Message too small for untyped path."); + "Message too small for shared memory path."); errno = 0; - jove_perm_obj_t shmem = link_try_traverse( - lockstack_push(lockstack, objdir_trygetobj( - objdir, payload->shmem_path, payload->shmem_pathlen)), - lockstack); + jove_perm_obj_t shmem = link_try_traverse_objdir( + objdir, lockstack, payload->shmem_pathlen, payload->shmem_path); if(errno) { - klogf("Shared memory obj failed for the reason: %s\n", errstr(errno)); + klogf("Unable to retrieve shared memory object %P : %s\n", + payload->shmem_path, payload->shmem_pathlen, errstr(errno)); return errno; } @@ -179,7 +176,7 @@ s_syscall_pagedir_map_shmem( "Shared memory path does not point to a shared memory object."); uintmax_t shmem_value = obj_getvalue(shmem.obj); - uint8_t shmem_pages = shmem_value & 0xFF; + uint8_t shmem_pages = shmem_value & 0xFFF; if(payload->page_offset >= shmem_pages) { klogf("Page offset goes beyond size of shared memory object: (%i >= %i)\n", diff --git a/sys/syscall_untyped.c b/sys/syscall_untyped.c index a117387..8fe592d 100644 --- a/sys/syscall_untyped.c +++ b/sys/syscall_untyped.c @@ -19,10 +19,13 @@ s_syscall_untyped_split( bytes_needed += payload->dest_pathlen * 2; CHECK_TOOSMALL(bytes_needed, payload_bytes, "Message is too small for destination path!"); - jove_perm_obj_t dest = link_try_traverse( - lockstack_push(lockstack, - objdir_trygetobj(objdir, payload->dest_path, payload->dest_pathlen)), - lockstack); + jove_perm_obj_t dest = link_try_traverse_objdir( + objdir, lockstack, payload->dest_pathlen, payload->dest_path); + if(errno) { + klogf("Unable to get destination object %P: %s\n", + payload->dest_path, payload->dest_pathlen, errstr(errno)); + return errno; + } CHECK_OBJTYPE(dest.obj, JOVE_OBJ_NONE, "Destination path is occupied!"); @@ -49,10 +52,14 @@ s_syscall_untyped_merge( bytes_needed += payload->pathlen * 2; CHECK_TOOSMALL(bytes_needed, payload_bytes, "Message is too small for second path!"); - jove_perm_obj_t untyped = link_try_traverse( - lockstack_push(lockstack, - objdir_getobj(objdir, payload->path, payload->pathlen)), - lockstack); + jove_perm_obj_t untyped = link_try_traverse_objdir( + objdir, lockstack, payload->pathlen, payload->path); + if(errno) { + klogf("Unable to retrieve untyped object %P : %s\n", + payload->path, payload->pathlen, errstr(errno)); + return errno; + } + CHECK_OBJTYPE(untyped.obj, JOVE_OBJ_UNTYPED, "Second object is not an untyped!"); CHECK_OBJPERM(untyped, SYSCALL_PERM_UNTYPED_MERGE, "Second untyped does not have permission to merge!"); -- cgit v1.2.3