This would happen, for example, if we decompressed the record.
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;
}
bdb_abort();
}
- free(cdb->ptr);
+ //free(cdb->ptr);
cdb->len = (size_t) destLen;
cdb->ptr = uncompressed_data;
+ cdb->cdbfree_must_free_ptr = 1;
}
// Free a cdbdata item.
void bdb_free(struct cdbdata *cdb) {
+ if (cdb->cdbfree_must_free_ptr) {
+ free(cdb->ptr);
+ }
free(cdb);
}
// 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)
};