Skip to content

Commit c011b5b

Browse files
committed
Add NULL check to FOR_ITER
1 parent dd4a819 commit c011b5b

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

Python/bytecodes.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3155,7 +3155,14 @@ dummy_func(
31553155
replaced op(_FOR_ITER, (iter -- iter, next)) {
31563156
/* before: [iter]; after: [iter, iter()] *or* [] (and jump over END_FOR.) */
31573157
PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
3158-
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
3158+
iternextfunc func = Py_TYPE(iter_o)->tp_iternext;
3159+
if (func == NULL) {
3160+
_PyErr_Format(tstate, PyExc_TypeError,
3161+
"'%.100s' object is not an iterator",
3162+
Py_TYPE(iter_o)->tp_name);
3163+
ERROR_NO_POP();
3164+
}
3165+
PyObject *next_o = func(iter_o);
31593166
if (next_o == NULL) {
31603167
if (_PyErr_Occurred(tstate)) {
31613168
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
@@ -3179,7 +3186,14 @@ dummy_func(
31793186
op(_FOR_ITER_TIER_TWO, (iter -- iter, next)) {
31803187
/* before: [iter]; after: [iter, iter()] *or* [] (and jump over END_FOR.) */
31813188
PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
3182-
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
3189+
iternextfunc func = Py_TYPE(iter_o)->tp_iternext;
3190+
if (func == NULL) {
3191+
_PyErr_Format(tstate, PyExc_TypeError,
3192+
"'%.100s' object is not an iterator",
3193+
Py_TYPE(iter_o)->tp_name);
3194+
ERROR_NO_POP();
3195+
}
3196+
PyObject *next_o = func(iter_o);
31833197
if (next_o == NULL) {
31843198
if (_PyErr_Occurred(tstate)) {
31853199
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
@@ -3202,7 +3216,14 @@ dummy_func(
32023216

32033217
inst(INSTRUMENTED_FOR_ITER, (unused/1, iter -- iter, next)) {
32043218
PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
3205-
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
3219+
iternextfunc func = Py_TYPE(iter_o)->tp_iternext;
3220+
if (func == NULL) {
3221+
_PyErr_Format(tstate, PyExc_TypeError,
3222+
"'%.100s' object is not an iterator",
3223+
Py_TYPE(iter_o)->tp_name);
3224+
ERROR_NO_POP();
3225+
}
3226+
PyObject *next_o = func(iter_o);
32063227
if (next_o != NULL) {
32073228
next = PyStackRef_FromPyObjectSteal(next_o);
32083229
INSTRUMENTED_JUMP(this_instr, next_instr, PY_MONITORING_EVENT_BRANCH_LEFT);

Python/executor_cases.c.h

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 20 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)