diff options
-rw-r--r-- | Lib/test/test_pwd.py | 9 | ||||
-rw-r--r-- | Modules/pwdmodule.c | 6 |
2 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py index ae1c8fe..aa8f69f 100644 --- a/Lib/test/test_pwd.py +++ b/Lib/test/test_pwd.py @@ -49,7 +49,9 @@ class PwdTest(unittest.TestCase): def test_errors(self): self.assertRaises(TypeError, pwd.getpwuid) + self.assertRaises(TypeError, pwd.getpwuid, 3.14) self.assertRaises(TypeError, pwd.getpwnam) + self.assertRaises(TypeError, pwd.getpwnam, 42) self.assertRaises(TypeError, pwd.getpwall, 42) # try to get some errors @@ -93,6 +95,13 @@ class PwdTest(unittest.TestCase): self.assertNotIn(fakeuid, byuids) self.assertRaises(KeyError, pwd.getpwuid, fakeuid) + # -1 shouldn't be a valid uid because it has a special meaning in many + # uid-related functions + self.assertRaises(KeyError, pwd.getpwuid, -1) + # should be out of uid_t range + self.assertRaises(KeyError, pwd.getpwuid, 2**128) + self.assertRaises(KeyError, pwd.getpwuid, -2**128) + def test_main(): support.run_unittest(PwdTest) diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index 4807aa3..d4ef733 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -106,8 +106,12 @@ pwd_getpwuid(PyObject *self, PyObject *args) { uid_t uid; struct passwd *p; - if (!PyArg_ParseTuple(args, "O&:getpwuid", _Py_Uid_Converter, &uid)) + if (!PyArg_ParseTuple(args, "O&:getpwuid", _Py_Uid_Converter, &uid)) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_Format(PyExc_KeyError, + "getpwuid(): uid not found"); return NULL; + } if ((p = getpwuid(uid)) == NULL) { PyObject *uid_obj = _PyLong_FromUid(uid); if (uid_obj == NULL) |