mirror of https://github.com/python/cpython
GH-96754: Check whether the interpreter frame is complete before creating frame object. (GH-96776)
This commit is contained in:
parent
1756ffd66a
commit
12c5f328d2
|
@ -0,0 +1,3 @@
|
|||
Make sure that all frame objects created are created from valid interpreter
|
||||
frames. Prevents the possibility of invalid frames in backtraces and signal
|
||||
handlers.
|
|
@ -1832,6 +1832,9 @@ _PyErr_CheckSignalsTstate(PyThreadState *tstate)
|
|||
_Py_atomic_store(&is_tripped, 0);
|
||||
|
||||
_PyInterpreterFrame *frame = tstate->cframe->current_frame;
|
||||
while (frame && _PyFrame_IsIncomplete(frame)) {
|
||||
frame = frame->previous;
|
||||
}
|
||||
signal_state_t *state = &signal_global_state;
|
||||
for (int i = 1; i < Py_NSIG; i++) {
|
||||
if (!_Py_atomic_load_relaxed(&Handlers[i].tripped)) {
|
||||
|
|
|
@ -5113,9 +5113,11 @@ error:
|
|||
#endif
|
||||
|
||||
/* Log traceback info. */
|
||||
PyFrameObject *f = _PyFrame_GetFrameObject(frame);
|
||||
if (f != NULL) {
|
||||
PyTraceBack_Here(f);
|
||||
if (!_PyFrame_IsIncomplete(frame)) {
|
||||
PyFrameObject *f = _PyFrame_GetFrameObject(frame);
|
||||
if (f != NULL) {
|
||||
PyTraceBack_Here(f);
|
||||
}
|
||||
}
|
||||
|
||||
if (tstate->c_tracefunc != NULL) {
|
||||
|
|
|
@ -1406,6 +1406,9 @@ _PyThread_CurrentFrames(void)
|
|||
PyThreadState *t;
|
||||
for (t = i->threads.head; t != NULL; t = t->next) {
|
||||
_PyInterpreterFrame *frame = t->cframe->current_frame;
|
||||
while (frame && _PyFrame_IsIncomplete(frame)) {
|
||||
frame = frame->previous;
|
||||
}
|
||||
if (frame == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue