diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-08-30 13:56:03 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-30 13:56:03 (GMT) |
| commit | 720aef48b558e68c07937f0cc8d62a60f23dcb3d (patch) | |
| tree | fa062c3eb7d375a11efc0cc5c5bde6ab9c8ac8c7 /Python | |
| parent | 0c5e0aa73f6f70d16d21ad9e1eb2d0fe3a334f0a (diff) | |
| download | cpython-720aef48b558e68c07937f0cc8d62a60f23dcb3d.zip cpython-720aef48b558e68c07937f0cc8d62a60f23dcb3d.tar.gz cpython-720aef48b558e68c07937f0cc8d62a60f23dcb3d.tar.bz2 | |
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 fe997e1a67835a929705c8c305d41c4d7dd326e3)
Co-authored-by: Victor Stinner <vstinner@python.org>
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/traceback.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/Python/traceback.c b/Python/traceback.c index a9a9dd9..83f3074 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -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; |
