[Python-checkins] cpython (merge 3.2 -> default): Issue #14630: Merge fix from 3.2.

mark.dickinson python-checkins at python.org
Fri Apr 20 22:44:31 CEST 2012


http://hg.python.org/cpython/rev/c7b0f711dc15
changeset:   76441:c7b0f711dc15
parent:      76439:dcd3344b6d5b
parent:      76440:cdcc6b489862
user:        Mark Dickinson <mdickinson at enthought.com>
date:        Fri Apr 20 21:44:09 2012 +0100
summary:
  Issue #14630: Merge fix from 3.2.

files:
  Lib/test/test_long.py |  14 ++++++++++++++
  Misc/NEWS             |   3 +++
  Objects/longobject.c  |   4 +---
  3 files changed, 18 insertions(+), 3 deletions(-)


diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -1228,6 +1228,20 @@
         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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 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
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -156,9 +156,7 @@
     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);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list