diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:58:21 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:58:21 (GMT) |
commit | f343e01c170b3f63eafac4568d905be91b676254 (patch) | |
tree | 1c3aa5615718e7ccc70be59a5fbd72b7497869ae /Objects | |
parent | e5e298f8755c475e78f8cfc71ee0ea03c6674406 (diff) | |
download | cpython-f343e01c170b3f63eafac4568d905be91b676254.zip cpython-f343e01c170b3f63eafac4568d905be91b676254.tar.gz cpython-f343e01c170b3f63eafac4568d905be91b676254.tar.bz2 |
Merged revisions 68560 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68560 | amaury.forgeotdarc | 2009-01-13 00:36:55 +0100 (mar., 13 janv. 2009) | 6 lines
#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 'Objects')
-rw-r--r-- | Objects/abstract.c | 1 | ||||
-rw-r--r-- | Objects/object.c | 14 | ||||
-rw-r--r-- | Objects/typeobject.c | 6 |
3 files changed, 19 insertions, 2 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 0a0333c..1f988ec 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2736,7 +2736,6 @@ PyObject * PyIter_Next(PyObject *iter) { PyObject *result; - assert(PyIter_Check(iter)); result = (*iter->ob_type->tp_iternext)(iter); if (result == NULL && PyErr_Occurred() && diff --git a/Objects/object.c b/Objects/object.c index 15d26a7..00657de 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1020,6 +1020,20 @@ PyObject_SelfIter(PyObject *obj) return obj; } +/* Helper used when the __next__ method is removed from a type: + tp_iternext is never NULL and can be safely called without checking + on every iteration. + */ + +PyObject * +_PyObject_NextNotImplemented(PyObject *self) +{ + PyErr_Format(PyExc_TypeError, + "'%.200s' object is not iterable", + Py_TYPE(self)->tp_name); + return NULL; +} + /* Generic GetAttr functions - put these in your tp_[gs]etattro slot */ PyObject * diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8f2e01e..8921b5f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5630,8 +5630,12 @@ update_one_slot(PyTypeObject *type, slotdef *p) } do { descr = _PyType_Lookup(type, p->name_strobj); - if (descr == NULL) + if (descr == NULL) { + if (ptr == (void**)&type->tp_iternext) { + specific = _PyObject_NextNotImplemented; + } continue; + } if (Py_TYPE(descr) == &PyWrapperDescr_Type) { void **tptr = resolve_slotdups(type, p->name_strobj); if (tptr == NULL || tptr == ptr) |