Commit 8074364f authored by Ned Deily's avatar Ned Deily

Issue #17557: Fix os.getgroups() to work with the modified behavior of

getgroups(2) on OS X 10.8.  Original patch by Mateusz Lenik.
parent 594e8eba
...@@ -599,6 +599,7 @@ Petri Lehtinen ...@@ -599,6 +599,7 @@ Petri Lehtinen
Luke Kenneth Casson Leighton Luke Kenneth Casson Leighton
Tshepang Lekhonkhobe Tshepang Lekhonkhobe
Marc-André Lemburg Marc-André Lemburg
Mateusz Lenik
John Lenton John Lenton
Kostyantyn Leschenko Kostyantyn Leschenko
Christopher Tur Lesniewski-Laas Christopher Tur Lesniewski-Laas
......
...@@ -26,6 +26,9 @@ Core and Builtins ...@@ -26,6 +26,9 @@ Core and Builtins
Library Library
------- -------
- Issue #17557: Fix os.getgroups() to work with the modified behavior of
getgroups(2) on OS X 10.8. Original patch by Mateusz Lenik.
- Issue #18455: multiprocessing should not retry connect() with same socket. - Issue #18455: multiprocessing should not retry connect() with same socket.
- Issue #18513: Fix behaviour of cmath.rect w.r.t. signed zeros on OS X 10.8 + - Issue #18513: Fix behaviour of cmath.rect w.r.t. signed zeros on OS X 10.8 +
......
...@@ -4054,6 +4054,34 @@ posix_getgroups(PyObject *self, PyObject *noargs) ...@@ -4054,6 +4054,34 @@ posix_getgroups(PyObject *self, PyObject *noargs)
gid_t* alt_grouplist = grouplist; gid_t* alt_grouplist = grouplist;
int n; int n;
#ifdef __APPLE__
/* Issue #17557: As of OS X 10.8, getgroups(2) no longer raises EINVAL if
* there are more groups than can fit in grouplist. Therefore, on OS X
* always first call getgroups with length 0 to get the actual number
* of groups.
*/
n = getgroups(0, NULL);
if (n < 0) {
return posix_error();
} else if (n <= MAX_GROUPS) {
/* groups will fit in existing array */
alt_grouplist = grouplist;
} else {
alt_grouplist = PyMem_Malloc(n * sizeof(gid_t));
if (alt_grouplist == NULL) {
errno = EINVAL;
return posix_error();
}
}
n = getgroups(n, alt_grouplist);
if (n == -1) {
if (alt_grouplist != grouplist) {
PyMem_Free(alt_grouplist);
}
return posix_error();
}
#else
n = getgroups(MAX_GROUPS, grouplist); n = getgroups(MAX_GROUPS, grouplist);
if (n < 0) { if (n < 0) {
if (errno == EINVAL) { if (errno == EINVAL) {
...@@ -4080,6 +4108,8 @@ posix_getgroups(PyObject *self, PyObject *noargs) ...@@ -4080,6 +4108,8 @@ posix_getgroups(PyObject *self, PyObject *noargs)
return posix_error(); return posix_error();
} }
} }
#endif
result = PyList_New(n); result = PyList_New(n);
if (result != NULL) { if (result != NULL) {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment