diff options
Diffstat (limited to 'sys/syscall_objdir.c')
| -rw-r--r-- | sys/syscall_objdir.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/sys/syscall_objdir.c b/sys/syscall_objdir.c index 5e49fd4..277639f 100644 --- a/sys/syscall_objdir.c +++ b/sys/syscall_objdir.c @@ -1,3 +1,4 @@ +#include "arch/x86_64/hal/obj.h" #include "hal/process.h" #include "jove.h" #include "lib/printf.h" @@ -10,20 +11,17 @@ s_syscall_objdir_objtype( size_t payload_size, void *payload_data) { - int bytes_needed = sizeof(struct syscall_generic_objpath); - CHECK_TOOSMALL(bytes_needed, payload_size, "Message is too small for this payload!"); - - struct syscall_generic_objpath *payload = payload_data; - bytes_needed += payload->pathlen * 2; - CHECK_TOOSMALL(bytes_needed, payload_size, "Message is too small for second target path!"); + size_t bytes_needed = 2; + CHECK_TOOSMALL(bytes_needed, payload_size, "Message is too small for payload."); - int retval = 0; - jove_owned_obj_t *second_obj = objdir_getobj(objdir, payload->path, payload->pathlen); - CHECK_OBJEXISTS(second_obj, "Second target does not exist!"); + uint16_t local_idx = *((uint16_t*)payload_data); + if(local_idx > JOVE_OBJDIR_ENTRIES) { + kprintf("%s: Object index is out of bounds (>= 512)\n", __func__); + return EOOB; + } - retval = obj_gettype(second_obj); - obj_release(second_obj); - return retval; + jove_obj_t local_obj = objdir_peeklocal(target_dir, local_idx); + return obj_peektype(local_obj); } int @@ -41,6 +39,6 @@ _syscall_handle_objdir( return s_syscall_objdir_objtype(objdir, target_obj, bytes_left, payload); default: kprintf("syscall_handle_objdir: Objdir does not support syscall %i\n", header->callid); - return EOOB; + return EBADARG; } } |
