Correct getnameinfo refcounting and tuple parsing. Fixes #476648.
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 @@
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 @@
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;
- n = PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, scope_id);
- if (n == 0)
- goto fail;
+ if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
+ return NULL;
PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
@@ -2597,7 +2596,6 @@
fail:
if (res)
freeaddrinfo(res);
- Py_XDECREF(sa);
return ret;
}