https://github.com/python/cpython/commit/53b544a6a7d14fbbb07a18b3c324ac5167d0597f commit: 53b544a6a7d14fbbb07a18b3c324ac5167d0597f branch: 3.13 author: Miss Islington (bot) <[email protected]> committer: vstinner <[email protected]> date: 2026-03-18T21:23:26+01:00 summary:
[3.13] gh-146092: Handle _PyFrame_GetFrameObject() failures properly (GH-146124) (GH-146132) (#146138) [3.14] gh-146092: Handle _PyFrame_GetFrameObject() failures properly (GH-146124) (GH-146132) gh-146092: Handle _PyFrame_GetFrameObject() failures properly (GH-146124) * Fix _PyFrame_GetLocals() and _PyFrame_GetLocals() error handling. * _PyEval_ExceptionGroupMatch() now fails on _PyFrame_GetLocals() error. (cherry picked from commit 8eeb800faf5562e6ce3805416f656ab09243c9a6) (cherry picked from commit e1e4852133ea548479bc9b975420a32331df7cee) Co-authored-by: Victor Stinner <[email protected]> files: M Objects/frameobject.c M Python/ceval.c diff --git a/Objects/frameobject.c b/Objects/frameobject.c index d947f655d573ba..467c3fe56e98f2 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -2093,6 +2093,9 @@ _PyFrame_GetLocals(_PyInterpreterFrame *frame) } PyFrameObject* f = _PyFrame_GetFrameObject(frame); + if (f == NULL) { + return NULL; + } return _PyFrameLocalsProxy_New(f); } diff --git a/Python/ceval.c b/Python/ceval.c index ca07bfbaaf6a38..aafb4dd0fd97d3 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2031,14 +2031,17 @@ _PyEval_ExceptionGroupMatch(PyObject* exc_value, PyObject *match_type, PyThreadState *tstate = _PyThreadState_GET(); _PyInterpreterFrame *frame = _PyThreadState_GetFrame(tstate); PyFrameObject *f = _PyFrame_GetFrameObject(frame); - if (f != NULL) { - PyObject *tb = _PyTraceBack_FromFrame(NULL, f); - if (tb == NULL) { - return -1; - } - PyException_SetTraceback(wrapped, tb); - Py_DECREF(tb); + if (f == NULL) { + Py_DECREF(wrapped); + return -1; + } + + PyObject *tb = _PyTraceBack_FromFrame(NULL, f); + if (tb == NULL) { + return -1; } + PyException_SetTraceback(wrapped, tb); + Py_DECREF(tb); *match = wrapped; } *rest = Py_NewRef(Py_None); @@ -2505,6 +2508,11 @@ PyEval_GetLocals(void) if (PyFrameLocalsProxy_Check(locals)) { PyFrameObject *f = _PyFrame_GetFrameObject(current_frame); + if (f == NULL) { + Py_DECREF(locals); + return NULL; + } + PyObject *ret = f->f_locals_cache; if (ret == NULL) { ret = PyDict_New(); _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
