summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2019-02-21 01:35:54 (GMT)
committerGitHub <noreply@github.com>2019-02-21 01:35:54 (GMT)
commitd9bc543cbb9681f77d94864d05e2ba2d353e6de9 (patch)
treea24965055c43fe8a9fa152d30b07452e5c986820
parent9b0c681e2d7e708a07e34d9c08e4424bdd4f5ebc (diff)
downloadcpython-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.c11
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;