diff options
Diffstat (limited to 'gl/lib')
-rw-r--r-- | gl/lib/mgetgroups.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gl/lib/mgetgroups.c b/gl/lib/mgetgroups.c index e697013ef..736dd87f3 100644 --- a/gl/lib/mgetgroups.c +++ b/gl/lib/mgetgroups.c @@ -81,10 +81,16 @@ mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups) while (1) { GETGROUPS_T *h; + int last_n_groups = max_n_groups; /* getgrouplist updates max_n_groups to num required. */ ng = getgrouplist (username, gid, g, &max_n_groups); + /* Some systems (like Darwin) have a bug where they + never increase max_n_groups. */ + if (ng < 0 && last_n_groups == max_n_groups) + max_n_groups *= 2; + if ((h = realloc_groupbuf (g, max_n_groups)) == NULL) { int saved_errno = errno; @@ -97,7 +103,9 @@ mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups) if (0 <= ng) { *groups = g; - return ng; + /* On success some systems just return 0 from getgrouplist, + so return max_n_groups rather than ng. */ + return max_n_groups; } } } |