diff options
-rw-r--r-- | Lib/test/list_tests.py | 9 | ||||
-rw-r--r-- | Objects/abstract.c | 5 | ||||
-rw-r--r-- | Objects/listobject.c | 5 | ||||
-rw-r--r-- | Python/bltinmodule.c | 12 |
4 files changed, 31 insertions, 0 deletions
diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 284edb3..14b54c7 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -514,3 +514,12 @@ class CommonTest(seq_tests.CommonTest): a = self.type2test(range(10)) a[::2] = tuple(range(5)) self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) + + def test_constructor_exception_handling(self): + # Bug #1242657 + class F(object): + def __iter__(self): + yield 23 + def __len__(self): + raise KeyboardInterrupt + self.assertRaises(KeyboardInterrupt, list, F()) diff --git a/Objects/abstract.c b/Objects/abstract.c index cade2aa..94af3da 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1401,6 +1401,11 @@ PySequence_Tuple(PyObject *v) /* Guess result size and allocate space. */ n = PyObject_Size(v); if (n < 0) { + if (!PyErr_ExceptionMatches(PyExc_TypeError) && + !PyErr_ExceptionMatches(PyExc_AttributeError)) { + Py_DECREF(it); + return NULL; + } PyErr_Clear(); n = 10; /* arbitrary */ } diff --git a/Objects/listobject.c b/Objects/listobject.c index 08ab095..3b7358a 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -777,6 +777,11 @@ listextend(PyListObject *self, PyObject *b) /* Guess a result list size. */ n = PyObject_Size(b); if (n < 0) { + if (!PyErr_ExceptionMatches(PyExc_TypeError) && + !PyErr_ExceptionMatches(PyExc_AttributeError)) { + Py_DECREF(it); + return NULL; + } PyErr_Clear(); n = 8; /* arbitrary */ } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index f63e27a..af5a55b 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -223,6 +223,10 @@ builtin_filter(PyObject *self, PyObject *args) /* Guess a result list size. */ len = PyObject_Size(seq); if (len < 0) { + if (!PyErr_ExceptionMatches(PyExc_TypeError) && + !PyErr_ExceptionMatches(PyExc_AttributeError)) { + goto Fail_it; + } PyErr_Clear(); len = 8; /* arbitrary */ } @@ -864,6 +868,10 @@ builtin_map(PyObject *self, PyObject *args) /* Update len. */ curlen = PyObject_Size(curseq); if (curlen < 0) { + if (!PyErr_ExceptionMatches(PyExc_TypeError) && + !PyErr_ExceptionMatches(PyExc_AttributeError)) { + goto Fail_2; + } PyErr_Clear(); curlen = 8; /* arbitrary */ } @@ -2097,6 +2105,10 @@ builtin_zip(PyObject *self, PyObject *args) PyObject *item = PyTuple_GET_ITEM(args, i); int thislen = PyObject_Size(item); if (thislen < 0) { + if (!PyErr_ExceptionMatches(PyExc_TypeError) && + !PyErr_ExceptionMatches(PyExc_AttributeError)) { + return NULL; + } PyErr_Clear(); len = -1; break; |