From 487bba2f0cd506b4a79e1d92184a5f80d827954f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 16 Jun 2001 20:23:09 +0000 Subject: 2001-04-01 Neal H Walfield * dir-lookup.c (diskfs_S_dir_lookup): Use iohelp_create_empty_iouser. * fsys-getfile.c (diskfs_S_fsys_getfile): Use iohelp_create_complex_iouser. * io-reauthenticate.c (diskfs_S_io_reauthenticate): Use new iohelp_reauth semantics. * io-restrict-auth.c (diskfs_S_io_restrict_auth): Use new iohelp_create_iouser semantics. * protid-make.c (diskfs_finish_protid): Use iohelp_create_simple_iouser and new iohelp_dup_iouse semantics. * trans-callback.c (_diskfs_translator_callback2_fn): Use iohelp_create_simple_iouser. --- libdiskfs/io-restrict-auth.c | 48 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) (limited to 'libdiskfs/io-restrict-auth.c') diff --git a/libdiskfs/io-restrict-auth.c b/libdiskfs/io-restrict-auth.c index 691a59ed..8f8a97bd 100644 --- a/libdiskfs/io-restrict-auth.c +++ b/libdiskfs/io-restrict-auth.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1994, 1995, 1996 Free Software Foundation + Copyright (C) 1994,95,96,2001 Free Software Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -39,7 +39,7 @@ diskfs_S_io_restrict_auth (struct protid *cred, gid_t *gids, u_int ngids) { - error_t err; + error_t err = 0; struct idvec *uvec, *gvec; struct iouser *user; struct protid *newpi; @@ -48,26 +48,52 @@ diskfs_S_io_restrict_auth (struct protid *cred, if (!cred) return EOPNOTSUPP; - uvec = make_idvec (); - gvec = make_idvec (); - if (idvec_contains (cred->user->uids, 0)) + /* CRED has root access, and so may use any ids. */ { - /* CRED has root access, and so may use any ids. */ - idvec_set_ids (uvec, uids, nuids); - idvec_set_ids (gvec, gids, ngids); + err = iohelp_create_complex_iouser (&user, uids, nuids, gids, ngids); + if (err) + return err; } else { + uvec = make_idvec (); + if (! uvec) + return ENOMEM; + + gvec = make_idvec (); + if (! gvec) + { + idvec_free (uvec); + return ENOMEM; + } + /* Otherwise, use any of the requested ids that CRED already has. */ for (i = 0; i < cred->user->uids->num; i++) if (listmember (uids, cred->user->uids->ids[i], nuids)) - idvec_add (uvec, cred->user->uids->ids[i]); + { + err = idvec_add (uvec, cred->user->uids->ids[i]); + if (err) + goto out; + } for (i = 0; i < cred->user->gids->num; i++) if (listmember (gids, cred->user->gids->ids[i], ngids)) - idvec_add (gvec, cred->user->gids->ids[i]); + { + idvec_add (gvec, cred->user->gids->ids[i]); + if (err) + goto out; + } + + err = iohelp_create_iouser (&user, uvec, gvec); + + if (err) + { + out: + idvec_free (uvec); + idvec_free (gvec); + return err; + } } - user = iohelp_create_iouser (uvec, gvec); mutex_lock (&cred->po->np->lock); err = diskfs_create_protid (cred->po, user, &newpi); -- cgit v1.2.3