mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	[3.13] gh-129967: Fix race condition in repr(set) (gh-129978) (gh-130020)
				
					
				
			The call to `PySequence_List()` could temporarily unlock and relock the
set, allowing the items to be cleared and return the incorrect
notation `{}` for a empty set (it should be `set()`).
(cherry picked from commit a7427f2db9)
Co-authored-by: T. Wouters <thomas@python.org>
			
			
This commit is contained in:
		
							parent
							
								
									36790830cb
								
							
						
					
					
						commit
						ee12a3482d
					
				
					 3 changed files with 54 additions and 2 deletions
				
			
		
							
								
								
									
										41
									
								
								Lib/test/test_free_threading/test_set.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Lib/test/test_free_threading/test_set.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | |||
| import unittest | ||||
| 
 | ||||
| from threading import Thread, Barrier | ||||
| from unittest import TestCase | ||||
| 
 | ||||
| from test.support import threading_helper | ||||
| 
 | ||||
| 
 | ||||
| @threading_helper.requires_working_threading() | ||||
| class TestSet(TestCase): | ||||
|     def test_repr_clear(self): | ||||
|         """Test repr() of a set while another thread is calling clear()""" | ||||
|         NUM_ITERS = 10 | ||||
|         NUM_REPR_THREADS = 10 | ||||
|         barrier = Barrier(NUM_REPR_THREADS + 1) | ||||
|         s = {1, 2, 3, 4, 5, 6, 7, 8} | ||||
| 
 | ||||
|         def clear_set(): | ||||
|             barrier.wait() | ||||
|             s.clear() | ||||
| 
 | ||||
|         def repr_set(): | ||||
|             barrier.wait() | ||||
|             set_reprs.append(repr(s)) | ||||
| 
 | ||||
|         for _ in range(NUM_ITERS): | ||||
|             set_reprs = [] | ||||
|             threads = [Thread(target=clear_set)] | ||||
|             for _ in range(NUM_REPR_THREADS): | ||||
|                 threads.append(Thread(target=repr_set)) | ||||
|             for t in threads: | ||||
|                 t.start() | ||||
|             for t in threads: | ||||
|                 t.join() | ||||
| 
 | ||||
|             for set_repr in set_reprs: | ||||
|                 self.assertIn(set_repr, ("set()", "{1, 2, 3, 4, 5, 6, 7, 8}")) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     unittest.main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sam Gross
						Sam Gross