From 06b1d21e7d33b2f77c05a7d8a1c51c1713f716ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Fri, 2 Nov 2001 23:34:52 +0000 Subject: Correct getnameinfo refcounting and tuple parsing. Fixes #476648. --- Lib/test/test_socket.py | 14 ++++++++++++++ Modules/socketmodule.c | 10 ++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 1880b11..e923d82 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -90,6 +90,20 @@ if hasattr(socket, 'getservbyname'): except socket.error: pass +try: + # On some versions, this loses a reference + import sys + orig = sys.getrefcount(__name__) + socket.getnameinfo(__name__,0) +except SystemError: + if sys.getrefcount(__name__) <> orig: + raise TestFailed,"socket.getnameinfo loses a reference" + +try: + # On some versions, this crashes the interpreter. + socket.getnameinfo(('x', 0, 0, 0), 0) +except socket.gaierror: + pass canfork = hasattr(os, 'fork') try: diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e5d850c..1ecb281 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -2537,18 +2537,17 @@ PySocket_getnameinfo(PyObject *self, PyObject *args) PyObject *sa = (PyObject *)NULL; int flags; char *hostp; - int n, port, flowinfo, scope_id; + int port, flowinfo, scope_id; char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV]; struct addrinfo hints, *res = NULL; int error; PyObject *ret = (PyObject *)NULL; flags = flowinfo = scope_id = 0; - if (PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags) == 0) + if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags)) + return NULL; + if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id)) return NULL; - n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id); - if (n == 0) - goto fail; PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port); memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; @@ -2597,7 +2596,6 @@ PySocket_getnameinfo(PyObject *self, PyObject *args) fail: if (res) freeaddrinfo(res); - Py_XDECREF(sa); return ret; } -- cgit v0.12