bpo-44449: faulthandler don't modify frame refcnt (GH-27850)

Fix a crash in the signal handler of the faulthandler module: no
longer modify the reference count of frame objects.
(cherry picked from commit fe997e1a67)

Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
Miss Islington (bot) 2021-08-30 06:56:03 -07:00 committed by GitHub
parent 0c5e0aa73f
commit 720aef48b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 5 deletions

View file

@ -799,7 +799,10 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
PUTS(fd, "Stack (most recent call first):\n");
}
frame = PyThreadState_GetFrame(tstate);
// Use a borrowed reference. Avoid Py_INCREF/Py_DECREF, since this function
// can be called in a signal handler by the faulthandler module which must
// not modify Python objects.
frame = tstate->frame;
if (frame == NULL) {
PUTS(fd, "<no Python frame>\n");
return;
@ -808,17 +811,14 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
depth = 0;
while (1) {
if (MAX_FRAME_DEPTH <= depth) {
Py_DECREF(frame);
PUTS(fd, " ...\n");
break;
}
if (!PyFrame_Check(frame)) {
Py_DECREF(frame);
break;
}
dump_frame(fd, frame);
PyFrameObject *back = PyFrame_GetBack(frame);
Py_DECREF(frame);
PyFrameObject *back = frame->f_back;
if (back == NULL) {
break;