From: Serhiy Storchaka Date: Mon, 18 Jan 2016 16:49:57 +0000 (+0200) Subject: Issue #26129: Deprecated accepting non-integers in grp.getgrgid(). X-Git-Tag: v3.6.0a1~747 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9cc4ed5c7a86b2aa58176222107dbb01d40a3680;p=python Issue #26129: Deprecated accepting non-integers in grp.getgrgid(). --- diff --git a/Doc/library/grp.rst b/Doc/library/grp.rst index 88821406a3..c840cfe67a 100644 --- a/Doc/library/grp.rst +++ b/Doc/library/grp.rst @@ -42,6 +42,9 @@ It defines the following items: Return the group database entry for the given numeric group ID. :exc:`KeyError` is raised if the entry asked for cannot be found. + .. deprecated:: 3.6 + Since Python 3.6 the support of non-integer arguments like floats or + strings in :func:`getgrgid` is deprecated. .. function:: getgrnam(name) diff --git a/Lib/test/test_grp.py b/Lib/test/test_grp.py index 272b08615d..69095a3fb9 100644 --- a/Lib/test/test_grp.py +++ b/Lib/test/test_grp.py @@ -92,5 +92,15 @@ class GroupDatabaseTestCase(unittest.TestCase): self.assertRaises(KeyError, grp.getgrgid, fakegid) + def test_noninteger_gid(self): + entries = grp.getgrall() + if not entries: + self.skipTest('no groups') + # Choose an existent gid. + gid = entries[0][2] + self.assertWarns(DeprecationWarning, grp.getgrgid, float(gid)) + self.assertWarns(DeprecationWarning, grp.getgrgid, str(gid)) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 4564e29095..d3edac7552 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -131,6 +131,8 @@ Core and Builtins Library ------- +- Issue #26129: Deprecated accepting non-integers in grp.getgrgid(). + - Issue #25850: Use cross-compilation by default for 64-bit Windows. - Issue #25822: Add docstrings to the fields of urllib.parse results. diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 403e434697..5ad87f1ca8 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -100,14 +100,25 @@ grp_getgrgid_impl(PyModuleDef *module, PyObject *id) gid_t gid; struct group *p; - py_int_id = PyNumber_Long(id); - if (!py_int_id) + if (!_Py_Gid_Converter(id, &gid)) { + if (!PyErr_ExceptionMatches(PyExc_TypeError)) { return NULL; - if (!_Py_Gid_Converter(py_int_id, &gid)) { + } + PyErr_Clear(); + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "group id must be int, not %.200", + id->ob_type->tp_name) < 0) { + return NULL; + } + py_int_id = PyNumber_Long(id); + if (!py_int_id) + return NULL; + if (!_Py_Gid_Converter(py_int_id, &gid)) { + Py_DECREF(py_int_id); + return NULL; + } Py_DECREF(py_int_id); - return NULL; } - Py_DECREF(py_int_id); if ((p = getgrgid(gid)) == NULL) { PyObject *gid_obj = _PyLong_FromGid(gid);