mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Patch from Andreas Stührk.
This commit is contained in:
		
							parent
							
								
									1f0ccfa853
								
							
						
					
					
						commit
						5afa03a72e
					
				
					 3 changed files with 19 additions and 0 deletions
				
			
		|  | @ -121,6 +121,15 @@ def __init__(self): | |||
|         else: | ||||
|             self.fail("No exception raised") | ||||
| 
 | ||||
|     def test_new_returns_invalid_instance(self): | ||||
|         # See issue #11627. | ||||
|         class MyException(Exception): | ||||
|             def __new__(cls, *args): | ||||
|                 return object() | ||||
| 
 | ||||
|         with self.assertRaises(TypeError): | ||||
|             raise MyException | ||||
| 
 | ||||
| 
 | ||||
| class TestCause(unittest.TestCase): | ||||
|     def test_invalid_cause(self): | ||||
|  |  | |||
|  | @ -10,6 +10,9 @@ What's New in Python 3.2.2? | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #11627: Fix segfault when __new__ on a exception returns a non-exception | ||||
|   class. | ||||
| 
 | ||||
| - Issue #12149: Update the method cache after a type's dictionnary gets | ||||
|   cleared by the garbage collector.  This fixes a segfault when an instance | ||||
|   and its type get caught in a reference cycle, and the instance's | ||||
|  |  | |||
|  | @ -3413,6 +3413,13 @@ do_raise(PyObject *exc, PyObject *cause) | |||
|         value = PyObject_CallObject(exc, NULL); | ||||
|         if (value == NULL) | ||||
|             goto raise_error; | ||||
|         if (!PyExceptionInstance_Check(value)) { | ||||
|             PyErr_Format(PyExc_TypeError, | ||||
|                          "calling %R should have returned an instance of " | ||||
|                          "BaseException, not %R", | ||||
|                          type, Py_TYPE(value)); | ||||
|             goto raise_error; | ||||
|         } | ||||
|     } | ||||
|     else if (PyExceptionInstance_Check(exc)) { | ||||
|         value = exc; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Peterson
						Benjamin Peterson