[GNO]DBM_File must free any filter CVs in DESTROY.
authorNicholas Clark <nick@ccl4.org>
Thu, 21 Oct 2010 05:58:11 +0000 (07:58 +0200)
committerNicholas Clark <nick@ccl4.org>
Thu, 21 Oct 2010 06:31:16 +0000 (08:31 +0200)
They have been leaking these since DBM filters were first added in 1999 by
9fe6733ac5627edd. DB_File and SDBM_File have always correctly freed their
filters.

ext/GDBM_File/GDBM_File.xs
ext/NDBM_File/NDBM_File.xs
ext/ODBM_File/ODBM_File.xs

index d1f99e2..b418b25 100644 (file)
@@ -94,6 +94,14 @@ gdbm_DESTROY(db)
        GDBM_File       db
        CODE:
        gdbm_close(db);
+       if (db->filter_fetch_key)
+           SvREFCNT_dec(db->filter_fetch_key) ;
+       if (db->filter_store_key)
+           SvREFCNT_dec(db->filter_store_key) ;
+       if (db->filter_fetch_value)
+           SvREFCNT_dec(db->filter_fetch_value) ;
+       if (db->filter_store_value)
+           SvREFCNT_dec(db->filter_store_value) ;
        safefree(db);
 
 #define gdbm_FETCH(db,key)                     gdbm_fetch(db->dbp,key)
index aa769ec..84d44cb 100644 (file)
@@ -80,6 +80,14 @@ ndbm_DESTROY(db)
        NDBM_File       db
        CODE:
        dbm_close(db->dbp);
+       if (db->filter_fetch_key)
+           SvREFCNT_dec(db->filter_fetch_key) ;
+       if (db->filter_store_key)
+           SvREFCNT_dec(db->filter_store_key) ;
+       if (db->filter_fetch_value)
+           SvREFCNT_dec(db->filter_fetch_value) ;
+       if (db->filter_store_value)
+           SvREFCNT_dec(db->filter_store_value) ;
        safefree(db);
 
 #define ndbm_FETCH(db,key)                     dbm_fetch(db->dbp,key)
index 2510d5e..8faf4a9 100644 (file)
@@ -122,6 +122,14 @@ DESTROY(db)
        CODE:
        dbmrefcnt--;
        dbmclose();
+       if (db->filter_fetch_key)
+           SvREFCNT_dec(db->filter_fetch_key) ;
+       if (db->filter_store_key)
+           SvREFCNT_dec(db->filter_store_key) ;
+       if (db->filter_fetch_value)
+           SvREFCNT_dec(db->filter_fetch_value) ;
+       if (db->filter_store_value)
+           SvREFCNT_dec(db->filter_store_value) ;
        safefree(db);
 
 datum_value