diff options
-rw-r--r-- | Lib/test/test_copy.py | 6 | ||||
-rw-r--r-- | Objects/typeobject.c | 2 |
2 files changed, 8 insertions, 0 deletions
diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 0e39e83..c734a9a 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -515,6 +515,12 @@ class TestCopy(unittest.TestCase): self.assert_(x is not y) self.assert_(x[0] is not y[0]) + def test_getstate_exc(self): + class EvilState(object): + def __getstate__(self): + raise ValueError, "ain't got no stickin' state" + self.assertRaises(ValueError, copy.copy, EvilState()) + def test_main(): test_support.run_unittest(TestCopy) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 93f34ed..3e15697 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2536,6 +2536,8 @@ reduce_2(PyObject *obj) if (getstate != NULL) { state = PyObject_CallObject(getstate, NULL); Py_DECREF(getstate); + if (state == NULL) + goto end; } else { state = PyObject_GetAttrString(obj, "__dict__"); |