summaryrefslogtreecommitdiff
path: root/groupaccess.c
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2018-10-19 21:29:01 +0100
committerColin Watson <cjwatson@debian.org>2018-10-20 22:54:15 +0100
commitd80ebbf028196b2478beebf5a290b97f35e1eed9 (patch)
tree6666a5484923a26738675ff27a6186cfe15d4cad /groupaccess.c
parent4f5bbf3f11efeec65bbd56464b20a19bd250e5cc (diff)
parent1d2a55436d4b556269f42ad5f7e16608b5a8ed74 (diff)
New upstream release (7.9p1)
Diffstat (limited to 'groupaccess.c')
-rw-r--r--groupaccess.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/groupaccess.c b/groupaccess.c
index 2518c8487..9e4d25521 100644
--- a/groupaccess.c
+++ b/groupaccess.c
@@ -50,7 +50,7 @@ int
50ga_init(const char *user, gid_t base) 50ga_init(const char *user, gid_t base)
51{ 51{
52 gid_t *groups_bygid; 52 gid_t *groups_bygid;
53 int i, j; 53 int i, j, retry = 0;
54 struct group *gr; 54 struct group *gr;
55 55
56 if (ngroups > 0) 56 if (ngroups > 0)
@@ -62,10 +62,14 @@ ga_init(const char *user, gid_t base)
62#endif 62#endif
63 63
64 groups_bygid = xcalloc(ngroups, sizeof(*groups_bygid)); 64 groups_bygid = xcalloc(ngroups, sizeof(*groups_bygid));
65 while (getgrouplist(user, base, groups_bygid, &ngroups) == -1) {
66 if (retry++ > 0)
67 fatal("getgrouplist: groups list too small");
68 groups_bygid = xreallocarray(groups_bygid, ngroups,
69 sizeof(*groups_bygid));
70 }
65 groups_byname = xcalloc(ngroups, sizeof(*groups_byname)); 71 groups_byname = xcalloc(ngroups, sizeof(*groups_byname));
66 72
67 if (getgrouplist(user, base, groups_bygid, &ngroups) == -1)
68 logit("getgrouplist: groups list too small");
69 for (i = 0, j = 0; i < ngroups; i++) 73 for (i = 0, j = 0; i < ngroups; i++)
70 if ((gr = getgrgid(groups_bygid[i])) != NULL) 74 if ((gr = getgrgid(groups_bygid[i])) != NULL)
71 groups_byname[j++] = xstrdup(gr->gr_name); 75 groups_byname[j++] = xstrdup(gr->gr_name);
@@ -124,5 +128,6 @@ ga_free(void)
124 free(groups_byname[i]); 128 free(groups_byname[i]);
125 ngroups = 0; 129 ngroups = 0;
126 free(groups_byname); 130 free(groups_byname);
131 groups_byname = NULL;
127 } 132 }
128} 133}