From e6e34e45222b9c7a63ba92386612acf768082ba0 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 9 Jun 2021 11:40:49 -0600 Subject: bpo-43693: Do not check co_cell2arg if a non-cell offset. (gh-26626) This is the same fix as for PyFrame_LocalsToFast() in gh-26609, but applied to PyFrame_FastToLocalsWithError(). (It should have been in that PR.) https://bugs.python.org/issue43693 --- Objects/frameobject.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index a41d217..da56b55 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -981,7 +981,9 @@ PyFrame_FastToLocalsWithError(PyFrameObject *f) PyObject *value = fast[i]; if (f->f_state != FRAME_CLEARED) { int cellargoffset = CO_CELL_NOT_AN_ARG; - if (co->co_cell2arg != NULL) { + if (kind & CO_FAST_CELL && co->co_cell2arg != NULL) { + assert(i - co->co_nlocals >= 0); + assert(i - co->co_nlocals < co->co_ncellvars); cellargoffset = co->co_cell2arg[i - co->co_nlocals]; } if (kind & CO_FAST_FREE) { @@ -1093,7 +1095,8 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear) PyObject *oldvalue = fast[i]; int cellargoffset = CO_CELL_NOT_AN_ARG; if (kind & CO_FAST_CELL && co->co_cell2arg != NULL) { - assert(i >= co->co_nlocals); + assert(i - co->co_nlocals >= 0); + assert(i - co->co_nlocals < co->co_ncellvars); cellargoffset = co->co_cell2arg[i - co->co_nlocals]; } PyObject *cell = NULL; -- cgit v0.12