Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by

Vilmos Nebehaj.
parent 70efbefc
...@@ -846,6 +846,13 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -846,6 +846,13 @@ class GeneralModuleTests(unittest.TestCase):
srv.listen(0) srv.listen(0)
srv.close() srv.close()
@unittest.skipUnless(SUPPORTS_IPV6, 'IPv6 required for this test.')
def test_flowinfo(self):
self.assertRaises(OverflowError, socket.getnameinfo,
('::1',0, 0xffffffff), 0)
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
@unittest.skipUnless(thread, 'Threading required for this test.') @unittest.skipUnless(thread, 'Threading required for this test.')
class BasicTCPTest(SocketConnectedTest): class BasicTCPTest(SocketConnectedTest):
......
...@@ -643,6 +643,7 @@ John Nagle ...@@ -643,6 +643,7 @@ John Nagle
Takahiro Nakayama Takahiro Nakayama
Travers Naran Travers Naran
Charles-François Natali Charles-François Natali
Vilmos Nebehaj
Fredrik Nehr Fredrik Nehr
Trent Nelson Trent Nelson
Tony Nelson Tony Nelson
......
...@@ -345,6 +345,9 @@ Tests ...@@ -345,6 +345,9 @@ Tests
Extension Modules Extension Modules
----------------- -----------------
- Issue #9975: socket: Fix incorrect use of flowinfo and scope_id. Patch by
Vilmos Nebehaj.
- Issue #13159: FileIO and BZ2File now use a linear-time buffer growth - Issue #13159: FileIO and BZ2File now use a linear-time buffer growth
strategy instead of a quadratic-time one. strategy instead of a quadratic-time one.
......
...@@ -1065,10 +1065,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) ...@@ -1065,10 +1065,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
PyObject *ret = NULL; PyObject *ret = NULL;
if (addrobj) { if (addrobj) {
a = (struct sockaddr_in6 *)addr; a = (struct sockaddr_in6 *)addr;
ret = Py_BuildValue("Oiii", ret = Py_BuildValue("OiII",
addrobj, addrobj,
ntohs(a->sin6_port), ntohs(a->sin6_port),
a->sin6_flowinfo, ntohl(a->sin6_flowinfo),
a->sin6_scope_id); a->sin6_scope_id);
Py_DECREF(addrobj); Py_DECREF(addrobj);
} }
...@@ -1319,7 +1319,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1319,7 +1319,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{ {
struct sockaddr_in6* addr; struct sockaddr_in6* addr;
char *host; char *host;
int port, flowinfo, scope_id, result; int port, result;
unsigned int flowinfo, scope_id;
flowinfo = scope_id = 0; flowinfo = scope_id = 0;
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
...@@ -1329,7 +1330,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1329,7 +1330,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
Py_TYPE(args)->tp_name); Py_TYPE(args)->tp_name);
return 0; return 0;
} }
if (!PyArg_ParseTuple(args, "eti|ii", if (!PyArg_ParseTuple(args, "eti|II",
"idna", &host, &port, &flowinfo, "idna", &host, &port, &flowinfo,
&scope_id)) { &scope_id)) {
return 0; return 0;
...@@ -1346,9 +1347,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1346,9 +1347,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
"getsockaddrarg: port must be 0-65535."); "getsockaddrarg: port must be 0-65535.");
return 0; 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_family = s->sock_family;
addr->sin6_port = htons((short)port); addr->sin6_port = htons((short)port);
addr->sin6_flowinfo = flowinfo; addr->sin6_flowinfo = htonl(flowinfo);
addr->sin6_scope_id = scope_id; addr->sin6_scope_id = scope_id;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
...@@ -4104,7 +4111,8 @@ socket_getnameinfo(PyObject *self, PyObject *args) ...@@ -4104,7 +4111,8 @@ socket_getnameinfo(PyObject *self, PyObject *args)
PyObject *sa = (PyObject *)NULL; PyObject *sa = (PyObject *)NULL;
int flags; int flags;
char *hostp; char *hostp;
int port, flowinfo, scope_id; int port;
unsigned int flowinfo, scope_id;
char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV]; char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
struct addrinfo hints, *res = NULL; struct addrinfo hints, *res = NULL;
int error; int error;
...@@ -4118,9 +4126,14 @@ socket_getnameinfo(PyObject *self, PyObject *args) ...@@ -4118,9 +4126,14 @@ socket_getnameinfo(PyObject *self, PyObject *args)
"getnameinfo() argument 1 must be a tuple"); "getnameinfo() argument 1 must be a tuple");
return NULL; return NULL;
} }
if (!PyArg_ParseTuple(sa, "si|ii", if (!PyArg_ParseTuple(sa, "si|II",
&hostp, &port, &flowinfo, &scope_id)) &hostp, &port, &flowinfo, &scope_id))
return NULL; 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); PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; hints.ai_family = AF_UNSPEC;
...@@ -4155,7 +4168,7 @@ socket_getnameinfo(PyObject *self, PyObject *args) ...@@ -4155,7 +4168,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
{ {
struct sockaddr_in6 *sin6; struct sockaddr_in6 *sin6;
sin6 = (struct sockaddr_in6 *)res->ai_addr; sin6 = (struct sockaddr_in6 *)res->ai_addr;
sin6->sin6_flowinfo = flowinfo; sin6->sin6_flowinfo = htonl(flowinfo);
sin6->sin6_scope_id = scope_id; sin6->sin6_scope_id = scope_id;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment