Skip to content

Commit 5ec809b

Browse files
committed
gh-146092: Handle _PyFrame_GetFrameObject() failures properly (#146124)
* Fix _PyFrame_GetLocals() and _PyFrame_GetLocals() error handling. * _PyEval_ExceptionGroupMatch() now fails on _PyFrame_GetLocals() error. (cherry picked from commit e1e4852)
1 parent 3ebf54e commit 5ec809b

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

Objects/frameobject.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,6 +2288,9 @@ _PyFrame_GetLocals(_PyInterpreterFrame *frame)
22882288
}
22892289

22902290
PyFrameObject* f = _PyFrame_GetFrameObject(frame);
2291+
if (f == NULL) {
2292+
return NULL;
2293+
}
22912294

22922295
return _PyFrameLocalsProxy_New(f);
22932296
}

Python/ceval.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2293,14 +2293,17 @@ _PyEval_ExceptionGroupMatch(_PyInterpreterFrame *frame, PyObject* exc_value,
22932293
return -1;
22942294
}
22952295
PyFrameObject *f = _PyFrame_GetFrameObject(frame);
2296-
if (f != NULL) {
2297-
PyObject *tb = _PyTraceBack_FromFrame(NULL, f);
2298-
if (tb == NULL) {
2299-
return -1;
2300-
}
2301-
PyException_SetTraceback(wrapped, tb);
2302-
Py_DECREF(tb);
2296+
if (f == NULL) {
2297+
Py_DECREF(wrapped);
2298+
return -1;
2299+
}
2300+
2301+
PyObject *tb = _PyTraceBack_FromFrame(NULL, f);
2302+
if (tb == NULL) {
2303+
return -1;
23032304
}
2305+
PyException_SetTraceback(wrapped, tb);
2306+
Py_DECREF(tb);
23042307
*match = wrapped;
23052308
}
23062309
*rest = Py_NewRef(Py_None);
@@ -2778,6 +2781,11 @@ PyEval_GetLocals(void)
27782781

27792782
if (PyFrameLocalsProxy_Check(locals)) {
27802783
PyFrameObject *f = _PyFrame_GetFrameObject(current_frame);
2784+
if (f == NULL) {
2785+
Py_DECREF(locals);
2786+
return NULL;
2787+
}
2788+
27812789
PyObject *ret = f->f_locals_cache;
27822790
if (ret == NULL) {
27832791
ret = PyDict_New();

0 commit comments

Comments
 (0)