diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2021-06-09 17:40:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-09 17:40:49 (GMT) |
commit | e6e34e45222b9c7a63ba92386612acf768082ba0 (patch) | |
tree | 1f49b0645035cb915657c73804c8d9c4d8da5d81 /Objects/frameobject.c | |
parent | eea8148b7dff5ffc7b84433859ac819b1d92a74d (diff) | |
download | cpython-e6e34e45222b9c7a63ba92386612acf768082ba0.zip cpython-e6e34e45222b9c7a63ba92386612acf768082ba0.tar.gz cpython-e6e34e45222b9c7a63ba92386612acf768082ba0.tar.bz2 |
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
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r-- | Objects/frameobject.c | 7 |
1 files 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; |