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. 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() .. function:: getspall()

View File

@ -471,6 +471,8 @@ Changes in the Python API
the exception will stop a single-threaded server. (Contributed by the exception will stop a single-threaded server. (Contributed by
Martin Panter in :issue:`23430`.) 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 Changes in the C API
-------------------- --------------------

View File

@ -56,5 +56,15 @@ class TestSpwdRoot(unittest.TestCase):
self.assertRaises(TypeError, spwd.getspnam, bytes_name) 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__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -226,6 +226,9 @@ Core and Builtins
Library 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. - Issue #26560: Avoid potential ValueError in BaseHandler.start_response.
Initial patch by Peter Inglesby. 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) if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
goto out; goto out;
if ((p = getspnam(name)) == NULL) { 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; goto out;
} }
retval = mkspent(p); retval = mkspent(p);