diff options
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:36:55 +0000 |
|---|---|---|
| committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:36:55 +0000 |
| commit | a40d57366432cd65915b92fe3e6bfe1d5ad63be0 (patch) | |
| tree | 45ef11eae7d47a373fea86cba4b1b0c4902bb93a /Include | |
| parent | f94d7fa5fb90df0163cffca2864885a7da49d4f6 (diff) | |
| download | cpython-git-a40d57366432cd65915b92fe3e6bfe1d5ad63be0.tar.gz | |
#3720: Interpreter crashes when an evil iterator removes its own next function.
Now the slot is filled with a function that always raises.
Will not backport: extensions compiled with 2.6.x would not run on 2.6.0.
Diffstat (limited to 'Include')
| -rw-r--r-- | Include/abstract.h | 3 | ||||
| -rw-r--r-- | Include/object.h | 1 |
2 files changed, 3 insertions, 1 deletions
diff --git a/Include/abstract.h b/Include/abstract.h index f3bc8bcd0f..87afe9a640 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -636,7 +636,8 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ #define PyIter_Check(obj) \ (PyType_HasFeature((obj)->ob_type, Py_TPFLAGS_HAVE_ITER) && \ - (obj)->ob_type->tp_iternext != NULL) + (obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); /* Takes an iterator object and calls its tp_iternext slot, diff --git a/Include/object.h b/Include/object.h index b02689cc4a..c40d36201d 100644 --- a/Include/object.h +++ b/Include/object.h @@ -473,6 +473,7 @@ PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); |
