mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Fix an issue that was reported in but unrelated to the main problem of
SF bug 535905 (Evil Trashcan and GC interaction). The SETLOCAL() macro should not DECREF the local variable in-place and then store the new value; it should copy the old value to a temporary value, then store the new value, and then DECREF the temporary value. This is because it is possible that during the DECREF the frame is accessed by other code (e.g. a __del__ method or gc.collect()) and the variable would be pointing to already-freed memory. BUGFIX CANDIDATE!
This commit is contained in:
		
							parent
							
								
									47cdf6fb6f
								
							
						
					
					
						commit
						cfbf1a33c1
					
				
					 1 changed files with 10 additions and 2 deletions
				
			
		|  | @ -554,8 +554,16 @@ eval_frame(PyFrameObject *f) | |||
| /* Local variable macros */ | ||||
| 
 | ||||
| #define GETLOCAL(i)	(fastlocals[i]) | ||||
| #define SETLOCAL(i, value)	do { Py_XDECREF(GETLOCAL(i)); \ | ||||
| 				     GETLOCAL(i) = value; } while (0) | ||||
| 
 | ||||
| /* The SETLOCAL() macro must not DECREF the local variable in-place and
 | ||||
|    then store the new value; it must copy the old value to a temporary | ||||
|    value, then store the new value, and then DECREF the temporary value. | ||||
|    This is because it is possible that during the DECREF the frame is | ||||
|    accessed by other code (e.g. a __del__ method or gc.collect()) and the | ||||
|    variable would be pointing to already-freed memory. */ | ||||
| #define SETLOCAL(i, value)	do { PyObject *tmp = GETLOCAL(i); \ | ||||
| 				     GETLOCAL(i) = value; \ | ||||
|                                      Py_XDECREF(tmp); } while (0) | ||||
| 
 | ||||
| /* Start of code */ | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum