diff options
| author | Georg Brandl <georg@python.org> | 2005-11-22 19:30:31 +0000 |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2005-11-22 19:30:31 +0000 |
| commit | a13c2446dc4620f806ea5155289c36ab91cad484 (patch) | |
| tree | d3d4c289c4be411d5e5ba14942f2745fd01066ae /Modules/posixmodule.c | |
| parent | f96f5f5bbec6de78183b87da431672b8f850d73f (diff) | |
| download | cpython-git-a13c2446dc4620f806ea5155289c36ab91cad484.tar.gz | |
Bug #869197: setgroups rejects long integer argument
Diffstat (limited to 'Modules/posixmodule.c')
| -rw-r--r-- | Modules/posixmodule.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6f771595fe..a08058f6f1 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4912,13 +4912,38 @@ posix_setgroups(PyObject *self, PyObject *args) if (!elem) return NULL; if (!PyInt_Check(elem)) { - PyErr_SetString(PyExc_TypeError, - "groups must be integers"); - Py_DECREF(elem); - return NULL; + if (!PyLong_Check(elem)) { + PyErr_SetString(PyExc_TypeError, + "groups must be integers"); + Py_DECREF(elem); + return NULL; + } else { + unsigned long x = PyLong_AsUnsignedLong(elem); + if (PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "group id too big"); + Py_DECREF(elem); + return NULL; + } + grouplist[i] = x; + /* read back the value to see if it fitted in gid_t */ + if (grouplist[i] != x) { + PyErr_SetString(PyExc_TypeError, + "group id too big"); + Py_DECREF(elem); + return NULL; + } + } + } else { + long x = PyInt_AsLong(elem); + grouplist[i] = x; + if (grouplist[i] != x) { + PyErr_SetString(PyExc_TypeError, + "group id too big"); + Py_DECREF(elem); + return NULL; + } } - /* XXX: check that value fits into gid_t. */ - grouplist[i] = PyInt_AsLong(elem); Py_DECREF(elem); } |
