Kaydet (Commit) 7c95bb35 authored tarafından Mark Dickinson's avatar Mark Dickinson

Issue #16060: Fix a double DECREF in int() implementation. Thanks Serhiy Storchaka.

üst 3658cb30
...@@ -305,6 +305,18 @@ class IntTestCases(unittest.TestCase): ...@@ -305,6 +305,18 @@ class IntTestCases(unittest.TestCase):
self.fail("Failed to raise TypeError with %s" % self.fail("Failed to raise TypeError with %s" %
((base, trunc_result_base),)) ((base, trunc_result_base),))
# Regression test for bugs.python.org/issue16060.
class BadInt(trunc_result_base):
def __int__(self):
return 42.0
class TruncReturnsBadInt(base):
def __trunc__(self):
return BadInt()
with self.assertRaises(TypeError):
int(TruncReturnsBadInt())
def test_error_message(self): def test_error_message(self):
testlist = ('\xbd', '123\xbd', ' 123 456 ') testlist = ('\xbd', '123\xbd', ' 123 456 ')
for s in testlist: for s in testlist:
......
...@@ -10,6 +10,9 @@ What's New in Python 3.3.1? ...@@ -10,6 +10,9 @@ What's New in Python 3.3.1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #16060: Fix refcounting bug when __trunc__ returns an object
whose __int__ gives a non-integer. Patch by Serhiy Storchaka.
- Issue #16046: Fix loading sourceless legacy pyos. - Issue #16046: Fix loading sourceless legacy pyos.
- Issue #15379: Fix passing of non-BMP characters as integers for the charmap - Issue #15379: Fix passing of non-BMP characters as integers for the charmap
......
...@@ -1228,11 +1228,10 @@ convert_integral_to_int(PyObject *integral, const char *error_format) ...@@ -1228,11 +1228,10 @@ convert_integral_to_int(PyObject *integral, const char *error_format)
nb = Py_TYPE(integral)->tp_as_number; nb = Py_TYPE(integral)->tp_as_number;
if (nb->nb_int) { if (nb->nb_int) {
PyObject *as_int = nb->nb_int(integral); PyObject *as_int = nb->nb_int(integral);
Py_DECREF(integral); if (!as_int || PyLong_Check(as_int)) {
if (!as_int) Py_DECREF(integral);
return NULL;
if (PyLong_Check(as_int))
return as_int; return as_int;
}
Py_DECREF(as_int); Py_DECREF(as_int);
} }
PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name); PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment