summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-10 08:24:49 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-10 08:24:49 -0400
commitc5e3bb7917689bc9ed54fee23a143144fade802d (patch)
tree6e62dd4214e50387d94bd0c5f36a1392e842c8d7
parentbf4e93397dbf0647e767a72e98fb15d3b53f0373 (diff)
downloadjove-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.h2
-rw-r--r--arch/x86_64/hal/obj.c5
-rw-r--r--hal/obj.h3
-rw-r--r--proc/process.c2
-rw-r--r--sys/objdir.c7
-rw-r--r--sys/objdir.h2
-rw-r--r--sys/syscall_untyped.c7
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;
+}
diff --git a/hal/obj.h b/hal/obj.h
index 5a48eb2..61ba968 100644
--- a/hal/obj.h
+++ b/hal/obj.h
@@ -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);