mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
This commit is contained in:
		
							parent
							
								
									9f6b02ecde
								
							
						
					
					
						commit
						84a0fbf6b0
					
				
					 4 changed files with 30 additions and 5 deletions
				
			
		|  | @ -124,8 +124,6 @@ def __init__(self, process_obj): | |||
|                     import random | ||||
|                     random.seed() | ||||
|                 code = process_obj._bootstrap() | ||||
|                 sys.stdout.flush() | ||||
|                 sys.stderr.flush() | ||||
|                 os._exit(code) | ||||
| 
 | ||||
|         def poll(self, flag=os.WNOHANG): | ||||
|  |  | |||
|  | @ -275,16 +275,17 @@ def _bootstrap(self): | |||
|                 exitcode = e.args[0] | ||||
|             else: | ||||
|                 sys.stderr.write(e.args[0] + '\n') | ||||
|                 sys.stderr.flush() | ||||
|                 exitcode = 1 | ||||
|         except: | ||||
|             exitcode = 1 | ||||
|             import traceback | ||||
|             sys.stderr.write('Process %s:\n' % self.name) | ||||
|             sys.stderr.flush() | ||||
|             traceback.print_exc() | ||||
| 
 | ||||
|         finally: | ||||
|             util.info('process exiting with exitcode %d' % exitcode) | ||||
|             sys.stdout.flush() | ||||
|             sys.stderr.flush() | ||||
| 
 | ||||
|         return exitcode | ||||
| 
 | ||||
| # | ||||
|  |  | |||
|  | @ -367,6 +367,29 @@ def test_subclassing(self): | |||
|         uppercaser.stop() | ||||
|         uppercaser.join() | ||||
| 
 | ||||
|     def test_stderr_flush(self): | ||||
|         # sys.stderr is flushed at process shutdown (issue #13812) | ||||
|         if self.TYPE == "threads": | ||||
|             return | ||||
| 
 | ||||
|         testfn = test.support.TESTFN | ||||
|         self.addCleanup(test.support.unlink, testfn) | ||||
|         proc = self.Process(target=self._test_stderr_flush, args=(testfn,)) | ||||
|         proc.start() | ||||
|         proc.join() | ||||
|         with open(testfn, 'r') as f: | ||||
|             err = f.read() | ||||
|             # The whole traceback was printed | ||||
|             self.assertIn("ZeroDivisionError", err) | ||||
|             self.assertIn("test_multiprocessing.py", err) | ||||
|             self.assertIn("1/0 # MARKER", err) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def _test_stderr_flush(cls, testfn): | ||||
|         sys.stderr = open(testfn, 'w') | ||||
|         1/0 # MARKER | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # | ||||
| # | ||||
|  |  | |||
|  | @ -111,6 +111,9 @@ Core and Builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Issue #13812: When a multiprocessing Process child raises an exception, | ||||
|   flush stderr after printing the exception traceback. | ||||
| 
 | ||||
| - Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC | ||||
|   IV attack countermeasure. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antoine Pitrou
						Antoine Pitrou