]> granicus.if.org Git - python/commitdiff
Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
authorVictor Stinner <victor.stinner@haypocalc.com>
Wed, 10 Mar 2010 22:30:19 +0000 (22:30 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Wed, 10 Mar 2010 22:30:19 +0000 (22:30 +0000)
(SIGINT). If an error occurs while importing the site module, the error is
printed and Python exits. Initialize the GIL before importing the site
module.

Lib/site.py
Misc/NEWS
Modules/main.c
Parser/tokenizer.c
Python/import.c
Python/pythonrun.c

index 612122eedede4bfc9f8901dfa0204ef3bf16a033..02129aa4eb7c66adb84e23069de434a70fead6a0 100644 (file)
@@ -489,6 +489,12 @@ def execsitecustomize():
         import sitecustomize
     except ImportError:
         pass
+    except Exception:
+        if sys.flags.verbose:
+            sys.excepthook(*sys.exc_info())
+        else:
+            print >>sys.stderr, \
+                "'import sitecustomize' failed; use -v for traceback"
 
 
 def execusercustomize():
@@ -497,6 +503,12 @@ def execusercustomize():
         import usercustomize
     except ImportError:
         pass
+    except Exception:
+        if sys.flags.verbose:
+            sys.excepthook(*sys.exc_info())
+        else:
+            print>>sys.stderr, \
+                "'import sitecustomize' failed; use -v for traceback"
 
 
 def main():
index 611f187140ffb612cb599eb026d375f2b2d87543..85fe3c01492fb34d7cf3086e79493f3382fbe4b1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,11 @@ What's New in Python 2.7 beta 1?
 Core and Builtins
 -----------------
 
+- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
+  (SIGINT). If an error occurs while importing the site module, the error is
+  printed and Python exits. Initialize the GIL before importing the site
+  module.
+
 Library
 -------
 
index 1511dd9d30e3ea39972b529c612c9fd29437aae5..7f98ed07a909d50e3aff4846866b61c8232f1844 100644 (file)
@@ -573,10 +573,16 @@ Py_Main(int argc, char **argv)
                }
 
                if (sts==-1) {
-                       sts = PyRun_AnyFileExFlags(
-                               fp,
-                               filename == NULL ? "<stdin>" : filename,
-                               filename != NULL, &cf) != 0;
+                       /* call pending calls like signal handlers (SIGINT) */
+                       if (Py_MakePendingCalls() == -1) {
+                               PyErr_Print();
+                               sts = 1;
+                       } else {
+                               sts = PyRun_AnyFileExFlags(
+                                       fp,
+                                       filename == NULL ? "<stdin>" : filename,
+                                       filename != NULL, &cf) != 0;
+                       }
                }
                
        }
index b881e7ce7ed17c2f9b2435e0e47dc093d2545658..d60b25694aad0f7dd9af4ade46b688bad9d216b2 100644 (file)
@@ -817,8 +817,12 @@ error_nomem:
        return -1;
 
 error_clear:
-       /* Fallback to iso-8859-1: for backward compatibility */
        Py_DECREF(enc);
+       if (!PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
+               tok->done = E_ERROR;
+               return -1;
+       }
+       /* Fallback to iso-8859-1: for backward compatibility */
        PyErr_Clear();
        return 0;
 }
index eb50bc56f1ba54364e1c6d30530f4b63ae71a0c9..bcdd68e0ef80ccdd208568e4f88c44c0d0a34691 100644 (file)
@@ -2748,8 +2748,6 @@ PyImport_Import(PyObject *module_name)
        }
        else {
                /* No globals -- use standard builtins, and fake globals */
-               PyErr_Clear();
-
                builtins = PyImport_ImportModuleLevel("__builtin__",
                                                      NULL, NULL, NULL, 0);
                if (builtins == NULL)
index 4f8417a31f3f94d237cf5c0192f3bf787336b71d..ada1481ca110a627ac6c9d9948ed4886bc0f16c8 100644 (file)
@@ -248,14 +248,15 @@ Py_InitializeEx(int install_sigs)
        }
 
        initmain(); /* Module __main__ */
-       if (!Py_NoSiteFlag)
-               initsite(); /* Module site */
 
        /* auto-thread-state API, if available */
 #ifdef WITH_THREAD
        _PyGILState_Init(interp, tstate);
 #endif /* WITH_THREAD */
 
+       if (!Py_NoSiteFlag)
+               initsite(); /* Module site */
+
        if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') {
                p = icodeset = codeset = strdup(p);
                free_codeset = 1;
@@ -284,8 +285,13 @@ Py_InitializeEx(int install_sigs)
                                loc_codeset = strdup(loc_codeset);
                                Py_DECREF(enc);
                        } else {
-                               loc_codeset = NULL;
-                               PyErr_Clear();
+                               if (PyErr_ExceptionMatches(PyExc_LookupError)) {
+                                       PyErr_Clear();
+                                       loc_codeset = NULL;
+                               } else {
+                                       PyErr_Print();
+                                       exit(1);
+                               }
                        }
                } else
                        loc_codeset = NULL;
@@ -704,20 +710,12 @@ initmain(void)
 static void
 initsite(void)
 {
-       PyObject *m, *f;
+       PyObject *m;
        m = PyImport_ImportModule("site");
        if (m == NULL) {
-               f = PySys_GetObject("stderr");
-               if (Py_VerboseFlag) {
-                       PyFile_WriteString(
-                               "'import site' failed; traceback:\n", f);
-                       PyErr_Print();
-               }
-               else {
-                       PyFile_WriteString(
-                         "'import site' failed; use -v for traceback\n", f);
-                       PyErr_Clear();
-               }
+               PyErr_Print();
+               Py_Finalize();
+               exit(1);
        }
        else {
                Py_DECREF(m);
@@ -1546,6 +1544,8 @@ err_input(perrdetail *err)
        char *msg = NULL;
        errtype = PyExc_SyntaxError;
        switch (err->error) {
+       case E_ERROR:
+               return;
        case E_SYNTAX:
                errtype = PyExc_IndentationError;
                if (err->expected == INDENT)