Issue #16060: Fix a double DECREF in int() implementation. Thanks Serhiy Storchaka.
This commit is contained in:
parent
3658cb3012
commit
7c95bb35e4
@ -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?
|
|||||||
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)
|
|||||||
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);
|
||||||
|
if (!as_int || PyLong_Check(as_int)) {
|
||||||
Py_DECREF(integral);
|
Py_DECREF(integral);
|
||||||
if (!as_int)
|
|
||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user