Merge 3.2

This commit is contained in:
Richard Oudkerk 2012-08-14 12:51:14 +01:00
commit 3165a75e45
4 changed files with 40 additions and 2 deletions

View File

@ -305,7 +305,7 @@ else:
'''
Returns prefix of command line used for spawning a child process
'''
if process.current_process()._identity==() and is_forking(sys.argv):
if getattr(process.current_process(), '_inheriting', False):
raise RuntimeError('''
Attempt to start a new process before the current process
has finished its bootstrapping phase.

13
Lib/test/mp_fork_bomb.py Normal file
View File

@ -0,0 +1,13 @@
import multiprocessing, sys
def foo():
print("123")
# Because "if __name__ == '__main__'" is missing this will not work
# correctly on Windows. However, we should get a RuntimeError rather
# than the Windows equivalent of a fork bomb.
p = multiprocessing.Process(target=foo)
p.start()
p.join()
sys.exit(p.exitcode)

View File

@ -20,6 +20,7 @@ import random
import logging
import struct
import test.support
import test.script_helper
# Skip tests if _multiprocessing wasn't built.
@ -3346,9 +3347,29 @@ class TestTimeouts(unittest.TestCase):
finally:
socket.setdefaulttimeout(old_timeout)
#
# Test what happens with no "if __name__ == '__main__'"
#
class TestNoForkBomb(unittest.TestCase):
def test_noforkbomb(self):
name = os.path.join(os.path.dirname(__file__), 'mp_fork_bomb.py')
if WIN32:
rc, out, err = test.script_helper.assert_python_failure(name)
self.assertEqual('', out.decode('ascii'))
self.assertIn('RuntimeError', err.decode('ascii'))
else:
rc, out, err = test.script_helper.assert_python_ok(name)
self.assertEqual('123', out.decode('ascii').rstrip())
self.assertEqual('', err.decode('ascii'))
#
#
#
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
TestFlags, TestTimeouts]
TestFlags, TestTimeouts, TestNoForkBomb]
#
#

View File

@ -13,6 +13,10 @@ Core and Builtins
Library
-------
- Issue #15646: Prevent equivalent of a fork bomb when using
multiprocessing on Windows without the "if __name__ == '__main__'"
idiom.
C API
-----