mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Merge 3.2
This commit is contained in:
commit
3165a75e45
4 changed files with 40 additions and 2 deletions
|
@ -305,7 +305,7 @@ else:
|
||||||
'''
|
'''
|
||||||
Returns prefix of command line used for spawning a child process
|
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('''
|
raise RuntimeError('''
|
||||||
Attempt to start a new process before the current process
|
Attempt to start a new process before the current process
|
||||||
has finished its bootstrapping phase.
|
has finished its bootstrapping phase.
|
||||||
|
|
13
Lib/test/mp_fork_bomb.py
Normal file
13
Lib/test/mp_fork_bomb.py
Normal 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)
|
|
@ -20,6 +20,7 @@ import random
|
||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
import test.support
|
import test.support
|
||||||
|
import test.script_helper
|
||||||
|
|
||||||
|
|
||||||
# Skip tests if _multiprocessing wasn't built.
|
# Skip tests if _multiprocessing wasn't built.
|
||||||
|
@ -3346,9 +3347,29 @@ class TestTimeouts(unittest.TestCase):
|
||||||
finally:
|
finally:
|
||||||
socket.setdefaulttimeout(old_timeout)
|
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,
|
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
|
||||||
TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
|
TestStdinBadfiledescriptor, TestWait, TestInvalidFamily,
|
||||||
TestFlags, TestTimeouts]
|
TestFlags, TestTimeouts, TestNoForkBomb]
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
|
@ -13,6 +13,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #15646: Prevent equivalent of a fork bomb when using
|
||||||
|
multiprocessing on Windows without the "if __name__ == '__main__'"
|
||||||
|
idiom.
|
||||||
|
|
||||||
C API
|
C API
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue