bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071)

(cherry picked from commit 8725c83ed5)

Co-authored-by: Jeffrey Kintscher <49998481+websurfer5@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2019-06-13 00:18:26 -07:00 committed by GitHub
parent d561f848b2
commit b4c8ef7c67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 15 deletions

View File

@ -0,0 +1,2 @@
posix.getgrouplist() now works correctly when the user belongs to
NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher.

View File

@ -6120,6 +6120,13 @@ os_getpid_impl(PyObject *module)
} }
#endif /* HAVE_GETPID */ #endif /* HAVE_GETPID */
#ifdef NGROUPS_MAX
#define MAX_GROUPS NGROUPS_MAX
#else
/* defined to be 16 on Solaris7, so this should be a small number */
#define MAX_GROUPS 64
#endif
#ifdef HAVE_GETGROUPLIST #ifdef HAVE_GETGROUPLIST
/* AC 3.5: funny apple logic below */ /* AC 3.5: funny apple logic below */
@ -6132,13 +6139,6 @@ Returns a list of groups to which a user belongs.\n\n\
static PyObject * static PyObject *
posix_getgrouplist(PyObject *self, PyObject *args) posix_getgrouplist(PyObject *self, PyObject *args)
{ {
#ifdef NGROUPS_MAX
#define MAX_GROUPS NGROUPS_MAX
#else
/* defined to be 16 on Solaris7, so this should be a small number */
#define MAX_GROUPS 64
#endif
const char *user; const char *user;
int i, ngroups; int i, ngroups;
PyObject *list; PyObject *list;
@ -6147,7 +6147,16 @@ posix_getgrouplist(PyObject *self, PyObject *args)
#else #else
gid_t *groups, basegid; gid_t *groups, basegid;
#endif #endif
ngroups = MAX_GROUPS;
/*
* NGROUPS_MAX is defined by POSIX.1 as the maximum
* number of supplimental groups a users can belong to.
* We have to increment it by one because
* getgrouplist() returns both the supplemental groups
* and the primary group, i.e. all of the groups the
* user belongs to.
*/
ngroups = 1 + MAX_GROUPS;
#ifdef __APPLE__ #ifdef __APPLE__
if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid))
@ -6216,13 +6225,6 @@ os_getgroups_impl(PyObject *module)
/*[clinic end generated code: output=42b0c17758561b56 input=d3f109412e6a155c]*/ /*[clinic end generated code: output=42b0c17758561b56 input=d3f109412e6a155c]*/
{ {
PyObject *result = NULL; PyObject *result = NULL;
#ifdef NGROUPS_MAX
#define MAX_GROUPS NGROUPS_MAX
#else
/* defined to be 16 on Solaris7, so this should be a small number */
#define MAX_GROUPS 64
#endif
gid_t grouplist[MAX_GROUPS]; gid_t grouplist[MAX_GROUPS];
/* On MacOSX getgroups(2) can return more than MAX_GROUPS results /* On MacOSX getgroups(2) can return more than MAX_GROUPS results