diff options
Diffstat (limited to 'libnetfs/io-restrict-auth.c')
-rw-r--r-- | libnetfs/io-restrict-auth.c | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/libnetfs/io-restrict-auth.c b/libnetfs/io-restrict-auth.c index 1a175a35..bddc8fea 100644 --- a/libnetfs/io-restrict-auth.c +++ b/libnetfs/io-restrict-auth.c @@ -1,5 +1,5 @@ -/* - Copyright (C) 1995 Free Software Foundation, Inc. +/* + Copyright (C) 1995,96,2001,02 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. @@ -21,16 +21,6 @@ #include "netfs.h" #include "io_S.h" -static inline int -listmember (int *list, int query, int n) -{ - int i; - for (i = 0; i < n; i++) - if (list[i] == query) - return 1; - return 0; -} - error_t netfs_S_io_restrict_auth (struct protid *user, mach_port_t *newport, @@ -40,33 +30,33 @@ netfs_S_io_restrict_auth (struct protid *user, gid_t *gids, mach_msg_type_number_t ngids) { - uid_t *newuids, *newgids, *olduids, *oldgids; - int i, newnuids, newngids, oldnuids, oldngids; + error_t err; struct protid *newpi; - + struct iouser *new_user; + if (!user) return EOPNOTSUPP; - + + err = iohelp_restrict_iouser (&new_user, user->user, + uids, nuids, gids, ngids); + if (err) + return err; + mutex_lock (&user->po->np->lock); - netfs_interpret_credential (user->credential, &olduids, &oldnuids, - &oldgids, &oldngids); - newuids = alloca (sizeof (uid_t) * oldnuids); - newgids = alloca (sizeof (gid_t) * oldngids); - for (i = newnuids = 0; i < oldnuids; i++) - if (listmember (uids, olduids[i], nuids)) - newuids[newnuids++] = olduids[i]; - for (i = newngids = 0; i < oldngids; i++) - if (listmember (gids, oldgids[i], ngids)) - newgids[newngids++] = oldgids[i]; - - newpi = netfs_make_protid (user->po, - netfs_make_credential (newuids, newnuids, - newgids, newngids)); - *newport = ports_get_right (newpi); - mutex_unlock (&user->po->np->lock); - - *newporttype = MACH_MSG_TYPE_MAKE_SEND; + newpi = netfs_make_protid (user->po, new_user); + if (newpi) + { + *newport = ports_get_right (newpi); + mutex_unlock (&user->po->np->lock); + *newporttype = MACH_MSG_TYPE_MAKE_SEND; + } + else + { + mutex_unlock (&user->po->np->lock); + iohelp_free_iouser (new_user); + err = ENOMEM; + } + ports_port_deref (newpi); - return 0; + return err; } - |