Issue #17557: Fix os.getgroups() to work with the modified behavior of
getgroups(2) on OS X 10.8. Original patch by Mateusz Lenik.
This commit is contained in:
parent
2e3e593e34
commit
b5dd6d2287
|
@ -721,6 +721,7 @@ Petri Lehtinen
|
|||
Luke Kenneth Casson Leighton
|
||||
Tshepang Lekhonkhobe
|
||||
Marc-André Lemburg
|
||||
Mateusz Lenik
|
||||
John Lenton
|
||||
Kostyantyn Leschenko
|
||||
Christopher Tur Lesniewski-Laas
|
||||
|
|
|
@ -59,6 +59,9 @@ Core and Builtins
|
|||
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 #18599: Fix name attribute of _sha1.sha1() object. It now returns
|
||||
'SHA1' instead of 'SHA'.
|
||||
|
||||
|
|
|
@ -6331,6 +6331,34 @@ posix_getgroups(PyObject *self, PyObject *noargs)
|
|||
gid_t* alt_grouplist = grouplist;
|
||||
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);
|
||||
if (n < 0) {
|
||||
if (errno == EINVAL) {
|
||||
|
@ -6357,6 +6385,8 @@ posix_getgroups(PyObject *self, PyObject *noargs)
|
|||
return posix_error();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
result = PyList_New(n);
|
||||
if (result != NULL) {
|
||||
int i;
|
||||
|
|
Loading…
Reference in New Issue