diff --git a/ext/posix/posix.c b/ext/posix/posix.c index 7538c3d5276..2253ed860b6 100644 --- a/ext/posix/posix.c +++ b/ext/posix/posix.c @@ -290,13 +290,21 @@ PHP_FUNCTION(posix_setegid) #ifdef HAVE_GETGROUPS PHP_FUNCTION(posix_getgroups) { - gid_t gidlist[NGROUPS_MAX]; + gid_t *gidlist; int result; int i; ZEND_PARSE_PARAMETERS_NONE(); - 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; } @@ -306,6 +314,7 @@ PHP_FUNCTION(posix_getgroups) for (i=0; i