]> granicus.if.org Git - python/commitdiff
Merge 68768 to maint
authorJesse Noller <jnoller@gmail.com>
Mon, 30 Mar 2009 16:11:16 +0000 (16:11 +0000)
committerJesse Noller <jnoller@gmail.com>
Mon, 30 Mar 2009 16:11:16 +0000 (16:11 +0000)
Lib/test/test_multiprocessing.py
Misc/NEWS
Modules/_multiprocessing/connection.h
Modules/_multiprocessing/socket_connection.c

index 2daff7edfdb2605689aa9a80ad9aabfdd1a1f964..d4ce4fa2fe8df2d9e21fa3371c7149861b72e5ac 100644 (file)
@@ -61,6 +61,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
 #
@@ -1682,6 +1684,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
 #
 
@@ -1785,7 +1799,7 @@ class OtherTest(unittest.TestCase):
                           multiprocessing.connection.answer_challenge,
                           _FakeConnection(), b'abc')
 
-testcases_other = [OtherTest]
+testcases_other = [OtherTest, TestInvalidHandle]
 
 #
 #
index 40322d264ef7838254d6616cb86cad1ed1f76d3e..aca1cc52000e437f4ab801160cc8d9fac2e7dbb9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -150,6 +150,13 @@ Library
 - Issue #5203: Fixed ctypes segfaults when passing a unicode string to a
   function without argtypes (only occurs if HAVE_USABLE_WCHAR_T is false).
 
+- 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 #3386: distutils.sysconfig.get_python_lib prefix argument was ignored
   under NT and OS2. Patch by Philip Jenvey.
 
index 155b61b57ca458287d4fb4ec9114d83cb8995761..458d1d3cf306260c68e29d64b56b80c000c0330e 100644 (file)
@@ -354,7 +354,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) {
index e5d2d155d9fed6585ff984dcc618d2b0da67d935..ad4005b2e809f87836956b6a17574e7da3ee06be 100644 (file)
@@ -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);