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:
parent
d561f848b2
commit
b4c8ef7c67
|
@ -0,0 +1,2 @@
|
||||||
|
posix.getgrouplist() now works correctly when the user belongs to
|
||||||
|
NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher.
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue