diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2009-04-06 06:47:37 +0000 |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2009-04-06 06:47:37 +0000 |
commit | dd7b6302ee1b4ee541aa2070380d9262cd1a907b (patch) | |
tree | 83142c20a5a94b0bf018aa2fc9510b9417c3f910 | |
parent | 28f4d20508495f0046c173e2528d9b2315def130 (diff) | |
download | cpython-git-dd7b6302ee1b4ee541aa2070380d9262cd1a907b.tar.gz |
Merged revisions 71299 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r71299 | gregory.p.smith | 2009-04-05 16:43:58 -0700 (Sun, 05 Apr 2009) | 3 lines
Fixes issue5705: os.setuid() and friends did not accept the same range of
values that pwd.getpwnam() returns.
........
-rw-r--r-- | Lib/test/test_os.py | 45 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/posixmodule.c | 72 |
3 files changed, 102 insertions, 18 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 91dcd0462d..909e0abbec 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -600,6 +600,48 @@ if sys.platform != 'win32': class Win32ErrorTests(unittest.TestCase): pass + class PosixUidGidTests(unittest.TestCase): + if hasattr(os, 'setuid'): + def test_setuid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.setuid, 0) + self.assertRaises(OverflowError, os.setuid, 1<<32) + + if hasattr(os, 'setgid'): + def test_setgid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.setgid, 0) + self.assertRaises(OverflowError, os.setgid, 1<<32) + + if hasattr(os, 'seteuid'): + def test_seteuid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.seteuid, 0) + self.assertRaises(OverflowError, os.seteuid, 1<<32) + + if hasattr(os, 'setegid'): + def test_setegid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.setegid, 0) + self.assertRaises(OverflowError, os.setegid, 1<<32) + + if hasattr(os, 'setreuid'): + def test_setreuid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.setreuid, 0, 0) + self.assertRaises(OverflowError, os.setreuid, 1<<32, 0) + self.assertRaises(OverflowError, os.setreuid, 0, 1<<32) + + if hasattr(os, 'setregid'): + def test_setregid(self): + if os.getuid() != 0: + self.assertRaises(os.error, os.setregid, 0, 0) + self.assertRaises(OverflowError, os.setregid, 1<<32, 0) + self.assertRaises(OverflowError, os.setregid, 0, 1<<32) +else: + class PosixUidGidTests(unittest.TestCase): + pass + def test_main(): test_support.run_unittest( FileTests, @@ -611,7 +653,8 @@ def test_main(): DevNullTests, URandomTests, Win32ErrorTests, - TestInvalidFD + TestInvalidFD, + PosixUidGidTests ) if __name__ == "__main__": @@ -97,6 +97,9 @@ Core and Builtins - Issue #3845: In PyRun_SimpleFileExFlags avoid invalid memory access with short file names. +- Issue #5705: os.setuid() would not accept values > 2**31-1 but pwd.getpwnam() + returned them on 64bit platforms. + Library ------- diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 5858b4af12..f355cf6e5d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5505,9 +5505,15 @@ Set the current process's user id."); static PyObject * posix_setuid(PyObject *self, PyObject *args) { - int uid; - if (!PyArg_ParseTuple(args, "i:setuid", &uid)) + long uid_arg; + uid_t uid; + if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg)) return NULL; + uid = uid_arg; + if (uid != uid_arg) { + PyErr_SetString(PyExc_OverflowError, "user id too big"); + return NULL; + } if (setuid(uid) < 0) return posix_error(); Py_INCREF(Py_None); @@ -5524,10 +5530,16 @@ Set the current process's effective user id."); static PyObject * posix_seteuid (PyObject *self, PyObject *args) { - int euid; - if (!PyArg_ParseTuple(args, "i", &euid)) { + long euid_arg; + uid_t euid; + if (!PyArg_ParseTuple(args, "l", &euid_arg)) + return NULL; + euid = euid_arg; + if (euid != euid_arg) { + PyErr_SetString(PyExc_OverflowError, "user id too big"); return NULL; - } else if (seteuid(euid) < 0) { + } + if (seteuid(euid) < 0) { return posix_error(); } else { Py_INCREF(Py_None); @@ -5544,10 +5556,16 @@ Set the current process's effective group id."); static PyObject * posix_setegid (PyObject *self, PyObject *args) { - int egid; - if (!PyArg_ParseTuple(args, "i", &egid)) { + long egid_arg; + gid_t egid; + if (!PyArg_ParseTuple(args, "l", &egid_arg)) + return NULL; + egid = egid_arg; + if (egid != egid_arg) { + PyErr_SetString(PyExc_OverflowError, "group id too big"); return NULL; - } else if (setegid(egid) < 0) { + } + if (setegid(egid) < 0) { return posix_error(); } else { Py_INCREF(Py_None); @@ -5564,10 +5582,17 @@ Set the current process's real and effective user ids."); static PyObject * posix_setreuid (PyObject *self, PyObject *args) { - int ruid, euid; - if (!PyArg_ParseTuple(args, "ii", &ruid, &euid)) { + long ruid_arg, euid_arg; + uid_t ruid, euid; + if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg)) return NULL; - } else if (setreuid(ruid, euid) < 0) { + ruid = ruid_arg; + euid = euid_arg; + if (euid != euid_arg || ruid != ruid_arg) { + PyErr_SetString(PyExc_OverflowError, "user id too big"); + return NULL; + } + if (setreuid(ruid, euid) < 0) { return posix_error(); } else { Py_INCREF(Py_None); @@ -5584,10 +5609,17 @@ Set the current process's real and effective group ids."); static PyObject * posix_setregid (PyObject *self, PyObject *args) { - int rgid, egid; - if (!PyArg_ParseTuple(args, "ii", &rgid, &egid)) { + long rgid_arg, egid_arg; + gid_t rgid, egid; + if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg)) + return NULL; + rgid = rgid_arg; + egid = egid_arg; + if (egid != egid_arg || rgid != rgid_arg) { + PyErr_SetString(PyExc_OverflowError, "group id too big"); return NULL; - } else if (setregid(rgid, egid) < 0) { + } + if (setregid(rgid, egid) < 0) { return posix_error(); } else { Py_INCREF(Py_None); @@ -5604,9 +5636,15 @@ Set the current process's group id."); static PyObject * posix_setgid(PyObject *self, PyObject *args) { - int gid; - if (!PyArg_ParseTuple(args, "i:setgid", &gid)) + long gid_arg; + gid_t gid; + if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg)) + return NULL; + gid = gid_arg; + if (gid != gid_arg) { + PyErr_SetString(PyExc_OverflowError, "group id too big"); return NULL; + } if (setgid(gid) < 0) return posix_error(); Py_INCREF(Py_None); @@ -5654,7 +5692,7 @@ posix_setgroups(PyObject *self, PyObject *groups) return NULL; } grouplist[i] = x; - /* read back the value to see if it fitted in gid_t */ + /* read back to see if it fits in gid_t */ if (grouplist[i] != x) { PyErr_SetString(PyExc_TypeError, "group id too big"); |