]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
fix leaks in keys(); fix bug in close()
authorGuido van Rossum <guido@python.org>
Mon, 28 Aug 1995 02:58:00 +0000 (02:58 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 28 Aug 1995 02:58:00 +0000 (02:58 +0000)
Modules/gdbmmodule.c

index 021531c2b7f784a0fedc5c1798212e9ecf700237..e5bc4ac110c0e8bd85d0900ec918bd5f21051996 100644 (file)
@@ -177,7 +177,6 @@ dbm_close(dp, args)
         if ( dp->di_dbm )
                gdbm_close(dp->di_dbm);
        dp->di_dbm = NULL;
-       DEL(dp);
        INCREF(None);
        return None;
 }
@@ -189,6 +188,7 @@ dbm_keys(dp, args)
 {
        register object *v, *item;
        datum key, okey={ (char *)NULL, 0};
+       int err;
 
        if (dp == NULL || !is_dbmobject(dp)) {
                err_badcall();
@@ -202,10 +202,17 @@ dbm_keys(dp, args)
        for (key = gdbm_firstkey(dp->di_dbm); key.dptr;
                                key = gdbm_nextkey(dp->di_dbm,okey) ) {
            item = newsizedstringobject(key.dptr, key.dsize);
-           if ( item == 0 )
-             return NULL;
-           addlistitem(v, item);
+           if (item == 0) {
+                   DECREF(v);
+                   return NULL;
+           }
+           err = addlistitem(v, item);
+           DECREF(item);
            if(okey.dsize) free(okey.dptr);
+           if (err != 0) {
+                   DECREF(v);
+                   return NULL;
+           }
            okey=key;
        }
        return v;