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.
This commit is contained in:
Victor Stinner 2010-03-10 22:30:19 +00:00
parent e9e07bf5c9
commit 6664426d7c
6 changed files with 48 additions and 23 deletions

View file

@ -489,6 +489,12 @@ def execsitecustomize():
import sitecustomize import sitecustomize
except ImportError: except ImportError:
pass 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(): def execusercustomize():
@ -497,6 +503,12 @@ def execusercustomize():
import usercustomize import usercustomize
except ImportError: except ImportError:
pass 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(): def main():

View file

@ -12,6 +12,11 @@ What's New in Python 2.7 beta 1?
Core and Builtins 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 Library
------- -------

View file

@ -573,10 +573,16 @@ Py_Main(int argc, char **argv)
} }
if (sts==-1) { if (sts==-1) {
sts = PyRun_AnyFileExFlags( /* call pending calls like signal handlers (SIGINT) */
fp, if (Py_MakePendingCalls() == -1) {
filename == NULL ? "<stdin>" : filename, PyErr_Print();
filename != NULL, &cf) != 0; sts = 1;
} else {
sts = PyRun_AnyFileExFlags(
fp,
filename == NULL ? "<stdin>" : filename,
filename != NULL, &cf) != 0;
}
} }
} }

View file

@ -817,8 +817,12 @@ error_nomem:
return -1; return -1;
error_clear: error_clear:
/* Fallback to iso-8859-1: for backward compatibility */
Py_DECREF(enc); Py_DECREF(enc);
if (!PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
tok->done = E_ERROR;
return -1;
}
/* Fallback to iso-8859-1: for backward compatibility */
PyErr_Clear(); PyErr_Clear();
return 0; return 0;
} }

View file

@ -2748,8 +2748,6 @@ PyImport_Import(PyObject *module_name)
} }
else { else {
/* No globals -- use standard builtins, and fake globals */ /* No globals -- use standard builtins, and fake globals */
PyErr_Clear();
builtins = PyImport_ImportModuleLevel("__builtin__", builtins = PyImport_ImportModuleLevel("__builtin__",
NULL, NULL, NULL, 0); NULL, NULL, NULL, 0);
if (builtins == NULL) if (builtins == NULL)

View file

@ -248,14 +248,15 @@ Py_InitializeEx(int install_sigs)
} }
initmain(); /* Module __main__ */ initmain(); /* Module __main__ */
if (!Py_NoSiteFlag)
initsite(); /* Module site */
/* auto-thread-state API, if available */ /* auto-thread-state API, if available */
#ifdef WITH_THREAD #ifdef WITH_THREAD
_PyGILState_Init(interp, tstate); _PyGILState_Init(interp, tstate);
#endif /* WITH_THREAD */ #endif /* WITH_THREAD */
if (!Py_NoSiteFlag)
initsite(); /* Module site */
if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') { if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') {
p = icodeset = codeset = strdup(p); p = icodeset = codeset = strdup(p);
free_codeset = 1; free_codeset = 1;
@ -284,8 +285,13 @@ Py_InitializeEx(int install_sigs)
loc_codeset = strdup(loc_codeset); loc_codeset = strdup(loc_codeset);
Py_DECREF(enc); Py_DECREF(enc);
} else { } else {
loc_codeset = NULL; if (PyErr_ExceptionMatches(PyExc_LookupError)) {
PyErr_Clear(); PyErr_Clear();
loc_codeset = NULL;
} else {
PyErr_Print();
exit(1);
}
} }
} else } else
loc_codeset = NULL; loc_codeset = NULL;
@ -704,20 +710,12 @@ initmain(void)
static void static void
initsite(void) initsite(void)
{ {
PyObject *m, *f; PyObject *m;
m = PyImport_ImportModule("site"); m = PyImport_ImportModule("site");
if (m == NULL) { if (m == NULL) {
f = PySys_GetObject("stderr"); PyErr_Print();
if (Py_VerboseFlag) { Py_Finalize();
PyFile_WriteString( exit(1);
"'import site' failed; traceback:\n", f);
PyErr_Print();
}
else {
PyFile_WriteString(
"'import site' failed; use -v for traceback\n", f);
PyErr_Clear();
}
} }
else { else {
Py_DECREF(m); Py_DECREF(m);
@ -1546,6 +1544,8 @@ err_input(perrdetail *err)
char *msg = NULL; char *msg = NULL;
errtype = PyExc_SyntaxError; errtype = PyExc_SyntaxError;
switch (err->error) { switch (err->error) {
case E_ERROR:
return;
case E_SYNTAX: case E_SYNTAX:
errtype = PyExc_IndentationError; errtype = PyExc_IndentationError;
if (err->expected == INDENT) if (err->expected == INDENT)