summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-08-30 13:56:03 (GMT)
committerGitHub <noreply@github.com>2021-08-30 13:56:03 (GMT)
commit720aef48b558e68c07937f0cc8d62a60f23dcb3d (patch)
treefa062c3eb7d375a11efc0cc5c5bde6ab9c8ac8c7 /Python
parent0c5e0aa73f6f70d16d21ad9e1eb2d0fe3a334f0a (diff)
downloadcpython-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.c10
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;