From 114e28d9f57bd194c47ef43354196e3e655a9ba9 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Sun, 20 Aug 2023 16:23:47 -0900 Subject: [PATCH] Keep track of whether cdb->ptr must be freed by cdb_free() This would happen, for example, if we decompressed the record. --- citadel/server/backends/berkeley_db/berkeley_db.c | 7 ++++++- citadel/server/server.h | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/citadel/server/backends/berkeley_db/berkeley_db.c b/citadel/server/backends/berkeley_db/berkeley_db.c index 54d8dfecb..529d4c60a 100644 --- a/citadel/server/backends/berkeley_db/berkeley_db.c +++ b/citadel/server/backends/berkeley_db/berkeley_db.c @@ -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); } diff --git a/citadel/server/server.h b/citadel/server/server.h index 3c1f6999f..b16289bf6 100644 --- a/citadel/server/server.h +++ b/citadel/server/server.h @@ -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) }; -- 2.30.2