summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2013-04-13 16:46:04 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2013-04-13 16:46:04 (GMT)
commit93196eb44f935de8132fd79e8be215657ea6b600 (patch)
tree973f08b65f19f2d48d33bde4734080caf16798f5
parent171bb26b32a30d782fdb63d1f1bcb4aa72460944 (diff)
parentc9734484ca774afad49e361f72cad60d937acf1b (diff)
downloadcpython-93196eb44f935de8132fd79e8be215657ea6b600.zip
cpython-93196eb44f935de8132fd79e8be215657ea6b600.tar.gz
cpython-93196eb44f935de8132fd79e8be215657ea6b600.tar.bz2
Issue #17715: Merge fix from 3.3.
-rw-r--r--Lib/test/test_int.py6
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/abstract.c2
3 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py
index afc9169..4921230 100644
--- a/Lib/test/test_int.py
+++ b/Lib/test/test_int.py
@@ -354,6 +354,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):
diff --git a/Misc/NEWS b/Misc/NEWS
index c4a73de..24691d5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins
-----------------
+- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
+ method.
+
- Issue #17643: Add __callback__ attribute to weakref.ref.
- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 4326cfa..bfd53c9 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1314,6 +1314,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,