summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2003-06-08 13:19:58 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2003-06-08 13:19:58 (GMT)
commite2fdc610043a29a4e95287ff53b1a2c43e401b11 (patch)
tree1edb40832050a5d73a60fcb835e993d108ddca9f
parentf0b1a1fca9e70663efa9fba2d123784cbd14616c (diff)
downloadcpython-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.py6
-rw-r--r--Objects/typeobject.c2
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__");