Issue #15646: Prevent equivalent of a fork bomb when using multiprocessing

on Windows without the "if __name__ == '__main__'" idiom.
This commit is contained in:
Richard Oudkerk 2012-08-14 11:41:32 +01:00
parent 296d1bea6a
commit e88a2445bc
4 changed files with 40 additions and 2 deletions

View file

@ -331,7 +331,7 @@ def get_command_line():
'''
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

@ -18,6 +18,7 @@
import random
import logging
import test.support
import test.script_helper
# Skip tests if _multiprocessing wasn't built.
@ -2429,9 +2430,29 @@ def test_timeout(self):
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, TestInvalidFamily,
TestTimeouts]
TestTimeouts, TestNoForkBomb]
#
#

View file

@ -101,6 +101,10 @@ Core and Builtins
Library
-------
- Issue #15646: Prevent equivalent of a fork bomb when using
multiprocessing on Windows without the "if __name__ == '__main__'"
idiom.
- Issue #15424: Add a __sizeof__ implementation for array objects.
Patch by Ludwig Hähne.