From 982ecd4c7847e4c85926bc982d61797564d68cf2 Mon Sep 17 00:00:00 2001 From: Jesse Noller Date: Thu, 12 Feb 2009 19:44:58 +0000 Subject: Merge 68778,68788 to maint --- Lib/test/test_multiprocessing.py | 16 +++++++++++++++- Misc/NEWS | 7 +++++++ Modules/_multiprocessing/connection.h | 2 +- Modules/_multiprocessing/pipe_connection.c | 4 +--- Modules/_multiprocessing/socket_connection.c | 14 +++++++++++++- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index 4e5d759..9a307de 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -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] # # diff --git a/Misc/NEWS b/Misc/NEWS index 8e3570a..73779bf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -129,6 +129,13 @@ Library - Issue #3386: distutils.sysconfig.get_python_lib prefix argument was ignored under NT and OS2. Patch by Philip Jenvey. +- 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. + - Issue #4890: Handle empty text search pattern in Tkinter.Text.search. - Partial fix to issue #1731706: memory leak in Tkapp_Call when calling diff --git a/Modules/_multiprocessing/connection.h b/Modules/_multiprocessing/connection.h index c1e926a..581beac 100644 --- a/Modules/_multiprocessing/connection.h +++ b/Modules/_multiprocessing/connection.h @@ -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) { diff --git a/Modules/_multiprocessing/pipe_connection.c b/Modules/_multiprocessing/pipe_connection.c index ad16fc8..27e79dd 100644 --- a/Modules/_multiprocessing/pipe_connection.c +++ b/Modules/_multiprocessing/pipe_connection.c @@ -83,10 +83,8 @@ conn_recv_string(ConnectionObject *conn, char *buffer, * Check whether any data is available for reading */ -#define conn_poll(conn, timeout) conn_poll_save(conn, timeout, _save) - static int -conn_poll_save(ConnectionObject *conn, double timeout, PyThreadState *_save) +conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save) { DWORD bytes, deadline, delay; int difference, res; diff --git a/Modules/_multiprocessing/socket_connection.c b/Modules/_multiprocessing/socket_connection.c index e5d2d15..ad4005b 100644 --- a/Modules/_multiprocessing/socket_connection.c +++ b/Modules/_multiprocessing/socket_connection.c @@ -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); -- cgit v0.12