diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-07-04 18:43:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-04 18:43:12 (GMT) |
commit | 68f5fa668343341b79ce1e23f1d9e773b98fd312 (patch) | |
tree | bc9b4ab897d1addc94ebf52c643e720fb75944d7 /Python | |
parent | 8fe0b1d8fa3451e923d7632263be6145a0734468 (diff) | |
download | cpython-68f5fa668343341b79ce1e23f1d9e773b98fd312.zip cpython-68f5fa668343341b79ce1e23f1d9e773b98fd312.tar.gz cpython-68f5fa668343341b79ce1e23f1d9e773b98fd312.tar.bz2 |
[3.11] GH-94262: Don't create frame objects for frames that aren't yet complete. (GH-94371) (#94482)
Co-authored-by: Mark Shannon <mark@hotpy.org>
Diffstat (limited to 'Python')
-rw-r--r-- | Python/frame.c | 8 | ||||
-rw-r--r-- | Python/sysmodule.c | 14 |
2 files changed, 17 insertions, 5 deletions
diff --git a/Python/frame.c b/Python/frame.c index b6674ed..c4e9349 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -66,9 +66,13 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame) f->f_frame = frame; frame->owner = FRAME_OWNED_BY_FRAME_OBJECT; assert(f->f_back == NULL); - if (frame->previous != NULL) { + _PyInterpreterFrame *prev = frame->previous; + while (prev && _PyFrame_IsIncomplete(prev)) { + prev = prev->previous; + } + if (prev) { /* Link PyFrameObjects.f_back and remove link through _PyInterpreterFrame.previous */ - PyFrameObject *back = _PyFrame_GetFrameObject(frame->previous); + PyFrameObject *back = _PyFrame_GetFrameObject(prev); if (back == NULL) { /* Memory error here. */ assert(PyErr_ExceptionMatches(PyExc_MemoryError)); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 7698641..261ebb9 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1784,9 +1784,17 @@ sys__getframe_impl(PyObject *module, int depth) return NULL; } - while (depth > 0 && frame != NULL) { - frame = frame->previous; - --depth; + if (frame != NULL) { + while (depth > 0) { + frame = frame->previous; + if (frame == NULL) { + break; + } + if (_PyFrame_IsIncomplete(frame)) { + continue; + } + --depth; + } } if (frame == NULL) { _PyErr_SetString(tstate, PyExc_ValueError, |