]> granicus.if.org Git - python/commitdiff
Issue #17715: Add missing NULL Check to PyNumber_Long.
authorMark Dickinson <dickinsm@gmail.com>
Sat, 13 Apr 2013 16:44:44 +0000 (17:44 +0100)
committerMark Dickinson <dickinsm@gmail.com>
Sat, 13 Apr 2013 16:44:44 +0000 (17:44 +0100)
Lib/test/test_int.py
Misc/NEWS
Objects/abstract.c

index c35a42f59673d05990a19f0d491b1dbf187c69a6..703c23312d474dcd577b2645b87e9c8380e129b4 100644 (file)
@@ -313,6 +313,12 @@ class IntTestCases(unittest.TestCase):
                     return 42
             self.assertEqual(int(JustTrunc()), 42)
 
+            class ExceptionalTrunc(base):
+                def __trunc__(self):
+                    1 / 0
+            with self.assertRaises(ZeroDivisionError):
+                int(ExceptionalTrunc())
+
             for trunc_result_base in (object, Classic):
                 class Integral(trunc_result_base):
                     def __int__(self):
index e04324fce95587c4787ff5f1b5ccec800d00f7d4..4fd149a796ed211725d7977e39fc9710c19ef4ef 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.3.2?
 Core and Builtins
 -----------------
 
+- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
+  method.
+
 - Issue #16447: Fixed potential segmentation fault when setting __name__ on a
   class.
 
index a2737dd5f4fb2910213cb822df770cc21779b376..7c247243143f96cab5b20a0b9b83699e2f3f6fd8 100644 (file)
@@ -1293,6 +1293,8 @@ PyNumber_Long(PyObject *o)
         PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
         PyObject *int_instance;
         Py_DECREF(trunc_func);
+        if (truncated == NULL)
+            return NULL;
         /* __trunc__ is specified to return an Integral type,
            but int() needs to return a int. */
         int_instance = convert_integral_to_int(truncated,