summaryrefslogtreecommitdiffstats
path: root/sys/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/syscall.c')
-rw-r--r--sys/syscall.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/sys/syscall.c b/sys/syscall.c
index 68a5ae6..9a98030 100644
--- a/sys/syscall.c
+++ b/sys/syscall.c
@@ -4,6 +4,7 @@
#include "hal/process.h"
#include "jove.h"
#include "lib/printf.h"
+#include "sys/link.h"
#include "sys/message.h"
int
@@ -33,6 +34,7 @@ static const syscall_handle_t s_syscall_handles[128] = {
[JOVE_OBJ_FRAMEBUFFER] = _syscall_handle_generic,
[JOVE_OBJ_VIRTTERM] = _syscall_handle_vtt,
[JOVE_OBJ_MESSAGE] = _syscall_handle_generic,
+ [JOVE_OBJ_LINK] = _syscall_handle_generic,
};
int
@@ -55,15 +57,11 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen)
return errno;
}
-#define SYSCALL_MIDWAY_CLEANUP \
- obj_release(message_obj); \
- obj_release(objdir); \
- obj_release(pcb_obj)
-
- if(obj_gettype(message_obj) != JOVE_OBJ_MESSAGE) {
+ int sysret = 0;
+ if(obj_gettype_linked(message_obj) != JOVE_OBJ_MESSAGE) {
kprintf("syscall: Process %i tried to call syscall with invalid object: %P\n", pcb_pid(pcb), message_path, message_pathlen);
- SYSCALL_MIDWAY_CLEANUP;
- return EBADOBJ;
+ sysret = EBADOBJ;
+ goto release_return;
}
size_t messagelen = message_len(message_obj);
@@ -75,18 +73,17 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen)
if(bytes_left < 0) {
//Target path exceeds message length.
kprintf("syscall: Process %i tried to call syscall with OOB target path.\n", pcb_pid(pcb));
- SYSCALL_MIDWAY_CLEANUP;
- return EBADPATH;
+ sysret = EBADPATH;
+ goto release_return;
}
jove_owned_obj_t *target = objdir_getobj(objdir, header->path, header->pathlen);
if(target == 0) {
//Could not find payload target in pcb rootdir.
kprintf("syscall: Process %i tried to call syscall with bad target path %P\n",
pcb_pid(pcb), header->path, header->pathlen);
- SYSCALL_MIDWAY_CLEANUP;
- return errno;
+ sysret = errno;
+ goto release_return;
}
- int sysret = 0;
uint8_t target_type = obj_gettype(target);
if(target_type > 0x7F) {
@@ -104,8 +101,10 @@ syscall_handler(uintmax_t message_path_raw, uint16_t message_pathlen)
pcb_obj, objdir, message_obj, target,
header, bytes_left, messagedata + header_bytes);
}
-
obj_release(target);
- SYSCALL_MIDWAY_CLEANUP;
+release_return:
+ obj_release(message_obj);
+ obj_release(objdir);
+ obj_release(pcb_obj);
return sysret;
}