]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/backends/berkeley_db/berkeley_db.c
Keep track of whether cdb->ptr must be freed by cdb_free()
[citadel.git] / citadel / server / backends / berkeley_db / berkeley_db.c
index 54d8dfecb123e7baa619b20ab14ace67c3133fad..529d4c60ade74a491687e7489a765a7751b2adf2 100644 (file)
@@ -332,6 +332,7 @@ void bdb_decompress_if_necessary(struct cdbdata *cdb) {
        static int magic = COMPRESS_MAGIC;
 
        if ((cdb == NULL) || (cdb->ptr == NULL) || (cdb->len < sizeof(magic)) || (memcmp(cdb->ptr, &magic, sizeof(magic)))) {
+               cdb->cdbfree_must_free_ptr = 0;
                return;
        }
 
@@ -363,9 +364,10 @@ void bdb_decompress_if_necessary(struct cdbdata *cdb) {
                bdb_abort();
        }
 
-       free(cdb->ptr);
+       //free(cdb->ptr);
        cdb->len = (size_t) destLen;
        cdb->ptr = uncompressed_data;
+       cdb->cdbfree_must_free_ptr = 1;
 }
 
 
@@ -576,6 +578,9 @@ struct cdbdata *bdb_fetch(int cdb, const void *key, int keylen) {
 
 // Free a cdbdata item.
 void bdb_free(struct cdbdata *cdb) {
+       if (cdb->cdbfree_must_free_ptr) {
+               free(cdb->ptr);
+       }
        free(cdb);
 }