[Zodb-checkins] SVN: ZODB/trunk/src/ Bug Fixed:

Jim Fulton jim at zope.com
Fri May 7 17:55:07 EDT 2010


Log message for revision 112175:
  Bug Fixed:
    BTree sets and tree sets didn't correctly check values passed to
    update or to constructors, causing Python to exit under certain
    circumstances.
  

Changed:
  U   ZODB/trunk/src/BTrees/SetTemplate.c
  U   ZODB/trunk/src/BTrees/TreeSetTemplate.c
  U   ZODB/trunk/src/BTrees/tests/testBTrees.py
  U   ZODB/trunk/src/CHANGES.txt

-=-
Modified: ZODB/trunk/src/BTrees/SetTemplate.c
===================================================================
--- ZODB/trunk/src/BTrees/SetTemplate.c	2010-05-07 21:54:49 UTC (rev 112174)
+++ ZODB/trunk/src/BTrees/SetTemplate.c	2010-05-07 21:55:07 UTC (rev 112175)
@@ -32,10 +32,9 @@
 static int
 _Set_update(Bucket *self, PyObject *seq)
 {
-    int n = -1;
+    int n=0, ind=0;
     PyObject *iter, *v;
-    int ind;
-
+ 
     iter = PyObject_GetIter(seq);
     if (iter == NULL)
 	return -1;
@@ -55,15 +54,11 @@
 	else
 	    n += ind;
     }
-    /* n starts out at -1, which is the error return value.  If
-       this point is reached, then there is no error.  n must be
-       incremented to account for the initial value of -1 instead of
-       0.
-    */
-    n++;
 
  err:
     Py_DECREF(iter);
+    if (ind < 0)
+      return -1;
     return n;
 }
 

Modified: ZODB/trunk/src/BTrees/TreeSetTemplate.c
===================================================================
--- ZODB/trunk/src/BTrees/TreeSetTemplate.c	2010-05-07 21:54:49 UTC (rev 112174)
+++ ZODB/trunk/src/BTrees/TreeSetTemplate.c	2010-05-07 21:55:07 UTC (rev 112175)
@@ -35,9 +35,8 @@
 static int
 _TreeSet_update(BTree *self, PyObject *seq)
 {
-    int n = -1;
+    int n=0, ind=0;
     PyObject *iter, *v;
-    int ind;
 
     iter = PyObject_GetIter(seq);
     if (iter == NULL)
@@ -58,15 +57,11 @@
 	else
 	    n += ind;
     }
-    /* n starts out at -1, which is the error return value.  If
-       this point is reached, then there is no error.  n must be
-       incremented to account for the initial value of -1 instead of
-       0.
-    */
-    n++;
 
  err:
     Py_DECREF(iter);
+    if (ind < 0)
+      return -1;
     return n;
 }
 

Modified: ZODB/trunk/src/BTrees/tests/testBTrees.py
===================================================================
--- ZODB/trunk/src/BTrees/tests/testBTrees.py	2010-05-07 21:54:49 UTC (rev 112174)
+++ ZODB/trunk/src/BTrees/tests/testBTrees.py	2010-05-07 21:55:07 UTC (rev 112175)
@@ -1387,10 +1387,13 @@
     def _noneraisesvalue(self):
         self.t[1] = None
 
-class TestIOSets(TestCase):
-    def setUp(self):
-        self.t = IOSet()
+class TestI_Sets(TestCase):
 
+    def testBadBadKeyAfterFirst(self):
+        self.assertRaises(TypeError, self.t.__class__, [1, ''])
+        self.assertRaises(TypeError, self.t.update, [1, ''])
+        del self.t
+
     def testNonIntegerInsertRaises(self):
         self.assertRaises(TypeError,self._insertstringraises)
         self.assertRaises(TypeError,self._insertfloatraises)
@@ -1405,6 +1408,47 @@
     def _insertnoneraises(self):
         self.t.insert(None)
 
+class TestIOSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = IOSet()
+
+class TestIOTreeSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = IOTreeSet()
+
+class TestIISets(TestI_Sets):
+
+    def setUp(self):
+        self.t = IISet()
+
+class TestIITreeSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = IITreeSet()
+
+class TestLOSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = LOSet()
+
+class TestLOTreeSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = LOTreeSet()
+
+class TestLLSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = LLSet()
+
+class TestLLTreeSets(TestI_Sets):
+
+    def setUp(self):
+        self.t = LLTreeSet()
+
+
 class DegenerateBTree(TestCase):
     # Build a degenerate tree (set).  Boxes are BTree nodes.  There are
     # 5 leaf buckets, each containing a single int.  Keys in the BTree
@@ -1758,7 +1802,6 @@
         self.assertEqual(len(t), 0)
         self.assertEqual(len(LP294788_ids), 0)
 
-
 class IIBTreeTest(BTreeTests):
     def setUp(self):
         self.t = IIBTree()
@@ -2083,7 +2126,8 @@
         # checking for assorted TypeErrors, and when both keys
         # and values are objects (OO), there's nothing to test.
         TestIIBTrees, TestIFBTrees,  TestIOBTrees,  TestOIBTrees,
-        TestIOSets,
+        TestIOSets, TestIOTreeSets, TestIISets, TestIITreeSets,
+        TestLOSets, TestLOTreeSets, TestLLSets, TestLLTreeSets,
         DegenerateBTree,
         TestCmpError,
         BugFixes,

Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-05-07 21:54:49 UTC (rev 112174)
+++ ZODB/trunk/src/CHANGES.txt	2010-05-07 21:55:07 UTC (rev 112175)
@@ -14,6 +14,13 @@
 
   https://bugs.launchpad.net/zodb/+bug/118512
 
+Bugs Fixed
+----------
+
+- BTree sets and tree sets didn't correctly check values passed to
+  update or to constructors, causing Python to exit under certain
+  circumstances.
+
 3.10.0a2 (2010-05-04)
 =====================
 
@@ -53,7 +60,6 @@
 - ZEO servers no longer log their pids in every log message. It's just
   not interesting. :)
 
-
 Bugs Fixed
 ----------
 



More information about the Zodb-checkins mailing list