]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Re-init _Py_UnhandledKeyboardInterrupt before run. (GH-11963)
authorGregory P. Smith <greg@krypto.org>
Thu, 21 Feb 2019 01:35:54 +0000 (17:35 -0800)
committerGitHub <noreply@github.com>
Thu, 21 Feb 2019 01:35:54 +0000 (17:35 -0800)
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.

Python/pythonrun.c

index 94fcc6725ec427f4aa51fbf187d3dd9d14a887c2..906877a0a853ca92a7dc4cd0325fd78db8b2d98a 100644 (file)
@@ -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;