From 42b15729f63010b47bbaaa975e15487ab3c5db28 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 27 Sep 2016 23:45:56 -0700 Subject: [PATCH] client: in UserPerm, correctly use delete[] and don't leak gids on copy gids is an array. We also need to clean it up when deep_copy()ing, which requires initializing our member fields in the copy-constructor. Signed-off-by: Greg Farnum --- src/client/UserPerm.h | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/client/UserPerm.h b/src/client/UserPerm.h index 43b5347d2045c..71775b00334e8 100644 --- a/src/client/UserPerm.h +++ b/src/client/UserPerm.h @@ -23,14 +23,20 @@ private: int gid_count; gid_t *gids; bool alloced_gids; - void deep_copy(UserPerm& a, const UserPerm& b) { - a.m_uid = b.m_uid; - a.m_gid = b.m_gid; - a.gid_count = b.gid_count; - a.gids = new gid_t[gid_count]; - a.alloced_gids = true; - for (int i = 0; i < gid_count; ++i) { - a.gids[i] = b.gids[i]; + void deep_copy_from(const UserPerm& b) { + if (alloced_gids) { + delete[] gids; + alloced_gids = false; + } + m_uid = b.m_uid; + m_gid = b.m_gid; + gid_count = b.gid_count; + if (gid_count) { + gids = new gid_t[gid_count]; + alloced_gids = true; + for (int i = 0; i < gid_count; ++i) { + gids[i] = b.gids[i]; + } } } public: @@ -38,8 +44,8 @@ public: 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) { - deep_copy(*this, o); + UserPerm(const UserPerm& o) : UserPerm() { + deep_copy_from(o); } UserPerm(UserPerm && o) { m_uid = o.m_uid; @@ -52,10 +58,10 @@ public: } ~UserPerm() { if (alloced_gids) - delete gids; + delete[] gids; } UserPerm& operator=(const UserPerm o) { - deep_copy(*this, o); + deep_copy_from(o); return *this; } -- 2.39.5