[Python-checkins] [3.11] GH-99298: Don't perform jumps before error handling (GH-99343)
markshannon
webhook-mailer at python.org
Fri Nov 11 06:30:38 EST 2022
https://github.com/python/cpython/commit/1119ee4f7e4dc3c40c6535db72d4885e3dd08ebb
commit: 1119ee4f7e4dc3c40c6535db72d4885e3dd08ebb
branch: 3.11
author: Brandt Bucher <brandtbucher at microsoft.com>
committer: markshannon <mark at hotpy.org>
date: 2022-11-11T11:30:21Z
summary:
[3.11] GH-99298: Don't perform jumps before error handling (GH-99343)
files:
A Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst
M Python/ceval.c
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst
new file mode 100644
index 000000000000..8908bfaa8e25
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst
@@ -0,0 +1,2 @@
+Fix an issue that could potentially cause incorrect error handling for some
+bytecode instructions.
diff --git a/Python/ceval.c b/Python/ceval.c
index c0d9c68de04b..b4ebf0c3d50e 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2158,6 +2158,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *container = SECOND();
next_instr--;
if (_Py_Specialize_BinarySubscr(container, sub, next_instr) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -2323,6 +2324,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *container = SECOND();
next_instr--;
if (_Py_Specialize_StoreSubscr(container, sub, next_instr) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -3056,6 +3058,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *name = GETITEM(names, oparg>>1);
next_instr--;
if (_Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -3481,6 +3484,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *name = GETITEM(names, oparg);
next_instr--;
if (_Py_Specialize_LoadAttr(owner, next_instr, name) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -3590,6 +3594,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *name = GETITEM(names, oparg);
next_instr--;
if (_Py_Specialize_StoreAttr(owner, next_instr, name) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -4527,6 +4532,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *name = GETITEM(names, oparg);
next_instr--;
if (_Py_Specialize_LoadMethod(owner, next_instr, name) < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -4801,6 +4807,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
int err = _Py_Specialize_Precall(callable, next_instr, nargs,
call_shape.kwnames, oparg);
if (err < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -4822,6 +4829,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
int err = _Py_Specialize_Call(callable, next_instr, nargs,
call_shape.kwnames);
if (err < 0) {
+ next_instr++;
goto error;
}
DISPATCH_SAME_OPARG();
@@ -5184,9 +5192,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
PyObject *list = SECOND();
DEOPT_IF(!PyList_Check(list), PRECALL);
STAT_INC(PRECALL, hit);
- // PRECALL + CALL + POP_TOP
- JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL + 1);
- assert(_Py_OPCODE(next_instr[-1]) == POP_TOP);
PyObject *arg = POP();
if (_PyList_AppendTakeRef((PyListObject *)list, arg) < 0) {
goto error;
@@ -5194,6 +5199,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
STACK_SHRINK(2);
Py_DECREF(list);
Py_DECREF(callable);
+ // PRECALL + CALL + POP_TOP
+ JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL + 1);
+ assert(_Py_OPCODE(next_instr[-1]) == POP_TOP);
DISPATCH();
}
More information about the Python-checkins
mailing list