summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <mdickinson@enthought.com>2012-04-20 20:44:09 (GMT)
committerMark Dickinson <mdickinson@enthought.com>2012-04-20 20:44:09 (GMT)
commit9a359bd97f5fc0ab3ae830ad874eda6e5e76b14c (patch)
tree8bcf005c7f780b3496e5a894c9575cf5a6b59dac
parente28465482c19ec0bb43c1529c6fb1a823915f2d3 (diff)
parentbcc17eefd2b630aca2fc0f4e27f274a028030542 (diff)
downloadcpython-9a359bd97f5fc0ab3ae830ad874eda6e5e76b14c.zip
cpython-9a359bd97f5fc0ab3ae830ad874eda6e5e76b14c.tar.gz
cpython-9a359bd97f5fc0ab3ae830ad874eda6e5e76b14c.tar.bz2
Issue #14630: Merge fix from 3.2.
-rw-r--r--Lib/test/test_long.py14
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/longobject.c4
3 files changed, 18 insertions, 3 deletions
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 05b3e3e..b417bea 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -1228,6 +1228,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 abd7c50..08a1dd3 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.3.0 Alpha 3?
Core and Builtins
-----------------
+- Issue #14630: Fix a memory access bug for instances of a subclass of int
+ with value 0.
+
- Issue #14339: Speed improvements to bin, oct and hex functions. Patch by
Serhiy Storchaka.
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 0a5b9aa..3630ae4 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);