summaryrefslogtreecommitdiffstats
path: root/sys/syscall_untyped.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/syscall_untyped.c')
-rw-r--r--sys/syscall_untyped.c33
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;
}