mirror of
https://github.com/AdaCore/cpython.git
synced 2026-02-12 12:57:15 -08:00
merge r68768 to py3k
This commit is contained in:
@@ -62,6 +62,8 @@ else:
|
||||
HAVE_GETVALUE = not getattr(_multiprocessing,
|
||||
'HAVE_BROKEN_SEM_GETVALUE', False)
|
||||
|
||||
WIN32 = (sys.platform == "win32")
|
||||
|
||||
#
|
||||
# Creates a wrapper for a function which records the time it takes to finish
|
||||
#
|
||||
@@ -1683,6 +1685,18 @@ class _TestLogging(BaseTestCase):
|
||||
logger.setLevel(level=LOG_LEVEL)
|
||||
|
||||
#
|
||||
# Test to verify handle verification, see issue 3321
|
||||
#
|
||||
|
||||
class TestInvalidHandle(unittest.TestCase):
|
||||
|
||||
def test_invalid_handles(self):
|
||||
if WIN32:
|
||||
return
|
||||
conn = _multiprocessing.Connection(44977608)
|
||||
self.assertRaises(IOError, conn.poll)
|
||||
self.assertRaises(IOError, _multiprocessing.Connection, -1)
|
||||
#
|
||||
# Functions used to create test cases from the base ones in this module
|
||||
#
|
||||
|
||||
@@ -1786,7 +1800,7 @@ class OtherTest(unittest.TestCase):
|
||||
multiprocessing.connection.answer_challenge,
|
||||
_FakeConnection(), b'abc')
|
||||
|
||||
testcases_other = [OtherTest]
|
||||
testcases_other = [OtherTest, TestInvalidHandle]
|
||||
|
||||
#
|
||||
#
|
||||
|
||||
@@ -143,6 +143,10 @@ Library
|
||||
- Issue #4959: inspect.formatargspec now works for keyword only arguments
|
||||
without defaults.
|
||||
|
||||
- Issue #3321: _multiprocessing.Connection() doesn't check handle; added checks
|
||||
for *nix machines for negative handles and large int handles. Without this check
|
||||
it is possible to segfault the interpreter.
|
||||
|
||||
- Issue #4449: AssertionError in mp_benchmarks.py, caused by an underlying issue
|
||||
in sharedctypes.py.
|
||||
|
||||
|
||||
@@ -362,7 +362,7 @@ connection_poll(ConnectionObject *self, PyObject *args)
|
||||
}
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
res = conn_poll(self, timeout);
|
||||
res = conn_poll(self, timeout, _save);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
switch (res) {
|
||||
|
||||
@@ -153,11 +153,23 @@ conn_recv_string(ConnectionObject *conn, char *buffer,
|
||||
*/
|
||||
|
||||
static int
|
||||
conn_poll(ConnectionObject *conn, double timeout)
|
||||
conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save)
|
||||
{
|
||||
int res;
|
||||
fd_set rfds;
|
||||
|
||||
/*
|
||||
* Verify the handle, issue 3321. Not required for windows.
|
||||
*/
|
||||
#ifndef MS_WINDOWS
|
||||
if (((int)conn->handle) < 0 || ((int)conn->handle) >= FD_SETSIZE) {
|
||||
Py_BLOCK_THREADS
|
||||
PyErr_SetString(PyExc_IOError, "handle out of range in select()");
|
||||
Py_UNBLOCK_THREADS
|
||||
return MP_EXCEPTION_HAS_BEEN_SET;
|
||||
}
|
||||
#endif
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_SET((SOCKET)conn->handle, &rfds);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user