]> granicus.if.org Git - python/commitdiff
Correct getnameinfo refcounting and tuple parsing. Fixes #476648.
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 2 Nov 2001 23:34:52 +0000 (23:34 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 2 Nov 2001 23:34:52 +0000 (23:34 +0000)
Lib/test/test_socket.py
Modules/socketmodule.c

index 1880b115fde0d3ab4870a32d6c894daa6abea672..e923d822aac08788d19cd674cbf0dcf48b4b42eb 100644 (file)
@@ -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:
index e5d850cb3bc87157b466998767450228278b25b7..1ecb2810c95187cc92770842c03c673c18bd66fa 100644 (file)
@@ -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;
 }