diff options
-rw-r--r-- | libtrivfs/fsys-getroot.c | 78 |
1 files changed, 25 insertions, 53 deletions
diff --git a/libtrivfs/fsys-getroot.c b/libtrivfs/fsys-getroot.c index c082b7d4..9eca01f5 100644 --- a/libtrivfs/fsys-getroot.c +++ b/libtrivfs/fsys-getroot.c @@ -39,11 +39,10 @@ trivfs_S_fsys_getroot (struct trivfs_control *cntl, mach_port_t *newpt, mach_msg_type_name_t *newpttype) { - struct trivfs_protid *cred; - mach_port_t new_realnode; - error_t err = 0; int perms; - int i; + error_t err = 0; + mach_port_t new_realnode; + struct trivfs_protid *cred; if (!cntl) return EOPNOTSUPP; @@ -58,60 +57,33 @@ trivfs_S_fsys_getroot (struct trivfs_control *cntl, flags &= O_HURD; flags &= ~(O_CREAT|O_EXCL|O_NOLINK|O_NOTRANS); - io_restrict_auth (cntl->underlying, &new_realnode, - uids, nuids, gids, ngids); + err = io_restrict_auth (cntl->underlying, + &new_realnode, uids, nuids, gids, ngids); + if (err) + return err; + file_check_access (new_realnode, &perms); if ((flags & (O_READ|O_WRITE|O_EXEC) & perms) != (flags & (O_READ|O_WRITE|O_EXEC))) - { - mach_port_deallocate (mach_task_self (), new_realnode); - return EACCES; - } + err = EACCES; + + if (!err && trivfs_check_open_hook) + err = (*trivfs_check_open_hook) (cntl, uids, nuids, gids, ngids, flags); + if (!err) + err = trivfs_open (cntl, uids, nuids, gids, ngids, flags, new_realnode, + &cred); + if (err) + mach_port_deallocate (mach_task_self (), new_realnode); - if (trivfs_check_open_hook) + if (!err) { - err = (*trivfs_check_open_hook) (cntl, uids, nuids, gids, ngids, flags); - if (err) - { - mach_port_deallocate (mach_task_self (), new_realnode); - return err; - } + *do_retry = FS_RETRY_NORMAL; + *retry_name = '\0'; + *newpt = ports_get_right (cred); + *newpttype = MACH_MSG_TYPE_MAKE_SEND; + ports_port_deref (cred); + mach_port_deallocate (mach_task_self (), dotdot); } - - cred = ports_allocate_port (cntl->protid_bucket, - sizeof (struct trivfs_protid), - cntl->protid_class); - cred->isroot = 0; - for (i = 0; i < nuids; i++) - if (uids[i] == 0) - cred->isroot = 1; - cred->uids = malloc (nuids * sizeof (uid_t)); - cred->gids = malloc (ngids * sizeof (uid_t)); - bcopy (uids, cred->uids, nuids * sizeof (uid_t)); - bcopy (gids, cred->gids, ngids * sizeof (uid_t)); - cred->nuids = nuids; - cred->ngids = ngids; - cred->hook = 0; - cred->po = malloc (sizeof (struct trivfs_peropen)); - cred->po->refcnt = 1; - cred->po->cntl = cntl; - cred->po->openmodes = flags; - cred->po->hook = 0; - ports_port_ref (cntl); - if (trivfs_peropen_create_hook) - (*trivfs_peropen_create_hook) (cred->po); - - cred->realnode = new_realnode; - if (trivfs_protid_create_hook) - (*trivfs_protid_create_hook) (cred); - - *do_retry = FS_RETRY_NORMAL; - *retry_name = '\0'; - *newpt = ports_get_right (cred); - *newpttype = MACH_MSG_TYPE_MAKE_SEND; - ports_port_deref (cred); - mach_port_deallocate (mach_task_self (), dotdot); - return 0; + return err; } - |