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. > + 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. With that fixed: Reviewed-by: Pavel Hrdina <phrdina@xxxxxxxxxx>
Attachment:
signature.asc
Description: PGP signature