diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-10 08:24:49 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-10 08:24:49 -0400 |
| commit | c5e3bb7917689bc9ed54fee23a143144fade802d (patch) | |
| tree | 6e62dd4214e50387d94bd0c5f36a1392e842c8d7 | |
| parent | bf4e93397dbf0647e767a72e98fb15d3b53f0373 (diff) | |
| download | jove-kernel-c5e3bb7917689bc9ed54fee23a143144fade802d.tar.gz jove-kernel-c5e3bb7917689bc9ed54fee23a143144fade802d.tar.bz2 jove-kernel-c5e3bb7917689bc9ed54fee23a143144fade802d.zip | |
add check for pcb retype for correct rootdir layout
| -rw-r--r-- | api/syscall.h | 2 | ||||
| -rw-r--r-- | arch/x86_64/hal/obj.c | 5 | ||||
| -rw-r--r-- | hal/obj.h | 3 | ||||
| -rw-r--r-- | proc/process.c | 2 | ||||
| -rw-r--r-- | sys/objdir.c | 7 | ||||
| -rw-r--r-- | sys/objdir.h | 2 | ||||
| -rw-r--r-- | sys/syscall_untyped.c | 7 |
7 files changed, 27 insertions, 1 deletions
diff --git a/api/syscall.h b/api/syscall.h index 6b10569..54ff267 100644 --- a/api/syscall.h +++ b/api/syscall.h @@ -179,12 +179,14 @@ struct syscall_region_merge enum { _SYSCALL_PCB_NONE = 0, + SYSCALL_PCB_PID, SYSCALL_PCB_YIELD, SYSCALL_PCB_SEND, SYSCALL_PCB_RECV, SYSCALL_PCB_READY, }; +#define SYSCALL_PERM_PCB_PID (JOVE_PERM_READ) #define SYSCALL_PERM_PCB_YIELD (JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_SEND (JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_RECV (JOVE_PERM_WRITE) diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c index b3658b2..d6c9a80 100644 --- a/arch/x86_64/hal/obj.c +++ b/arch/x86_64/hal/obj.c @@ -79,3 +79,8 @@ obj_setvalue(jove_owned_obj_t *obj, uintmax_t value) obj->locked.value = value & 0x00007FFFFFFFFFFFULL; } +bool +obj_compare(jove_obj_t *a, jove_obj_t *b) +{ + return a->data == b->data; +} @@ -1,3 +1,4 @@ +#include <stdbool.h> #ifndef _JOVE_HAL_OBJ_H #define _JOVE_HAL_OBJ_H 1 @@ -33,4 +34,6 @@ void obj_settype(jove_owned_obj_t *obj, uint8_t type); uintmax_t obj_getvalue(jove_owned_obj_t *obj); void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value); +bool obj_compare(jove_obj_t *a, jove_obj_t *b); + #endif diff --git a/proc/process.c b/proc/process.c index 62c0269..f0b83c6 100644 --- a/proc/process.c +++ b/proc/process.c @@ -18,7 +18,7 @@ pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj) pcb_header->size = size; pcb_header->pid = __next_pid++; - pcb_header->rootdir = obj_asunowned(rootdir_obj); + pcb_header->rootdir = obj_release(rootdir_obj); pcb_header->tree_node.get_key = (void*)pcb_getpid; pcb_tree = rbtree_insert(pcb_tree, &pcb_header->tree_node); diff --git a/sys/objdir.c b/sys/objdir.c index eab935f..f956309 100644 --- a/sys/objdir.c +++ b/sys/objdir.c @@ -112,6 +112,13 @@ objdir_trygetobj( } } +bool +objdir_compare(jove_owned_obj_t *objdir_obj, objpath_part_t entry, jove_obj_t *obj) +{ + jove_obj_t peekobj = objdir_peeklocal(objdir_obj, entry); + return obj_compare(&peekobj, obj); +} + void objdir_swapobj(jove_owned_obj_t *a, jove_owned_obj_t *b) { diff --git a/sys/objdir.h b/sys/objdir.h index e2ae7ef..e86e582 100644 --- a/sys/objdir.h +++ b/sys/objdir.h @@ -1,6 +1,7 @@ #ifndef _JOVE_SYS_OBJDIR_H #define _JOVE_SYS_OBJDIR_H 1 +#include "api/obj.h" #include "hal/obj.h" int objdir_new(jove_owned_obj_t *untyped_obj); @@ -23,6 +24,7 @@ jove_owned_obj_t *objdir_getobj(jove_owned_obj_t *objdir_obj, const uint16_t *pa /*Same as objdir_getobj but does not block if child objects are locked.*/ jove_owned_obj_t *objdir_trygetobj(jove_owned_obj_t *objdir_obj, const uint16_t *path, size_t path_len); +bool objdir_compare(jove_owned_obj_t *objdir_obj, objpath_part_t entry, jove_obj_t *obj); void objdir_swapobj(jove_owned_obj_t *a, jove_owned_obj_t *b); #endif diff --git a/sys/syscall_untyped.c b/sys/syscall_untyped.c index 1ec21c7..c4378ea 100644 --- a/sys/syscall_untyped.c +++ b/sys/syscall_untyped.c @@ -1,8 +1,11 @@ +#include "api/process.h" #include "arch/x86_64/hal/obj.h" #include "hal/memory.h" +#include "hal/obj.h" #include "jove.h" #include "lib/printf.h" #include "proc/process.h" +#include "sys/objdir.h" #include "syscall.h" static int @@ -91,6 +94,10 @@ s_syscall_untyped_retype_pcb(jove_owned_obj_t *untyped_obj, return -errno; } CHECK_OBJPERM(objdir_obj, JOVE_PERM_ALL, "New PCB needs full access to it's root objdir!"); + if(!objdir_compare(objdir_obj.obj, PCB_ROOTDIR_SELF_I, obj_asunowned(untyped_obj))) { + klogf("Untyped is not in objdir entry %i\n", PCB_ROOTDIR_SELF_I); + return -EBADPATH; + } obj_settype(untyped_obj, JOVE_OBJ_PCB); return pcb_new(untyped_obj, untyped->limit, objdir_obj.obj); |
