]> granicus.if.org Git - python/commitdiff
Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
authorCharles-François Natali <neologix@free.fr>
Mon, 2 Jan 2012 14:38:27 +0000 (15:38 +0100)
committerCharles-François Natali <neologix@free.fr>
Mon, 2 Jan 2012 14:38:27 +0000 (15:38 +0100)
Vilmos Nebehaj.

Lib/test/test_socket.py
Misc/ACKS
Misc/NEWS
Modules/socketmodule.c

index 8189bff7b3b9f91d01a0bcc7ae23f524549fdae1..13d0eb4b8b5ddd762f71ae295dca96e37a6485bc 100644 (file)
@@ -706,6 +706,16 @@ class GeneralModuleTests(unittest.TestCase):
         srv.listen(0)
         srv.close()
 
+    @unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
+    def test_flowinfo(self):
+        self.assertRaises(OverflowError, socket.getnameinfo,
+                          ('::1',0, 0xffffffff), 0)
+        s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
+        try:
+            self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
+        finally:
+            s.close()
+
 
 @unittest.skipUnless(thread, 'Threading required for this test.')
 class BasicTCPTest(SocketConnectedTest):
index c547c3170ca28ba83ae46ae01f235bdcac312a94..5743a0234cdfff0b738056c0e02ad0e762a0f664 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -590,6 +590,7 @@ John Nagle
 Takahiro Nakayama
 Travers Naran
 Charles-François Natali
+Vilmos Nebehaj
 Fredrik Nehr
 Trent Nelson
 Tony Nelson
index 4f921a9a9ae3753a22e819efab12f694d53bdd39..82551d2defcdb3b0ebe2c0b7ca0f48008e79e41d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -368,6 +368,9 @@ Library
 Extension Modules
 -----------------
 
+- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
+  Vilmos Nebehaj.
+
 - Issue #13159: FileIO, BZ2File, and the built-in file class now use a
   linear-time buffer growth strategy instead of a quadratic one.
 
index 279a09079a89198e81568620fa3e2c71f0bd814c..c5215211f5b96928e7ff70a85f848eb76618cb80 100644 (file)
@@ -1028,10 +1028,10 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
         PyObject *ret = NULL;
         if (addrobj) {
             a = (struct sockaddr_in6 *)addr;
-            ret = Py_BuildValue("Oiii",
+            ret = Py_BuildValue("OiII",
                                 addrobj,
                                 ntohs(a->sin6_port),
-                                a->sin6_flowinfo,
+                                ntohl(a->sin6_flowinfo),
                                 a->sin6_scope_id);
             Py_DECREF(addrobj);
         }
@@ -1282,7 +1282,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
     {
         struct sockaddr_in6* addr;
         char *host;
-        int port, flowinfo, scope_id, result;
+        int port, result;
+        unsigned int flowinfo, scope_id;
         flowinfo = scope_id = 0;
         if (!PyTuple_Check(args)) {
             PyErr_Format(
@@ -1292,7 +1293,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
                 Py_TYPE(args)->tp_name);
             return 0;
         }
-        if (!PyArg_ParseTuple(args, "eti|ii",
+        if (!PyArg_ParseTuple(args, "eti|II",
                               "idna", &host, &port, &flowinfo,
                               &scope_id)) {
             return 0;
@@ -1309,9 +1310,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
                 "getsockaddrarg: port must be 0-65535.");
             return 0;
         }
+        if (flowinfo < 0 || flowinfo > 0xfffff) {
+            PyErr_SetString(
+                PyExc_OverflowError,
+                "getsockaddrarg: flowinfo must be 0-1048575.");
+            return 0;
+        }
         addr->sin6_family = s->sock_family;
         addr->sin6_port = htons((short)port);
-        addr->sin6_flowinfo = flowinfo;
+        addr->sin6_flowinfo = htonl(flowinfo);
         addr->sin6_scope_id = scope_id;
         *len_ret = sizeof *addr;
         return 1;
@@ -4156,7 +4163,8 @@ socket_getnameinfo(PyObject *self, PyObject *args)
     PyObject *sa = (PyObject *)NULL;
     int flags;
     char *hostp;
-    int port, flowinfo, scope_id;
+    int port;
+    unsigned int flowinfo, scope_id;
     char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
     struct addrinfo hints, *res = NULL;
     int error;
@@ -4170,9 +4178,14 @@ socket_getnameinfo(PyObject *self, PyObject *args)
                         "getnameinfo() argument 1 must be a tuple");
         return NULL;
     }
-    if (!PyArg_ParseTuple(sa, "si|ii",
+    if (!PyArg_ParseTuple(sa, "si|II",
                           &hostp, &port, &flowinfo, &scope_id))
         return NULL;
+    if (flowinfo < 0 || flowinfo > 0xfffff) {
+        PyErr_SetString(PyExc_OverflowError,
+                        "getsockaddrarg: flowinfo must be 0-1048575.");
+        return NULL;
+    }
     PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = AF_UNSPEC;
@@ -4206,7 +4219,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
         {
         struct sockaddr_in6 *sin6;
         sin6 = (struct sockaddr_in6 *)res->ai_addr;
-        sin6->sin6_flowinfo = flowinfo;
+        sin6->sin6_flowinfo = htonl(flowinfo);
         sin6->sin6_scope_id = scope_id;
         break;
         }