From: Greg Farnum Date: Wed, 3 Aug 2016 22:48:01 +0000 (-0700) Subject: client: Actually handle gid lists in UserPerm X-Git-Tag: v11.0.1~36^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=07ed90eca8c79907eaa8974c42b9d6673ff7fea5;p=ceph.git client: Actually handle gid lists in UserPerm Signed-off-by: Greg Farnum --- diff --git a/src/client/UserPerm.h b/src/client/UserPerm.h index de4513f1223f..45364c2f2b9b 100644 --- a/src/client/UserPerm.h +++ b/src/client/UserPerm.h @@ -20,14 +20,45 @@ struct UserPerm private: uid_t m_uid; gid_t m_gid; + int gid_count; + gid_t *gids; + bool alloced_gids; public: - UserPerm() : m_uid(-1), m_gid(-1) {} - UserPerm(int uid, int gid) : m_uid(uid), m_gid(gid) {} - // the readdir code relies on UserPerm copy-constructor being a deep copy! + UserPerm() : m_uid(-1), m_gid(-1), gid_count(0), + gids(NULL), alloced_gids(false) {} + UserPerm(int uid, int gid) : m_uid(uid), m_gid(gid), gid_count(0), + gids(NULL), alloced_gids(false) {} + UserPerm(const UserPerm& o) { + m_uid = o.m_uid; + m_gid = o.m_gid; + gid_count = o.gid_count; + gids = new gid_t[gid_count]; + alloced_gids = true; + for (int i = 0; i < gid_count; ++i) { + gids[i] = o.gids[i]; + } + } + ~UserPerm() { + if (alloced_gids) + delete gids; + } + // FIXME: stop doing a deep-copy all the time. We need it on stuff + // that lasts longer than a single "syscall", but not for MetaRequests et al uid_t uid() const { return m_uid; } gid_t gid() const { return m_gid; } - bool gid_in_groups(gid_t gid) const { return gid == m_gid; } - int get_gids(const gid_t **gids) const { return 0; } + bool gid_in_groups(gid_t gid) const { + if (gid == m_gid) return true; + for (int i = 0; i < gid_count; ++i) { + if (gid == gids[i]) return true; + } + return false; + } + int get_gids(const gid_t **_gids) const { *_gids = gids; return gid_count; } + void init_gids(gid_t* _gids, int count) { + gids = _gids; + gid_count = count; + } + void take_gids() { alloced_gids = true; } };