mirror of https://github.com/python/cpython
bpo-37013: Fix the error handling in socket.if_indextoname() (GH-13503)
* Fix a crash when pass UINT_MAX. * Fix an integer overflow on 64-bit non-Windows platforms.
This commit is contained in:
parent
70a38ffb3d
commit
0daf555c6f
|
@ -1082,7 +1082,20 @@ class GeneralModuleTests(unittest.TestCase):
|
||||||
'socket.if_indextoname() not available.')
|
'socket.if_indextoname() not available.')
|
||||||
def testInvalidInterfaceIndexToName(self):
|
def testInvalidInterfaceIndexToName(self):
|
||||||
self.assertRaises(OSError, socket.if_indextoname, 0)
|
self.assertRaises(OSError, socket.if_indextoname, 0)
|
||||||
|
self.assertRaises(OverflowError, socket.if_indextoname, -1)
|
||||||
|
self.assertRaises(OverflowError, socket.if_indextoname, 2**1000)
|
||||||
self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
|
self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
|
||||||
|
if hasattr(socket, 'if_nameindex'):
|
||||||
|
indices = dict(socket.if_nameindex())
|
||||||
|
for index in indices:
|
||||||
|
index2 = index + 2**32
|
||||||
|
if index2 not in indices:
|
||||||
|
with self.assertRaises((OverflowError, OSError)):
|
||||||
|
socket.if_indextoname(index2)
|
||||||
|
for index in 2**32-1, 2**64-1:
|
||||||
|
if index not in indices:
|
||||||
|
with self.assertRaises((OverflowError, OSError)):
|
||||||
|
socket.if_indextoname(index)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
|
@unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
|
||||||
'socket.if_nametoindex() not available.')
|
'socket.if_nametoindex() not available.')
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fix a crash in :func:`socket.if_indextoname` with specific value (UINT_MAX).
|
||||||
|
Fix an integer overflow in :func:`socket.if_indextoname` on 64-bit
|
||||||
|
non-Windows platforms.
|
|
@ -7071,17 +7071,23 @@ _socket_socket_if_nametoindex_impl(PySocketSockObject *self, PyObject *oname)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
socket_if_indextoname(PyObject *self, PyObject *arg)
|
socket_if_indextoname(PyObject *self, PyObject *arg)
|
||||||
{
|
{
|
||||||
#ifdef MS_WINDOWS
|
unsigned long index_long = PyLong_AsUnsignedLong(arg);
|
||||||
NET_IFINDEX index;
|
if (index_long == (unsigned long) -1 && PyErr_Occurred()) {
|
||||||
#else
|
|
||||||
unsigned long index;
|
|
||||||
#endif
|
|
||||||
char name[IF_NAMESIZE + 1];
|
|
||||||
|
|
||||||
index = PyLong_AsUnsignedLong(arg);
|
|
||||||
if (index == (unsigned long) -1)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
NET_IFINDEX index = (NET_IFINDEX)index_long;
|
||||||
|
#else
|
||||||
|
unsigned int index = (unsigned int)index_long;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((unsigned long)index != index_long) {
|
||||||
|
PyErr_SetString(PyExc_OverflowError, "index is too large");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char name[IF_NAMESIZE + 1];
|
||||||
if (if_indextoname(index, name) == NULL) {
|
if (if_indextoname(index, name) == NULL) {
|
||||||
PyErr_SetFromErrno(PyExc_OSError);
|
PyErr_SetFromErrno(PyExc_OSError);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue