Skip to content

Commit

Permalink
bpo-40014: Fix os.getgrouplist() on macOS (GH-19118)
Browse files Browse the repository at this point in the history
On macOS, getgrouplist() returns a non-zero value without setting
errno if the group list is too small. Double the list size and call
it again in this case.
(cherry picked from commit 8ec7370)

Co-authored-by: Victor Stinner <vstinner@python.org>
  • Loading branch information
miss-islington and vstinner committed Mar 23, 2020
1 parent 5765aca commit 1cdc61c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
@@ -0,0 +1,3 @@
Fix ``os.getgrouplist()``: on macOS, the ``getgrouplist()`` function returns a
non-zero value without setting ``errno`` if the group list is too small. Double
the list size and call it again in this case.
19 changes: 19 additions & 0 deletions Modules/posixmodule.c
Expand Up @@ -6178,10 +6178,29 @@ posix_getgrouplist(PyObject *self, PyObject *args)
if (groups == NULL)
return PyErr_NoMemory();

#ifdef __APPLE__
while (getgrouplist(user, basegid, groups, &ngroups)) {
/* On macOS, getgrouplist() returns a non-zero value without setting
errno if the group list is too small. Double the list size and call
it again in this case. */
PyMem_Free(groups);

if (ngroups > INT_MAX / 2) {
return PyErr_NoMemory();
}
ngroups *= 2;

groups = PyMem_New(int, ngroups);
if (groups == NULL) {
return PyErr_NoMemory();
}
}
#else
if (getgrouplist(user, basegid, groups, &ngroups) == -1) {
PyMem_Del(groups);
return posix_error();
}
#endif

#ifdef _Py_MEMORY_SANITIZER
/* Clang memory sanitizer libc intercepts don't know getgrouplist. */
Expand Down

0 comments on commit 1cdc61c

Please sign in to comment.