[Zope-Checkins] CVS: Zope/lib/python/BTrees - MergeTemplate.c:1.13 SetOpTemplate.c:1.18

Tim Peters tim.one@comcast.net
Mon, 3 Jun 2002 13:21:56 -0400


Update of /cvs-repository/Zope/lib/python/BTrees
In directory cvs.zope.org:/tmp/cvs-serv19248

Modified Files:
	MergeTemplate.c SetOpTemplate.c 
Log Message:
Repaired various leaks due to code leaving references behind in
SetIteration structs.


=== Zope/lib/python/BTrees/MergeTemplate.c 1.12 => 1.13 ===
   int cmp12, cmp13, cmp23, mapping=0, set;
 
-  /* XXX Looks like the various "return NULL;" exits from here on can
-   * XXX leak references saved away in i1.set, i2.set, i3.set.
-   */
-  if (initSetIteration(&i1, OBJECT(s1), 0, &mapping) < 0) return NULL;
-  if (initSetIteration(&i2, OBJECT(s2), 0, &mapping) < 0) return NULL;
-  if (initSetIteration(&i3, OBJECT(s3), 0, &mapping) < 0) return NULL;
+  if (initSetIteration(&i1, OBJECT(s1), 0, &mapping) < 0) goto err;
+  if (initSetIteration(&i2, OBJECT(s2), 0, &mapping) < 0) goto err;
+  if (initSetIteration(&i3, OBJECT(s3), 0, &mapping) < 0) goto err;
 
   set = ! mapping;
 
@@ -80,9 +77,9 @@
         goto err;
     }
 
-  if (i1.next(&i1) < 0) return NULL;
-  if (i2.next(&i2) < 0) return NULL;
-  if (i3.next(&i3) < 0) return NULL;
+  if (i1.next(&i1) < 0) goto err;
+  if (i2.next(&i2) < 0) goto err;
+  if (i3.next(&i3) < 0) goto err;
 
   while (i1.position >= 0 && i2.position >= 0 && i3.position >= 0)
     {


=== Zope/lib/python/BTrees/SetOpTemplate.c 1.17 => 1.18 ===
   int cmp, merge=0;
 
-  if (initSetIteration(&i1, s1, w1, &merge) < 0) return NULL;
-  if (initSetIteration(&i2, s2, w2, &merge) < 0) return NULL;
+  if (initSetIteration(&i1, s1, w1, &merge) < 0) goto err;
+  if (initSetIteration(&i2, s2, w2, &merge) < 0) goto err;
 
   if (merge)
     {
@@ -247,12 +247,12 @@
         goto err;
     }
 
-  if (i1.next(&i1) < 0) return NULL;
-  if (i2.next(&i2) < 0) return NULL;
+  if (i1.next(&i1) < 0) goto err;
+  if (i2.next(&i2) < 0) goto err;
 
   while (i1.position >= 0 && i2.position >= 0)
     {
-      TEST_KEY_SET_OR(cmp, i1.key, i2.key) return NULL;
+      TEST_KEY_SET_OR(cmp, i1.key, i2.key) goto err;
       if(cmp < 0)
 	{
 	  if(c1)
@@ -489,20 +489,17 @@
             /* No cheap way:  iterate over set's elements one at a time. */
             int merge;  /* dummy needed for initSetIteration */
 
-            if (initSetIteration(&setiter, set, 1, &merge) < 0)
-                goto Error;
-            if (setiter.next(&setiter) < 0)
-                goto Error;
+            if (initSetIteration(&setiter, set, 1, &merge) < 0) goto Error;
+            if (setiter.next(&setiter) < 0) goto Error;
             while (setiter.position >= 0) {
                 if (result->len >= result->size && Bucket_grow(result, -1, 1) < 0)
                     goto Error;
                 COPY_KEY(result->keys[result->len], setiter.key);
                 ++result->len;
                 /* We know the key is an int, so no need to incref it. */
-                if (setiter.next(&setiter) < 0)
-                    goto Error;
+                if (setiter.next(&setiter) < 0) goto Error;
             }
-            Py_XDECREF(setiter.set);
+            Py_DECREF(setiter.set);
             setiter.set = NULL;
         }
         Py_DECREF(set);