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