From fc249f934b77de7fca36bfd398eaf7299be941aa Mon Sep 17 00:00:00 2001 From: Thomas Bushnell Date: Mon, 18 Nov 1996 23:58:21 +0000 Subject: Mon Nov 18 18:16:29 1996 Thomas Bushnell, n/BSG * users.c (trivfs_modify_stat): Omit pointless assignment. Fri Nov 15 17:37:12 1996 Thomas Bushnell, n/BSG * users.c (open_hook): New arg syntax. (trivfs_check_open_hook): Likewise. * ptyio.c (pty_open_hook): Likewise. * term.h (pty_open_hook): Likewise. * users.c (S_termctty_open_terminal): New syntax of trivfs_open. * users.c (trivfs_S_file_chown): Rewrite using idvecs. (trivfs_S_file_chmod): Likewise. --- term/ChangeLog | 16 +++++++ term/ptyio.c | 3 +- term/term.h | 3 +- term/users.c | 131 +++++++++++++++++++++++++-------------------------------- 4 files changed, 75 insertions(+), 78 deletions(-) diff --git a/term/ChangeLog b/term/ChangeLog index 8536ff51..d1bbc74b 100644 --- a/term/ChangeLog +++ b/term/ChangeLog @@ -1,3 +1,19 @@ +Mon Nov 18 18:16:29 1996 Thomas Bushnell, n/BSG + + * users.c (trivfs_modify_stat): Omit pointless assignment. + +Fri Nov 15 17:37:12 1996 Thomas Bushnell, n/BSG + + * users.c (open_hook): New arg syntax. + (trivfs_check_open_hook): Likewise. + * ptyio.c (pty_open_hook): Likewise. + * term.h (pty_open_hook): Likewise. + + * users.c (S_termctty_open_terminal): New syntax of trivfs_open. + + * users.c (trivfs_S_file_chown): Rewrite using idvecs. + (trivfs_S_file_chmod): Likewise. + Thu Oct 24 14:44:57 1996 Thomas Bushnell, n/BSG * users.c (open_hook): Always assert DTR (even if O_NONBLOCK). diff --git a/term/ptyio.c b/term/ptyio.c index b6689d4c..7296eafd 100644 --- a/term/ptyio.c +++ b/term/ptyio.c @@ -65,8 +65,7 @@ ptyio_init () error_t pty_open_hook (struct trivfs_control *cntl, - uid_t *uids, u_int nuids, - uid_t *gids, u_int ngids, + struct iouser *user, int flags) { if ((flags & (O_READ|O_WRITE)) == 0) diff --git a/term/term.h b/term/term.h index 05c44b51..10b33ed7 100644 --- a/term/term.h +++ b/term/term.h @@ -323,7 +323,6 @@ error_t pty_io_read (struct trivfs_protid *, char **, mach_msg_type_number_t *, mach_msg_type_number_t); error_t pty_io_readable (int *); error_t pty_io_select (struct trivfs_protid *, mach_port_t, int *, int *); -error_t pty_open_hook (struct trivfs_control *, uid_t *, u_int, uid_t *, - u_int, int); +error_t pty_open_hook (struct trivfs_control *, struct iouser *, int); error_t pty_po_create_hook (struct trivfs_peropen *); error_t pty_po_destroy_hook (struct trivfs_peropen *); diff --git a/term/users.c b/term/users.c index 0350b13a..44a2641d 100644 --- a/term/users.c +++ b/term/users.c @@ -104,15 +104,14 @@ init_users () static error_t open_hook (struct trivfs_control *cntl, - uid_t *uids, u_int nuids, - uid_t *gids, u_int ngids, + struct iouser *user, int flags) { int cancel = 0; error_t err; if (cntl == ptyctl) - return pty_open_hook (cntl, uids, nuids, gids, ngids, flags); + return pty_open_hook (cntl, user, flags); if ((flags & (O_READ|O_WRITE)) == 0) return 0; @@ -172,8 +171,8 @@ open_hook (struct trivfs_control *cntl, mutex_unlock (&global_lock); return 0; } -error_t (*trivfs_check_open_hook) (struct trivfs_control *, uid_t *, - u_int, uid_t *, u_int, int) +error_t (*trivfs_check_open_hook) (struct trivfs_control *, + struct iouser *, int) = open_hook; static error_t @@ -289,7 +288,6 @@ trivfs_modify_stat (struct trivfs_protid *cred, struct stat *st) st->st_fstype = FSTYPE_TERM; st->st_fsid = getpid (); st->st_ino = 0; - st->st_mode &= ~S_IFMT; st->st_mode = term_mode; st->st_uid = term_owner; st->st_gid = term_group; @@ -344,7 +342,9 @@ S_termctty_open_terminal (mach_port_t arg, if (!err) { - err = trivfs_open (termctl, 0, 0, 0, 0, flags, new_realnode, &newcred); + err = trivfs_open (termctl, + iohelp_create_iouser (make_idvec (), make_idvec ()), + flags, new_realnode, &newcred); if (!err) { *result = ports_get_right (newcred); @@ -418,56 +418,40 @@ trivfs_S_file_chown (struct trivfs_protid *cred, uid_t uid, gid_t gid) { - int i; - int noticed_uid; - - /* This routine is flawed in several ways; it needs to - be rewritted once the idvec handling stuff can do - permission checks. */ - + struct stat st; + error_t err; + if (!cred) return EOPNOTSUPP; - noticed_uid = 0; mutex_lock (&global_lock); - for (i = 0; i < cred->nuids; i++) + + /* XXX */ + st.st_uid = term_owner; + st.st_gid = term_group; + + if (!cred->isroot) { - if (cred->uids[i] == uid) - noticed_uid = 1; - if (cred->uids[i] == 0 || cred->uids[i] == term_owner) + err = fshelp_isowner (&st, cred->user); + if (err) + goto out; + + if (!idvec_contains (cred->user->uids, uid) + || !idvec_contains (cred->user->gids, gid)) { - /* Make sure UID is legitimate */ - if (!cred->isroot && !noticed_uid && term_owner != uid) - { - /* Continue scanning UIDS */ - for (i++; i < cred->nuids; i++) - if (cred->uids[i] == uid) - noticed_uid = 1; - if (!noticed_uid) - { - mutex_unlock (&global_lock); - return EPERM; - } - } - - /* Make sure GID is legitimate */ - for (i = 0; i < cred->ngids || cred->isroot; i++) - if (cred->isroot || cred->gids[i] == gid) - { - /* Make the change */ - term_owner = uid; - term_group = gid; - mutex_unlock (&global_lock); - return 0; - } - - /* Not legitimate */ - break; + err = EPERM; + goto out; } } + /* Make the change */ + term_owner = uid; + term_group = gid; + err = 0; + +out: mutex_unlock (&global_lock); - return EPERM; + return err; } /* Implement chmod locally */ @@ -477,41 +461,40 @@ trivfs_S_file_chmod (struct trivfs_protid *cred, mach_msg_type_name_t reply_type, mode_t mode) { - int i; + error_t err; + struct stat st; if (!cred) return EOPNOTSUPP; mutex_lock (&global_lock); - for (i = 0; i < cred->nuids; i++) - if (cred->isroot || cred->uids[i] == term_owner) - { - if (!cred->isroot) - { - mode &= S_ISVTX; - - for (i = 0; i < cred->nuids; i++) - if (cred->uids[i] == term_owner) - break; - if (i == cred->nuids) - mode &= ~S_ISUID; - - for (i = 0; i < cred->ngids; i++) - if (cred->gids[i] == term_group) - break; - if (i == cred->nuids) - mode &= ~S_ISGID; - } - - term_mode = (mode | S_IFCHR); - mutex_unlock (&global_lock); - return 0; - } + if (!cred->isroot) + { + /* XXX */ + st.st_uid; + st.st_gid; + + err = fshelp_isowner (&st, cred->user); + if (err) + goto out; + + mode &= S_ISVTX; + + if (!idvec_contains (cred->user->uids, term_owner)) + mode &= ~S_ISUID; + + if (!idvec_contains (cred->user->gids, term_group)) + mode &= ~S_ISUID; + } + + term_mode = ((mode & ~S_IFMT) | S_IFCHR); + err = 0; + +out: mutex_unlock (&global_lock); - return EPERM; + return err; } - error_t trivfs_S_file_check_access (struct trivfs_protid *cred, mach_port_t reply, mach_msg_type_name_t reply_type, -- cgit v1.2.3