summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Dickinson <mdickinson@enthought.com>2012-09-27 19:38:59 +0100
committerMark Dickinson <mdickinson@enthought.com>2012-09-27 19:38:59 +0100
commit3d7838593bb7b196e39f93eb6457ff9ef2ffbb5a (patch)
tree32f2061b50d07a5954a48b2a271355db5c7faaa9
parent0beb4d28d01759a95ea4de5ff77dff537de718ef (diff)
downloadcpython-git-3d7838593bb7b196e39f93eb6457ff9ef2ffbb5a.tar.gz
Issue #16060: Fix a double DECREF in int() implementation. Thanks Serhiy Storchaka.
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/abstract.c7
2 files changed, 6 insertions, 4 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 6922b25f2c..314b5a6d63 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ Core and Builtins
- Issue #16046: Fix loading sourceless legacy .pyo files.
+- Issue #16060: Fix refcounting bug when __trunc__ returns an object
+ whose __int__ gives a non-integer. Patch by Serhiy Storchaka.
+
Library
-------
diff --git a/Objects/abstract.c b/Objects/abstract.c
index ed5e196843..a2737dd5f4 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1228,11 +1228,10 @@ convert_integral_to_int(PyObject *integral, const char *error_format)
nb = Py_TYPE(integral)->tp_as_number;
if (nb->nb_int) {
PyObject *as_int = nb->nb_int(integral);
- Py_DECREF(integral);
- if (!as_int)
- return NULL;
- if (PyLong_Check(as_int))
+ if (!as_int || PyLong_Check(as_int)) {
+ Py_DECREF(integral);
return as_int;
+ }
Py_DECREF(as_int);
}
PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);