Skip to content

Commit

Permalink
[3.11] gh-94215: Fix error handling for line-tracing events (GH-94681) (
Browse files Browse the repository at this point in the history
GH-94688)

* Re-enable crasher
* Fix error handling for line-tracing events
* blurb add
(cherry picked from commit 23ee4a8)

Co-authored-by: Brandt Bucher <[email protected]>
  • Loading branch information
tiran and brandtbucher authored Jul 8, 2022
1 parent 73a1800 commit 36a3372
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
1 change: 0 additions & 1 deletion Lib/test/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -2085,7 +2085,6 @@ def test_issue42383(self):
expected = '(Pdb) The correct file was executed'
self.assertEqual(stdout.split('\n')[6].rstrip('\r'), expected)

@unittest.skip("test crashes, see gh-94215")
def test_gh_94215_crash(self):
script = """\
def func():
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix an issue where exceptions raised by line-tracing events would cause
frames to be left in an invalid state, possibly resulting in a hard crash of
the interpreter.
19 changes: 14 additions & 5 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -5642,16 +5642,25 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
err = maybe_call_line_trace(tstate->c_tracefunc,
tstate->c_traceobj,
tstate, frame, instr_prev);
// Reload possibly changed frame fields:
stack_pointer = _PyFrame_GetStackPointer(frame);
frame->stacktop = -1;
// next_instr is only reloaded if tracing *does not* raise.
// This is consistent with the behavior of older Python
// versions. If a trace function sets a new f_lineno and
// *then* raises, we use the *old* location when searching
// for an exception handler, displaying the traceback, and
// so on:
if (err) {
/* trace function raised an exception */
// next_instr wasn't incremented at the start of this
// instruction. Increment it before handling the error,
// so that it looks the same as a "normal" instruction:
next_instr++;
goto error;
}
/* Reload possibly changed frame fields */
// Reload next_instr. Don't increment it, though, since
// we're going to re-dispatch to the "true" instruction now:
next_instr = frame->prev_instr;

stack_pointer = _PyFrame_GetStackPointer(frame);
frame->stacktop = -1;
}
}
}
Expand Down

0 comments on commit 36a3372

Please sign in to comment.