]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Removed another occurrence of PyInt_ExactCheck()
authorChristian Heimes <christian@cheimes.de>
Tue, 4 Dec 2007 21:55:18 +0000 (21:55 +0000)
committerChristian Heimes <christian@cheimes.de>
Tue, 4 Dec 2007 21:55:18 +0000 (21:55 +0000)
I've modified the semantic of PyTraceBack_Print and sys.tracebacklimit slightly. Overfloats or values <= 0 are replaced with a default value to avoid infinite recursion and other issues.

Python/traceback.c

index df2a3a302ebdd7d7d174cb98eb64b115eed1887f..1a4ec1fd58cc88eb9a0a55a0264ccaf6262cf59d 100644 (file)
@@ -242,12 +242,15 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, int limit)
        return err;
 }
 
+#define PyTraceBack_LIMIT 1000
+
 int
 PyTraceBack_Print(PyObject *v, PyObject *f)
 {
        int err;
        PyObject *limitv;
-       int limit = 1000;
+       int limit = PyTraceBack_LIMIT;
+
        if (v == NULL)
                return 0;
        if (!PyTraceBack_Check(v)) {
@@ -255,10 +258,26 @@ PyTraceBack_Print(PyObject *v, PyObject *f)
                return -1;
        }
        limitv = PySys_GetObject("tracebacklimit");
-       if (limitv && PyInt_CheckExact(limitv)) {
+       if (limitv) {
+               PyObject *exc_type, *exc_value, *exc_tb;
+
+               PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
                limit = PyLong_AsLong(limitv);
-               if (limit <= 0)
-                       return 0;
+               if (limit == -1 && PyErr_Occurred()) {
+                       if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
+                               limit = PyTraceBack_LIMIT;
+                       }
+                       else {
+                               Py_XDECREF(exc_type);
+                               Py_XDECREF(exc_value);
+                               Py_XDECREF(exc_tb);
+                               return 0;
+                       }
+               }
+               else if (limit <= 0) {
+                       limit = PyTraceBack_LIMIT;
+               }
+               PyErr_Restore(exc_type, exc_value, exc_tb);
        }
        err = PyFile_WriteString("Traceback (most recent call last):\n", f);
        if (!err)