Skip to content

Commit 9f710e6

Browse files
committed
Make sure that previous never points into the C stack after return.
1 parent 59e7727 commit 9f710e6

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed

Python/ceval.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4932,6 +4932,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
49324932
_Py_LeaveRecursiveCallTstate(tstate);
49334933
assert(frame != &py_frame);
49344934
_PyInterpreterFrame *prev = frame->previous;
4935+
gen_frame->previous = NULL;
49354936
_PyThreadState_PopFrame(tstate, frame);
49364937
frame = cframe.current_frame = prev;
49374938
_PyFrame_StackPush(frame, (PyObject *)gen);

Python/frame.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest)
6060
static void
6161
take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
6262
{
63+
assert(frame->owner != FRAME_OWNED_BY_CSTACK);
6364
assert(frame->owner != FRAME_OWNED_BY_FRAME_OBJECT);
6465
assert(frame->owner != FRAME_CLEARED);
6566
Py_ssize_t size = ((char*)&frame->localsplus[frame->stacktop]) - (char *)frame;
@@ -72,7 +73,9 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
7273
while (prev && _PyFrame_IsIncomplete(prev)) {
7374
prev = prev->previous;
7475
}
76+
frame->previous = NULL;
7577
if (prev) {
78+
assert(prev->owner != FRAME_OWNED_BY_CSTACK);
7679
/* Link PyFrameObjects.f_back and remove link through _PyInterpreterFrame.previous */
7780
PyFrameObject *back = _PyFrame_GetFrameObject(prev);
7881
if (back == NULL) {
@@ -84,7 +87,6 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
8487
else {
8588
f->f_back = (PyFrameObject *)Py_NewRef(back);
8689
}
87-
frame->previous = NULL;
8890
}
8991
if (!_PyObject_GC_IS_TRACKED((PyObject *)f)) {
9092
_PyObject_GC_TRACK((PyObject *)f);

0 commit comments

Comments
 (0)