Issue #18787: spwd.getspnam() now raises a PermissionError if the user

doesn't have privileges.
This commit is contained in:
Berker Peksag 2016-03-19 11:44:17 +02:00
parent af4a1f20ba
commit 3c3d7f4b99
5 changed files with 22 additions and 1 deletions

View File

@ -54,6 +54,9 @@ The following functions are defined:
Return the shadow password database entry for the given user name.
.. versionchanged:: 3.6
Raises a :exc:`PermissionError` instead of :exc:`KeyError` if the user
doesn't have privileges.
.. function:: getspall()

View File

@ -471,6 +471,8 @@ Changes in the Python API
the exception will stop a single-threaded server. (Contributed by
Martin Panter in :issue:`23430`.)
* :func:`spwd.getspnam` now raises a :exc:`PermissionError` instead of
:exc:`KeyError` if the user doesn't have privileges.
Changes in the C API
--------------------

View File

@ -56,5 +56,15 @@ class TestSpwdRoot(unittest.TestCase):
self.assertRaises(TypeError, spwd.getspnam, bytes_name)
@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() != 0,
'non-root user required')
class TestSpwdNonRoot(unittest.TestCase):
def test_getspnam_exception(self):
with self.assertRaises(PermissionError) as cm:
spwd.getspnam('bin')
self.assertEqual(str(cm.exception), '[Errno 13] Permission denied')
if __name__ == "__main__":
unittest.main()

View File

@ -226,6 +226,9 @@ Core and Builtins
Library
-------
- Issue #18787: spwd.getspnam() now raises a PermissionError if the user
doesn't have privileges.
- Issue #26560: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby.

View File

@ -137,7 +137,10 @@ spwd_getspnam_impl(PyModuleDef *module, PyObject *arg)
if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
goto out;
if ((p = getspnam(name)) == NULL) {
PyErr_SetString(PyExc_KeyError, "getspnam(): name not found");
if (errno != 0)
PyErr_SetFromErrno(PyExc_OSError);
else
PyErr_SetString(PyExc_KeyError, "getspnam(): name not found");
goto out;
}
retval = mkspent(p);