diff options
author | Gregory P. Smith <greg@krypto.org> | 2019-02-21 01:35:54 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-21 01:35:54 (GMT) |
commit | d9bc543cbb9681f77d94864d05e2ba2d353e6de9 (patch) | |
tree | a24965055c43fe8a9fa152d30b07452e5c986820 | |
parent | 9b0c681e2d7e708a07e34d9c08e4424bdd4f5ebc (diff) | |
download | cpython-d9bc543cbb9681f77d94864d05e2ba2d353e6de9.zip cpython-d9bc543cbb9681f77d94864d05e2ba2d353e6de9.tar.gz cpython-d9bc543cbb9681f77d94864d05e2ba2d353e6de9.tar.bz2 |
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.
-rw-r--r-- | Python/pythonrun.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 94fcc67..906877a 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1032,6 +1032,17 @@ static PyObject * run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) { 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); if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) { _Py_UnhandledKeyboardInterrupt = 1; |