From: Greg Farnum Date: Fri, 29 Jul 2016 23:37:43 +0000 (-0700) Subject: client: remove client reference from RequestUserGroups X-Git-Tag: v11.0.1~36^2~58 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=885f848eb20f711e3329405129b0bb1c95c03acd;p=ceph.git client: remove client reference from RequestUserGroups Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e523c4e142a0..274b040522dc 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5043,7 +5043,8 @@ out: int Client::may_setattr(Inode *in, struct stat *st, int mask, const UserPerm& perms) { - RequestUserGroups groups(this, perms.uid(), perms.gid()); + RequestUserGroups groups(perms.uid(), perms.gid()); + init_groups(&groups); int r = _getattr_for_perm(in, perms); if (r < 0) @@ -12479,12 +12480,18 @@ void Client::handle_conf_change(const struct md_config_t *conf, } } +void Client::init_groups(RequestUserGroups *groups) +{ + gid_t *sgids; + int count = _getgrouplist(&sgids, groups->get_uid(), groups->get_gid()); + groups->init_gids(sgids, count); +} + bool Client::RequestUserGroups::is_in(gid_t id) { + assert(sgid_count >= 0); if (id == gid) return true; - if (sgid_count < 0) - init(); for (int i = 0; i < sgid_count; ++i) { if (id == sgids[i]) return true; @@ -12494,8 +12501,7 @@ bool Client::RequestUserGroups::is_in(gid_t id) int Client::RequestUserGroups::get_gids(const gid_t **out) { - if (sgid_count < 0) - init(); + assert(sgid_count >= 0); if (sgid_count > 0) { *out = sgids; return sgid_count; diff --git a/src/client/Client.h b/src/client/Client.h index 559c0dfc982d..4dacdd046842 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -878,24 +878,28 @@ private: }; class RequestUserGroups : public UserGroups { - Client *client; uid_t uid; gid_t gid; int sgid_count; gid_t *sgids; - void init() { - sgid_count = client->_getgrouplist(&sgids, uid, gid); - } public: - RequestUserGroups(Client *c, uid_t u, gid_t g) : - client(c), uid(u), gid(g), sgid_count(-1), sgids(NULL) {} + RequestUserGroups(uid_t u, gid_t g) : + uid(u), gid(g), sgid_count(-1), sgids(NULL) {} ~RequestUserGroups() { free(sgids); } + bool is_init() { return sgid_count < 0; } + void init_gids(gid_t *_sgids, int count) { + sgids = _sgids; + sgid_count = count; + } + uid_t get_uid() { return uid; } gid_t get_gid() { return gid; } bool is_in(gid_t id); int get_gids(const gid_t **out); }; + friend class RequestUserGroups; + void init_groups(RequestUserGroups *groups); int inode_permission(Inode *in, uid_t uid, UserGroups& groups, unsigned want); int xattr_permission(Inode *in, const char *name, unsigned want, @@ -908,7 +912,8 @@ private: int may_hardlink(Inode *in, const UserPerm& perms); int inode_permission(Inode *in, const UserPerm& perms, unsigned want) { - RequestUserGroups groups(this, perms.uid(), perms.gid()); + RequestUserGroups groups(perms.uid(), perms.gid()); + init_groups(&groups); return inode_permission(in, perms.uid(), groups, want); } int xattr_permission(Inode *in, const char *name, unsigned want, int uid=-1, int gid=-1) {