diff options
Diffstat (limited to 'sys/syscall_untyped.c')
| -rw-r--r-- | sys/syscall_untyped.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/sys/syscall_untyped.c b/sys/syscall_untyped.c index c64dea1..cc6b676 100644 --- a/sys/syscall_untyped.c +++ b/sys/syscall_untyped.c @@ -12,7 +12,7 @@ static int s_syscall_untyped_split( lockstack_t *lockstack, - jove_owned_obj_t *objdir, + jove_obj_t *objdir, jove_owned_obj_t *target_obj, size_t payload_bytes, void *payload_data) @@ -24,9 +24,10 @@ 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_objdir( - objdir, lockstack, payload->dest_pathlen, payload->dest_path); - if(errno) { + jove_perm_obj_t dest = link_traverse_objdir(objdir, payload->dest_pathlen, payload->dest_path); + lockstack_push(lockstack, dest.obj); + + if(dest.obj == NULL) { klogf("Unable to get destination object %P: %s\n", payload->dest_path, payload->dest_pathlen, errstr(errno)); return errno; @@ -45,7 +46,7 @@ s_syscall_untyped_split( static int s_syscall_untyped_merge( lockstack_t *lockstack, - jove_owned_obj_t *objdir, + jove_obj_t *objdir, jove_owned_obj_t *target_obj, size_t payload_bytes, void *payload_data) @@ -57,9 +58,10 @@ 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_objdir( - objdir, lockstack, payload->pathlen, payload->path); - if(errno) { + jove_perm_obj_t untyped = link_traverse_objdir(objdir, payload->pathlen, payload->path); + lockstack_push(lockstack, untyped.obj); + + if(untyped.obj == NULL) { klogf("Unable to retrieve untyped object %P : %s\n", payload->path, payload->pathlen, errstr(errno)); return errno; @@ -81,21 +83,22 @@ s_syscall_untyped_merge( int s_syscall_untyped_retype_pcb(jove_owned_obj_t *untyped_obj, lockstack_t *lockstack, - jove_owned_obj_t *rootdir, + jove_obj_t *rootdir, struct syscall_header *header) { jove_untyped_t *untyped = obj_deref(untyped_obj); CHECK_TOOSMALL(PCB_MINSIZE, untyped->limit, "Untyped object too small for PCB"); - jove_perm_obj_t objdir_obj = link_try_traverse_objdir( - rootdir, lockstack, header->pathlen - 1, header->path); - if(errno) { - klogf("Unable to retrieve parent objdir at %P\n", - header->path, header->pathlen - 1); + jove_perm_obj_t objdir_obj = link_traverse_objdir(rootdir, header->pathlen - 1, header->path); + + if(objdir_obj.obj == NULL) { + klogf("Unable to retrieve parent objdir at %P : %s\n", + header->path, header->pathlen - 1, errstr(errno)); + obj_release(objdir_obj.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))) { + if(!objdir_compare(obj_release(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; } |
