mirror of https://github.com/python/cpython
gh-126876: Fix socket internal_select() for large timeout (#126968)
If the timeout is larger than INT_MAX, replace it with INT_MAX, in the poll() code path. Add an unit test.
This commit is contained in:
parent
d6b3e78504
commit
b3687ad454
|
@ -5132,6 +5132,33 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
|
||||||
# send data: recv() will no longer block
|
# send data: recv() will no longer block
|
||||||
self.cli.sendall(MSG)
|
self.cli.sendall(MSG)
|
||||||
|
|
||||||
|
def testLargeTimeout(self):
|
||||||
|
# gh-126876: Check that a timeout larger than INT_MAX is replaced with
|
||||||
|
# INT_MAX in the poll() code path. The following assertion must not
|
||||||
|
# fail: assert(INT_MIN <= ms && ms <= INT_MAX).
|
||||||
|
large_timeout = _testcapi.INT_MAX + 1
|
||||||
|
|
||||||
|
# test recv() with large timeout
|
||||||
|
conn, addr = self.serv.accept()
|
||||||
|
self.addCleanup(conn.close)
|
||||||
|
try:
|
||||||
|
conn.settimeout(large_timeout)
|
||||||
|
except OverflowError:
|
||||||
|
# On Windows, settimeout() fails with OverflowError, whereas
|
||||||
|
# we want to test recv(). Just give up silently.
|
||||||
|
return
|
||||||
|
msg = conn.recv(len(MSG))
|
||||||
|
|
||||||
|
def _testLargeTimeout(self):
|
||||||
|
# test sendall() with large timeout
|
||||||
|
large_timeout = _testcapi.INT_MAX + 1
|
||||||
|
self.cli.connect((HOST, self.port))
|
||||||
|
try:
|
||||||
|
self.cli.settimeout(large_timeout)
|
||||||
|
except OverflowError:
|
||||||
|
return
|
||||||
|
self.cli.sendall(MSG)
|
||||||
|
|
||||||
|
|
||||||
class FileObjectClassTestCase(SocketConnectedTest):
|
class FileObjectClassTestCase(SocketConnectedTest):
|
||||||
"""Unit tests for the object returned by socket.makefile()
|
"""Unit tests for the object returned by socket.makefile()
|
||||||
|
|
|
@ -810,7 +810,9 @@ internal_select(PySocketSockObject *s, int writing, PyTime_t interval,
|
||||||
|
|
||||||
/* s->sock_timeout is in seconds, timeout in ms */
|
/* s->sock_timeout is in seconds, timeout in ms */
|
||||||
ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
|
ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
|
||||||
assert(ms <= INT_MAX);
|
if (ms > INT_MAX) {
|
||||||
|
ms = INT_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
/* On some OSes, typically BSD-based ones, the timeout parameter of the
|
/* On some OSes, typically BSD-based ones, the timeout parameter of the
|
||||||
poll() syscall, when negative, must be exactly INFTIM, where defined,
|
poll() syscall, when negative, must be exactly INFTIM, where defined,
|
||||||
|
@ -822,6 +824,7 @@ internal_select(PySocketSockObject *s, int writing, PyTime_t interval,
|
||||||
ms = -1;
|
ms = -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
assert(INT_MIN <= ms && ms <= INT_MAX);
|
||||||
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
n = poll(&pollfd, 1, (int)ms);
|
n = poll(&pollfd, 1, (int)ms);
|
||||||
|
|
Loading…
Reference in New Issue