at 15.09-beta 5.6 kB view raw
1From be19c1f32e4d430092c029f17984f0087a2b2087 Mon Sep 17 00:00:00 2001 2From: Jim Fulton <jim@zope.com> 3Date: Mon, 19 May 2014 19:52:43 -0400 4Subject: [PATCH 1/2] Fixed: integer overflow on 32-bit machines wasn't 5 detected correctly under Python 3. 6 7--- 8 BTrees/intkeymacros.h | 7 ++++--- 9 BTrees/intvaluemacros.h | 3 ++- 10 BTrees/tests/testBTrees.py | 11 +++++++++-- 11 BTrees/tests/test_IIBTree.py | 2 ++ 12 CHANGES.rst | 2 ++ 13 5 files changed, 19 insertions(+), 6 deletions(-) 14 15diff --git a/BTrees/intkeymacros.h b/BTrees/intkeymacros.h 16index d439aa0..f9244b5 100644 17--- a/BTrees/intkeymacros.h 18+++ b/BTrees/intkeymacros.h 19@@ -19,9 +19,10 @@ 20 #define KEY_CHECK INT_CHECK 21 #define COPY_KEY_TO_OBJECT(O, K) O=INT_FROM_LONG(K) 22 #define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \ 23- if (INT_CHECK(ARG)) { \ 24- long vcopy = INT_AS_LONG(ARG); \ 25- if ((int)vcopy != vcopy) { \ 26+ if (INT_CHECK(ARG)) { \ 27+ long vcopy = INT_AS_LONG(ARG); \ 28+ if (PyErr_Occurred()) { (STATUS)=0; (TARGET)=0; } \ 29+ else if ((int)vcopy != vcopy) { \ 30 PyErr_SetString(PyExc_TypeError, "integer out of range"); \ 31 (STATUS)=0; (TARGET)=0; \ 32 } \ 33diff --git a/BTrees/intvaluemacros.h b/BTrees/intvaluemacros.h 34index b77a5c9..3072eea 100644 35--- a/BTrees/intvaluemacros.h 36+++ b/BTrees/intvaluemacros.h 37@@ -23,7 +23,8 @@ 38 #define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \ 39 if (INT_CHECK(ARG)) { \ 40 long vcopy = INT_AS_LONG(ARG); \ 41- if ((int)vcopy != vcopy) { \ 42+ if (PyErr_Occurred()) { (STATUS)=0; (TARGET)=0; } \ 43+ else if ((int)vcopy != vcopy) { \ 44 PyErr_SetString(PyExc_TypeError, "integer out of range"); \ 45 (STATUS)=0; (TARGET)=0; \ 46 } \ 47diff --git a/BTrees/tests/testBTrees.py b/BTrees/tests/testBTrees.py 48index 50f5b43..31d641d 100644 49--- a/BTrees/tests/testBTrees.py 50+++ b/BTrees/tests/testBTrees.py 51@@ -11,8 +11,11 @@ 52 # FOR A PARTICULAR PURPOSE 53 # 54 ############################################################################## 55+import sys 56 import unittest 57 58+python3 = sys.version_info >= (3, ) 59+ 60 from BTrees.tests.common import permutations 61 62 63@@ -451,8 +454,12 @@ def test32(self): 64 # the characteristics change to match the 64 bit version, please 65 # feel free to change. 66 big = BTrees.family32.maxint + 1 67- self.assertRaises(TypeError, s.insert, big) 68- self.assertRaises(TypeError, s.insert, BTrees.family32.minint - 1) 69+ if python3: 70+ expected_exception = OverflowError 71+ else: 72+ expected_exception = TypeError 73+ self.assertRaises(expected_exception, s.insert, 74+ BTrees.family32.minint - 1) 75 self.check_pickling(BTrees.family32) 76 77 def test64(self): 78diff --git a/BTrees/tests/test_IIBTree.py b/BTrees/tests/test_IIBTree.py 79index 72e95b2..fe776b8 100644 80--- a/BTrees/tests/test_IIBTree.py 81+++ b/BTrees/tests/test_IIBTree.py 82@@ -113,6 +113,8 @@ def trial(i): 83 i = int(i) 84 try: 85 b[i] = 0 86+ except OverflowError: 87+ self.assertRaises(OverflowError, b.__setitem__, 0, i) 88 except TypeError: 89 self.assertRaises(TypeError, b.__setitem__, 0, i) 90 else: 91diff --git a/CHANGES.rst b/CHANGES.rst 92index 4696be3..e3869ff 100644 93--- a/CHANGES.rst 94+++ b/CHANGES.rst 95@@ -1,6 +1,8 @@ 96 ``BTrees`` Changelog 97 ==================== 98 99+- Fixed: integer overflow on 32-bit machines wasn't detected correctly 100+ under Python 3. 101 102 4.0.9 (unreleased) 103 ------------------ 104-- 1052.0.4 106 107 108From 11a51d2a12bb9904e96349ff86e78e24a0ebe51a Mon Sep 17 00:00:00 2001 109From: Jim Fulton <jim@zope.com> 110Date: Wed, 21 May 2014 07:33:06 -0400 111Subject: [PATCH 2/2] added back test mistakedly removed. 112 113We have to check both TypeError and OverflowError. On Python3 32-bit, 114we'll get an OverflowError, otherwise, we get type error. 115--- 116 BTrees/tests/testBTrees.py | 14 +++++++------- 117 1 file changed, 7 insertions(+), 7 deletions(-) 118 119diff --git a/BTrees/tests/testBTrees.py b/BTrees/tests/testBTrees.py 120index 31d641d..d9be43a 100644 121--- a/BTrees/tests/testBTrees.py 122+++ b/BTrees/tests/testBTrees.py 123@@ -453,13 +453,13 @@ def test32(self): 124 # this next bit illustrates an, um, "interesting feature". If 125 # the characteristics change to match the 64 bit version, please 126 # feel free to change. 127- big = BTrees.family32.maxint + 1 128- if python3: 129- expected_exception = OverflowError 130- else: 131- expected_exception = TypeError 132- self.assertRaises(expected_exception, s.insert, 133- BTrees.family32.minint - 1) 134+ try: s.insert(BTrees.family32.maxint + 1) 135+ except (TypeError, OverflowError): pass 136+ else: self.assert_(False) 137+ 138+ try: s.insert(BTrees.family32.minint - 1) 139+ except (TypeError, OverflowError): pass 140+ else: self.assert_(False) 141 self.check_pickling(BTrees.family32) 142 143 def test64(self): 144-- 1452.0.4 146