diff options
author | Ned Deily <nad@acm.org> | 2013-08-01 21:37:17 -0700 |
---|---|---|
committer | Ned Deily <nad@acm.org> | 2013-08-01 21:37:17 -0700 |
commit | ffb32893a35082798a511cb47cdcf3376455a59f (patch) | |
tree | 7eca549ddb78008a97df98d4d0d18e0da159a952 | |
parent | Issue #17899: Fix rare file descriptor leak in os.listdir(). (diff) | |
parent | Issue #17557: Fix os.getgroups() to work with the modified behavior of (diff) | |
download | cpython-ffb32893a35082798a511cb47cdcf3376455a59f.tar.gz cpython-ffb32893a35082798a511cb47cdcf3376455a59f.tar.bz2 cpython-ffb32893a35082798a511cb47cdcf3376455a59f.zip |
Issue #17557: merge from 3.3
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/posixmodule.c | 30 |
3 files changed, 34 insertions, 0 deletions
diff --git a/Misc/ACKS b/Misc/ACKS index 2e38ee3dea7..16167ae0a64 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -737,6 +737,7 @@ Petri Lehtinen Luke Kenneth Casson Leighton Tshepang Lekhonkhobe Marc-André Lemburg +Mateusz Lenik John Lenton Kostyantyn Leschenko Benno Leslie diff --git a/Misc/NEWS b/Misc/NEWS index 04bce96a89c..bc6a810fb1e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -184,6 +184,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 #18608: Avoid keeping a strong reference to the locale module inside the _io module. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 32fbadc4475..e5d7ae15dd2 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5911,6 +5911,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) { @@ -5937,6 +5965,8 @@ posix_getgroups(PyObject *self, PyObject *noargs) return posix_error(); } } +#endif + result = PyList_New(n); if (result != NULL) { int i; |