summaryrefslogtreecommitdiff
path: root/Python/errors.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-09-15 00:23:08 +0200
committerVictor Stinner <victor.stinner@gmail.com>2015-09-15 00:23:08 +0200
commit458032a249e61213cfd53f3e27dcc16003310812 (patch)
tree7a2b9eec68501024a0ef4fc35b5ebf2b1df3433d /Python/errors.c
parent7151648468b2f2c3f02ded08a369343693c5dcd8 (diff)
parentfebef19231812bb0c0afe128320aa4790aaa3911 (diff)
downloadcpython-458032a249e61213cfd53f3e27dcc16003310812.tar.gz
Merge 3.4 (test_gdb)
Diffstat (limited to 'Python/errors.c')
-rw-r--r--Python/errors.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/Python/errors.c b/Python/errors.c
index b0ad9aa58b..aed2bdc12d 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -74,11 +74,11 @@ PyErr_SetObject(PyObject *exception, PyObject *value)
if (value == NULL || !PyExceptionInstance_Check(value)) {
/* We must normalize the value right now */
PyObject *args, *fixed_value;
-#ifdef Py_DEBUG
- /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
- error if an exception is set when it is called */
+
+ /* Issue #23571: PyEval_CallObject() must not be called with an
+ exception set */
PyErr_Clear();
-#endif
+
if (value == NULL || value == Py_None)
args = PyTuple_New(0);
else if (PyTuple_Check(value)) {
@@ -319,7 +319,7 @@ finally:
Py_DECREF(*exc);
Py_DECREF(*val);
/* ... and use the recursion error instead */
- *exc = PyExc_RuntimeError;
+ *exc = PyExc_RecursionError;
*val = PyExc_RecursionErrorInst;
Py_INCREF(*exc);
Py_INCREF(*val);
@@ -773,34 +773,38 @@ PyErr_BadInternalCall(void)
#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
+PyObject *
+PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
+{
+ PyObject* string;
+
+ /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
+ exception set, it calls arbitrary Python code like PyObject_Repr() */
+ PyErr_Clear();
+
+ string = PyUnicode_FromFormatV(format, vargs);
+
+ PyErr_SetObject(exception, string);
+ Py_XDECREF(string);
+ return NULL;
+}
+
PyObject *
PyErr_Format(PyObject *exception, const char *format, ...)
{
va_list vargs;
- PyObject* string;
-
#ifdef HAVE_STDARG_PROTOTYPES
va_start(vargs, format);
#else
va_start(vargs);
#endif
-
-#ifdef Py_DEBUG
- /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
- if an exception is set when it is called */
- PyErr_Clear();
-#endif
-
- string = PyUnicode_FromFormatV(format, vargs);
- PyErr_SetObject(exception, string);
- Py_XDECREF(string);
+ PyErr_FormatV(exception, format, vargs);
va_end(vargs);
return NULL;
}
-
PyObject *
PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
{
@@ -1121,6 +1125,10 @@ PyErr_ProgramTextObject(PyObject *filename, int lineno)
if (filename == NULL || lineno <= 0)
return NULL;
fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE);
+ if (fp == NULL) {
+ PyErr_Clear();
+ return NULL;
+ }
return err_programtext(fp, lineno);
}