From: Mark Dickinson Date: Fri, 20 Apr 2012 20:42:49 +0000 (+0100) Subject: Issue #14630: Fix an incorrect access of ob_digit[0] for a zero instance of an int... X-Git-Tag: v3.3.0a3~111^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bcc17eefd2b630aca2fc0f4e27f274a028030542;p=python Issue #14630: Fix an incorrect access of ob_digit[0] for a zero instance of an int subclass. --- diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 04066ec1e7..3ebc1f7fed 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index addae1b54c..56d48764b2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 ``__``. diff --git a/Objects/longobject.c b/Objects/longobject.c index a0b16a66f2..a735e33e04 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -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);