On Mon, Jan 27, 2020 at 06:05:06PM +0100, Pavel Hrdina wrote: > On Mon, Jan 27, 2020 at 04:42:41PM +0000, Daniel P. Berrangé wrote: > > On Mon, Jan 27, 2020 at 12:44:01PM +0100, Pavel Hrdina wrote: > > > On Thu, Jan 23, 2020 at 11:42:59AM +0000, Daniel P. Berrangé wrote: > > > > The mgetgroups function is a GNULIB custom wrapper around > > > > getgrouplist(). This implements a simplified version of > > > > that code directly. > > > > > > > > Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> > > > > --- > > > > src/internal.h | 4 ++++ > > > > src/util/virutil.c | 34 ++++++++++++++++++++++++++++------ > > > > 2 files changed, 32 insertions(+), 6 deletions(-) > > > > > > > > diff --git a/src/util/virutil.c b/src/util/virutil.c > > > > index 87ca16c088..4bc0aef35f 100644 > > > > --- a/src/util/virutil.c > > > > +++ b/src/util/virutil.c > > > > @@ -1000,11 +1004,27 @@ virGetGroupList(uid_t uid, gid_t gid, gid_t **list) > > > > /* invalid users have no supplementary groups */ > > > > if (uid != (uid_t)-1 && > > > > virGetUserEnt(uid, &user, &primary, NULL, NULL, true) >= 0) { > > > > - if ((ret = mgetgroups(user, primary, list)) < 0) { > > > > - virReportSystemError(errno, > > > > - _("cannot get group list for '%s'"), user); > > > > - ret = -1; > > > > - goto cleanup; > > > > + int nallocgrps = 10; > > > > + gid_t *grps = g_new(gid_t, nallocgrps); > > > > > > This is never used anywhere except in the while loop. > > > > The loop relies on the "grps" pointer being persistent across > > loop iterations though. > > Sorry, probably bad wording. I meant that we need to assign the "grps" > to *lists otherwise it's used only in the loop. Ok, so your later suggestion/comment addresses that. > > > > + while (1) { > > > > + int nprevallocgrps = nallocgrps; > > > > + int rv; > > > > + > > > > + rv = getgrouplist(user, primary, grps, &nallocgrps); > > > > + > > > > + /* Some systems (like Darwin) have a bug where they > > > > + never increase max_n_groups. */ > > > > + if (rv < 0 && nprevallocgrps == nallocgrps) > > > > + nallocgrps *= 2; > > > > + > > > > + /* either shrinks to actual size, or enlarges tonew size */ > > > > > > s/tonew/to new/ > > > > > > > + grps = g_renew(gid_t, grps, nallocgrps); > > > > + > > > > + if (rv >= 0) { > > > > + ret = rv; > > > > + break; > > > > > > Based on the GNULIB implementation here we should set *list = grps. > > > > Yes. > > > > > > > > With that fixed: > > > > > > Reviewed-by: Pavel Hrdina <phrdina@xxxxxxxxxx> > > > > > > > > Regards, > > Daniel > > -- > > |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| > > |: https://libvirt.org -o- https://fstop138.berrange.com :| > > |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|