Keep track of whether cdb->ptr must be freed by cdb_free()
authorArt Cancro <ajc@citadel.org>
Mon, 21 Aug 2023 01:23:47 +0000 (16:23 -0900)
committerArt Cancro <ajc@citadel.org>
Mon, 21 Aug 2023 01:23:47 +0000 (16:23 -0900)
This would happen, for example, if we decompressed the record.

citadel/server/backends/berkeley_db/berkeley_db.c
citadel/server/server.h

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);
 }
 
index 3c1f6999ffcb2761110df2f479fe187629727797..b16289bf6baaf6d49d39cd428e7fa836b2a3ef80 100644 (file)
@@ -68,8 +68,9 @@ struct ExpressMessage {
 
 // Row being stored or fetched in the database
 struct cdbdata {
-       size_t len;
-       char *ptr;
+       size_t len;                     // size of datum pointed to by ptr
+       char *ptr;                      // datum
+       int cdbfree_must_free_ptr;      // nonzero if cdb_free() is expected to free(ptr)
 };