Issue #14630: Fix an incorrect access of ob_digit[0] for a zero instance of an int subclass.

This commit is contained in:
Mark Dickinson 2012-04-20 21:42:49 +01:00
parent 63674f4b52
commit bcc17eefd2
3 changed files with 18 additions and 3 deletions

View File

@ -1148,6 +1148,20 @@ class LongTest(unittest.TestCase):
self.assertRaises(TypeError, myint.from_bytes, 0, 'big')
self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
def test_access_to_nonexistent_digit_0(self):
# http://bugs.python.org/issue14630: A bug in _PyLong_Copy meant that
# ob_digit[0] was being incorrectly accessed for instances of a
# subclass of int, with value 0.
class Integer(int):
def __new__(cls, value=0):
self = int.__new__(cls, value)
self.foo = 'foo'
return self
integers = [Integer(0) for i in range(1000)]
for n in map(int, integers):
self.assertEqual(n, 0)
def test_main():
support.run_unittest(LongTest)

View File

@ -10,6 +10,9 @@ What's New in Python 3.2.4
Core and Builtins
-----------------
- Issue #14630: Fix a memory access bug for instances of a subclass of int
with value 0.
- Issue #14612: Fix jumping around with blocks by setting f_lineno.
- Issue #14607: Fix keyword-only arguments which started with ``__``.

View File

@ -156,9 +156,7 @@ _PyLong_Copy(PyLongObject *src)
if (i < 0)
i = -(i);
if (i < 2) {
sdigit ival = src->ob_digit[0];
if (Py_SIZE(src) < 0)
ival = -ival;
sdigit ival = MEDIUM_VALUE(src);
CHECK_SMALL_INT(ival);
}
result = _PyLong_New(i);