[Python-checkins] cpython: Issue #18787: spwd.getspnam() now raises a PermissionError if the user

berker.peksag python-checkins at python.org
Sat Mar 19 05:43:01 EDT 2016


https://hg.python.org/cpython/rev/a1d738158390
changeset:   100607:a1d738158390
user:        Berker Peksag <berker.peksag at gmail.com>
date:        Sat Mar 19 11:44:17 2016 +0200
summary:
  Issue #18787: spwd.getspnam() now raises a PermissionError if the user
doesn't have privileges.

files:
  Doc/library/spwd.rst  |   3 +++
  Doc/whatsnew/3.6.rst  |   2 ++
  Lib/test/test_spwd.py |  10 ++++++++++
  Misc/NEWS             |   3 +++
  Modules/spwdmodule.c  |   5 ++++-
  5 files changed, 22 insertions(+), 1 deletions(-)


diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst
--- a/Doc/library/spwd.rst
+++ b/Doc/library/spwd.rst
@@ -54,6 +54,9 @@
 
    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()
 
diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -471,6 +471,8 @@
   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
 --------------------
diff --git a/Lib/test/test_spwd.py b/Lib/test/test_spwd.py
--- a/Lib/test/test_spwd.py
+++ b/Lib/test/test_spwd.py
@@ -56,5 +56,15 @@
             self.assertRaises(TypeError, spwd.getspnam, bytes_name)
 
 
+ at 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()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -226,6 +226,9 @@
 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.
 
diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c
--- a/Modules/spwdmodule.c
+++ b/Modules/spwdmodule.c
@@ -137,7 +137,10 @@
     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);

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list