From eebcfeb68e2ea57dda13120a26467f66f37b4c5b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 8 Apr 2021 12:23:39 +0200 Subject: [PATCH] Support more than NGROUPS_MAX groups on macos I suspect this is the cause for our recent CI failures. Apparently, on macos it is possible for getgroups() to return more than NGROUPS_MAX groups. We avoid an EINVAL in that case by fetching the exact number of groups in advance. This should work on both macos and posix systems. --- ext/posix/posix.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ext/posix/posix.c b/ext/posix/posix.c index 948069a6b48fb..ef5e7d2ec84ed 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -563,13 +563,21 @@ PHP_FUNCTION(posix_setegid) #ifdef HAVE_GETGROUPS PHP_FUNCTION(posix_getgroups) { - gid_t gidlist[NGROUPS_MAX]; + gid_t *gidlist; int result; int i; PHP_POSIX_NO_ARGS; - if ((result = getgroups(NGROUPS_MAX, gidlist)) < 0) { + /* MacOS may return more than NGROUPS_MAX groups. + * Fetch the actual number of groups and create an appropriate allocation. */ + if ((result = getgroups(0, NULL)) < 0) { + POSIX_G(last_error) = errno; + RETURN_FALSE; + } + + gidlist = emalloc(sizeof(gid_t) * result); + if ((result = getgroups(result, gidlist)) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } @@ -579,6 +587,7 @@ PHP_FUNCTION(posix_getgroups) for (i=0; i