Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 78265) +++ Modules/posixmodule.c (working copy) @@ -3833,17 +3833,20 @@ posix_getgroups(PyObject *self, PyObject *noargs) { PyObject *result = NULL; + gid_t *grouplist; + int n, nbuf; -#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]; - int n; - - n = getgroups(MAX_GROUPS, grouplist); + nbuf = 16; + while (1) { + grouplist = PyMem_MALLOC(nbuf * sizeof(gid_t)); + if (grouplist == NULL) + return PyErr_NoMemory(); + n = getgroups(nbuf, grouplist); + if (n > 0 || errno != EINVAL) + break; + PyMem_FREE(grouplist); + nbuf *= 2; + } if (n < 0) posix_error(); else { @@ -3861,6 +3864,7 @@ } } } + PyMem_FREE(grouplist); return result; } @@ -5713,35 +5717,35 @@ posix_setgroups(PyObject *self, PyObject *groups) { int i, len; - gid_t grouplist[MAX_GROUPS]; + gid_t *grouplist; + PyObject *ret = NULL; if (!PySequence_Check(groups)) { PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence"); return NULL; } len = PySequence_Size(groups); - if (len > MAX_GROUPS) { - PyErr_SetString(PyExc_ValueError, "too many groups"); - return NULL; - } + grouplist = PyMem_MALLOC(len * sizeof(gid_t)); + if (grouplist == NULL) + return PyErr_NoMemory(); for(i = 0; i < len; i++) { PyObject *elem; elem = PySequence_GetItem(groups, i); if (!elem) - return NULL; + goto done; if (!PyInt_Check(elem)) { if (!PyLong_Check(elem)) { PyErr_SetString(PyExc_TypeError, "groups must be integers"); Py_DECREF(elem); - return NULL; + goto done; } else { unsigned long x = PyLong_AsUnsignedLong(elem); if (PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "group id too big"); Py_DECREF(elem); - return NULL; + goto done; } grouplist[i] = x; /* read back to see if it fits in gid_t */ @@ -5749,7 +5753,7 @@ PyErr_SetString(PyExc_TypeError, "group id too big"); Py_DECREF(elem); - return NULL; + goto done; } } } else { @@ -5759,7 +5763,7 @@ PyErr_SetString(PyExc_TypeError, "group id too big"); Py_DECREF(elem); - return NULL; + goto done; } } Py_DECREF(elem); @@ -5767,8 +5771,11 @@ if (setgroups(len, grouplist) < 0) return posix_error(); - Py_INCREF(Py_None); - return Py_None; + ret = Py_None; + Py_INCREF(ret); + done: + PyMem_FREE(grouplist); + return ret; } #endif /* HAVE_SETGROUPS */