diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2003-06-08 13:19:58 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2003-06-08 13:19:58 (GMT) |
commit | e2fdc610043a29a4e95287ff53b1a2c43e401b11 (patch) | |
tree | 1edb40832050a5d73a60fcb835e993d108ddca9f | |
parent | f0b1a1fca9e70663efa9fba2d123784cbd14616c (diff) | |
download | cpython-e2fdc610043a29a4e95287ff53b1a2c43e401b11.zip cpython-e2fdc610043a29a4e95287ff53b1a2c43e401b11.tar.gz cpython-e2fdc610043a29a4e95287ff53b1a2c43e401b11.tar.bz2 |
Fix SF #749831, copy raises SystemError when getstate raises exception
-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__"); |