]> granicus.if.org Git - python/commitdiff
Raise KeyError instead of OverflowError when getpwuid's argument is out of
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 11 Feb 2013 18:32:47 +0000 (20:32 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 11 Feb 2013 18:32:47 +0000 (20:32 +0200)
uid_t range.

Lib/test/test_pwd.py
Modules/pwdmodule.c

index ae1c8feca6a1cbe8e919c3996d0e8a3131e94efe..aa8f69f69bfd91732c4a9a74e131e640cd98c6de 100644 (file)
@@ -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)
 
index 632ffe3be8caf277da989bf03f11670f9aab92d0..285fd9c98431d6f6058bd0db0191d9c21b585cbf 100644 (file)
@@ -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)