alexandre.vassalotti
2008-08-15 03:07:48 UTC
Author: alexandre.vassalotti
Date: Fri Aug 15 05:07:47 2008
New Revision: 65689
Log:
Issue 3514: Fixed segfault dues to infinite loop in __getattr__.
Modified:
python/branches/py3k/Lib/test/pickletester.py
python/branches/py3k/Modules/_pickle.c
Modified: python/branches/py3k/Lib/test/pickletester.py
==============================================================================
--- python/branches/py3k/Lib/test/pickletester.py (original)
+++ python/branches/py3k/Lib/test/pickletester.py Fri Aug 15 05:07:47 2008
@@ -868,6 +868,14 @@
y = self.loads(s)
self.assertEqual(y._reduce_called, 1)
+ def test_bad_getattr(self):
+ x = BadGetattr()
+ for proto in 0, 1:
+ self.assertRaises(RuntimeError, self.dumps, x, proto)
+ # protocol 2 don't raise a RuntimeError.
+ d = self.dumps(x, 2)
+ self.assertRaises(RuntimeError, self.loads, d)
+
# Test classes for reduce_ex
class REX_one(object):
@@ -949,6 +957,10 @@
# raise an error, to make sure this isn't called
raise TypeError("SimpleNewObj.__init__() didn't expect to get called")
+class BadGetattr:
+ def __getattr__(self, key):
+ self.foo
+
class AbstractPickleModuleTests(unittest.TestCase):
def test_dump_closed_file(self):
Modified: python/branches/py3k/Modules/_pickle.c
==============================================================================
--- python/branches/py3k/Modules/_pickle.c (original)
+++ python/branches/py3k/Modules/_pickle.c Fri Aug 15 05:07:47 2008
@@ -3834,8 +3834,11 @@
inst = self->stack->data[self->stack->length - 1];
setstate = PyObject_GetAttrString(inst, "__setstate__");
- if (setstate == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
+ if (setstate == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ return -1;
}
else {
PyObject *result;
Date: Fri Aug 15 05:07:47 2008
New Revision: 65689
Log:
Issue 3514: Fixed segfault dues to infinite loop in __getattr__.
Modified:
python/branches/py3k/Lib/test/pickletester.py
python/branches/py3k/Modules/_pickle.c
Modified: python/branches/py3k/Lib/test/pickletester.py
==============================================================================
--- python/branches/py3k/Lib/test/pickletester.py (original)
+++ python/branches/py3k/Lib/test/pickletester.py Fri Aug 15 05:07:47 2008
@@ -868,6 +868,14 @@
y = self.loads(s)
self.assertEqual(y._reduce_called, 1)
+ def test_bad_getattr(self):
+ x = BadGetattr()
+ for proto in 0, 1:
+ self.assertRaises(RuntimeError, self.dumps, x, proto)
+ # protocol 2 don't raise a RuntimeError.
+ d = self.dumps(x, 2)
+ self.assertRaises(RuntimeError, self.loads, d)
+
# Test classes for reduce_ex
class REX_one(object):
@@ -949,6 +957,10 @@
# raise an error, to make sure this isn't called
raise TypeError("SimpleNewObj.__init__() didn't expect to get called")
+class BadGetattr:
+ def __getattr__(self, key):
+ self.foo
+
class AbstractPickleModuleTests(unittest.TestCase):
def test_dump_closed_file(self):
Modified: python/branches/py3k/Modules/_pickle.c
==============================================================================
--- python/branches/py3k/Modules/_pickle.c (original)
+++ python/branches/py3k/Modules/_pickle.c Fri Aug 15 05:07:47 2008
@@ -3834,8 +3834,11 @@
inst = self->stack->data[self->stack->length - 1];
setstate = PyObject_GetAttrString(inst, "__setstate__");
- if (setstate == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
+ if (setstate == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ return -1;
}
else {
PyObject *result;