Re-init _Py_UnhandledKeyboardInterrupt before run. (GH-11963)
Explicitly reinitialize this every eval *just in case* someone is calling into an embedded Python where they don't care about an uncaught KeyboardInterrupt exception (why didn't they leave `config.install_signal_handlers` set to `0`?!?) but then later call `Py_Main()` itself (which *checks* this flag and dies with a signal after its interpreter exits). We don't want a previous embedded interpreter's uncaught exception to trigger an unexplained signal exit from a future `Py_Main()` based one.
This commit is contained in:
parent
9b0c681e2d
commit
d9bc543cbb
|
@ -1032,6 +1032,17 @@ static PyObject *
|
||||||
run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals)
|
run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals)
|
||||||
{
|
{
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
|
/*
|
||||||
|
* We explicitly re-initialize _Py_UnhandledKeyboardInterrupt every eval
|
||||||
|
* _just in case_ someone is calling into an embedded Python where they
|
||||||
|
* don't care about an uncaught KeyboardInterrupt exception (why didn't they
|
||||||
|
* leave config.install_signal_handlers set to 0?!?) but then later call
|
||||||
|
* Py_Main() itself (which _checks_ this flag and dies with a signal after
|
||||||
|
* its interpreter exits). We don't want a previous embedded interpreter's
|
||||||
|
* uncaught exception to trigger an unexplained signal exit from a future
|
||||||
|
* Py_Main() based one.
|
||||||
|
*/
|
||||||
|
_Py_UnhandledKeyboardInterrupt = 0;
|
||||||
v = PyEval_EvalCode((PyObject*)co, globals, locals);
|
v = PyEval_EvalCode((PyObject*)co, globals, locals);
|
||||||
if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
|
if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
|
||||||
_Py_UnhandledKeyboardInterrupt = 1;
|
_Py_UnhandledKeyboardInterrupt = 1;
|
||||||
|
|
Loading…
Reference in New Issue