Fixes issue #7999: os.setreuid() and os.setregid() would refuse to accept

a -1 parameter on some platforms such as OS X.
This commit is contained in:
Gregory P. Smith 2010-03-01 05:43:43 +00:00
parent 3c699d334a
commit 6a65f85e79
3 changed files with 25 additions and 6 deletions

View File

@ -642,6 +642,7 @@ if sys.platform != 'win32':
self.assertRaises(os.error, os.setreuid, 0, 0) self.assertRaises(os.error, os.setreuid, 0, 0)
self.assertRaises(OverflowError, os.setreuid, 1<<32, 0) self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
self.assertRaises(OverflowError, os.setreuid, 0, 1<<32) self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
os.setreuid(-1, -1) # Does nothing, but it needs to accept -1
if hasattr(os, 'setregid'): if hasattr(os, 'setregid'):
def test_setregid(self): def test_setregid(self):
@ -649,6 +650,7 @@ if sys.platform != 'win32':
self.assertRaises(os.error, os.setregid, 0, 0) self.assertRaises(os.error, os.setregid, 0, 0)
self.assertRaises(OverflowError, os.setregid, 1<<32, 0) self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32) self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
os.setregid(-1, -1) # Does nothing, but it needs to accept -1
else: else:
class PosixUidGidTests(unittest.TestCase): class PosixUidGidTests(unittest.TestCase):
pass pass

View File

@ -93,6 +93,9 @@ Extension Modules
thread could raise an incorrect RuntimeError about not holding the import thread could raise an incorrect RuntimeError about not holding the import
lock. The import lock is now reinitialized after fork. lock. The import lock is now reinitialized after fork.
- Issue #7999: os.setreuid() and os.setregid() would refuse to accept a -1
parameter on some platforms such as OS X.
Tests Tests
----- -----

View File

@ -5650,9 +5650,16 @@ posix_setreuid (PyObject *self, PyObject *args)
uid_t ruid, euid; uid_t ruid, euid;
if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg)) if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
return NULL; return NULL;
ruid = ruid_arg; if (ruid_arg == -1)
ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
else
ruid = ruid_arg; /* otherwise, assign from our long */
if (euid_arg == -1)
euid = (uid_t)-1;
else
euid = euid_arg; euid = euid_arg;
if (euid != euid_arg || ruid != ruid_arg) { if ((euid_arg != -1 && euid != euid_arg) ||
(ruid_arg != -1 && ruid != ruid_arg)) {
PyErr_SetString(PyExc_OverflowError, "user id too big"); PyErr_SetString(PyExc_OverflowError, "user id too big");
return NULL; return NULL;
} }
@ -5677,9 +5684,16 @@ posix_setregid (PyObject *self, PyObject *args)
gid_t rgid, egid; gid_t rgid, egid;
if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg)) if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
return NULL; return NULL;
rgid = rgid_arg; if (rgid_arg == -1)
rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
else
rgid = rgid_arg; /* otherwise, assign from our long */
if (egid_arg == -1)
egid = (gid_t)-1;
else
egid = egid_arg; egid = egid_arg;
if (egid != egid_arg || rgid != rgid_arg) { if ((egid_arg != -1 && egid != egid_arg) ||
(rgid_arg != -1 && rgid != rgid_arg)) {
PyErr_SetString(PyExc_OverflowError, "group id too big"); PyErr_SetString(PyExc_OverflowError, "group id too big");
return NULL; return NULL;
} }