summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-29 12:53:57 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-29 12:53:57 -0400
commitc2788174198632e0c8bdbfa7762081f595460bdf (patch)
tree373b1f5c7cfe0e87f29c1c8956579c58b4f22bf9 /sys
parent8de23ca36173cfdb3c609074496115ebd9045887 (diff)
downloadjove-kernel-c2788174198632e0c8bdbfa7762081f595460bdf.tar.gz
jove-kernel-c2788174198632e0c8bdbfa7762081f595460bdf.tar.bz2
jove-kernel-c2788174198632e0c8bdbfa7762081f595460bdf.zip
move process code into proc. add panic folder
Diffstat (limited to 'sys')
-rw-r--r--sys/link.c23
-rw-r--r--sys/link.h6
-rw-r--r--sys/syscall.c23
-rw-r--r--sys/syscall_objdir.c2
-rw-r--r--sys/syscall_pagedir.c27
-rw-r--r--sys/syscall_untyped.c23
6 files changed, 71 insertions, 33 deletions
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!");