Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 55e2238

Browse files
Raise KeyError instead of OverflowError when getpwuid's argument is out of
uid_t range.
1 parent 66383b2 commit 55e2238

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

Lib/test/test_pwd.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ def test_values(self):
4949

5050
def test_errors(self):
5151
self.assertRaises(TypeError, pwd.getpwuid)
52+
self.assertRaises(TypeError, pwd.getpwuid, 3.14)
5253
self.assertRaises(TypeError, pwd.getpwnam)
54+
self.assertRaises(TypeError, pwd.getpwnam, 42)
5355
self.assertRaises(TypeError, pwd.getpwall, 42)
5456

5557
# try to get some errors
@@ -93,6 +95,13 @@ def test_errors(self):
9395
self.assertNotIn(fakeuid, byuids)
9496
self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
9597

98+
# -1 shouldn't be a valid uid because it has a special meaning in many
99+
# uid-related functions
100+
self.assertRaises(KeyError, pwd.getpwuid, -1)
101+
# should be out of uid_t range
102+
self.assertRaises(KeyError, pwd.getpwuid, 2**128)
103+
self.assertRaises(KeyError, pwd.getpwuid, -2**128)
104+
96105
def test_main():
97106
support.run_unittest(PwdTest)
98107

Modules/pwdmodule.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,12 @@ pwd_getpwuid(PyObject *self, PyObject *args)
106106
{
107107
uid_t uid;
108108
struct passwd *p;
109-
if (!PyArg_ParseTuple(args, "O&:getpwuid", _Py_Uid_Converter, &uid))
109+
if (!PyArg_ParseTuple(args, "O&:getpwuid", _Py_Uid_Converter, &uid)) {
110+
if (PyErr_ExceptionMatches(PyExc_OverflowError))
111+
PyErr_Format(PyExc_KeyError,
112+
"getpwuid(): uid not found");
110113
return NULL;
114+
}
111115
if ((p = getpwuid(uid)) == NULL) {
112116
PyObject *uid_obj = _PyLong_FromUid(uid);
113117
if (uid_obj == NULL)

0 commit comments

Comments
 (0)