summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles-François Natali <neologix@free.fr>2012-01-02 14:38:27 (GMT)
committerCharles-François Natali <neologix@free.fr>2012-01-02 14:38:27 (GMT)
commit3aa59e327c76e7317a2776ead387fdb33aebe7e5 (patch)
treed8f4f3b08168e5015570d5beb56d457942685081
parent8448dfa17d4c3bf9009bdb600640d7e550bad734 (diff)
downloadcpython-3aa59e327c76e7317a2776ead387fdb33aebe7e5.zip
cpython-3aa59e327c76e7317a2776ead387fdb33aebe7e5.tar.gz
cpython-3aa59e327c76e7317a2776ead387fdb33aebe7e5.tar.bz2
Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
Vilmos Nebehaj.
-rw-r--r--Lib/test/test_socket.py10
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/socketmodule.c29
4 files changed, 35 insertions, 8 deletions
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 8189bff..13d0eb4 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -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):
diff --git a/Misc/ACKS b/Misc/ACKS
index c547c31..5743a02 100644
--- 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
diff --git a/Misc/NEWS b/Misc/NEWS
index 4f921a9..82551d2 100644
--- 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.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 279a090..c521521 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -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;
}