From af89b096510aa052f846849872367cb434f1a014 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 7 Aug 2023 05:55:11 -0900 Subject: [PATCH] Marked code that will require some rework for LMDB. When BDB returns data, the caller owns the memory and is required to free it, which we usually do. I marked the places where we take ownership of memory pointers and then set the BDB ptr to NULL. If we switch to LMDB, those pointers remain valid forever, so we cannot simply free them later. --- .../server/modules/fulltext/serv_fulltext.c | 4 ++-- citadel/server/modules/imap/serv_imap.c | 4 ++-- citadel/server/modules/nntp/serv_nntp.c | 2 +- citadel/server/msgbase.c | 22 +++++++------------ citadel/server/room_ops.c | 2 +- 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/citadel/server/modules/fulltext/serv_fulltext.c b/citadel/server/modules/fulltext/serv_fulltext.c index acbf524df..008e4fc60 100644 --- a/citadel/server/modules/fulltext/serv_fulltext.c +++ b/citadel/server/modules/fulltext/serv_fulltext.c @@ -131,7 +131,7 @@ void ft_index_message(long msgnum, int op) { if (cdb_bucket != NULL) { ftc_num_msgs[tok] = cdb_bucket->len / sizeof(long); ftc_msgs[tok] = (long *)cdb_bucket->ptr; - cdb_bucket->ptr = NULL; + cdb_bucket->ptr = NULL; // (this needs attention if we move to LMDB) cdb_free(cdb_bucket); } else { @@ -315,7 +315,7 @@ void ft_search(int *fts_num_msgs, long **fts_msgs, const char *search_string) { if (cdb_bucket != NULL) { ftc_num_msgs[tok] = cdb_bucket->len / sizeof(long); ftc_msgs[tok] = (long *)cdb_bucket->ptr; - cdb_bucket->ptr = NULL; + cdb_bucket->ptr = NULL; // (this needs attention if we move to LMDB) cdb_free(cdb_bucket); } else { diff --git a/citadel/server/modules/imap/serv_imap.c b/citadel/server/modules/imap/serv_imap.c index 30e7b2587..b42c5022b 100644 --- a/citadel/server/modules/imap/serv_imap.c +++ b/citadel/server/modules/imap/serv_imap.c @@ -274,7 +274,7 @@ void imap_load_msgids(void) { Imap->msgids = (long*)cdbfr->ptr; Imap->num_msgs = cdbfr->len / sizeof(long); Imap->num_alloc = cdbfr->len / sizeof(long); - cdbfr->ptr = NULL; + cdbfr->ptr = NULL; // (this needs attention if we move to LMDB) cdbfr->len = 0; cdb_free(cdbfr); } @@ -323,7 +323,7 @@ void imap_rescan_msgids(void) { cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long*)cdbfr->ptr; - cdbfr->ptr = NULL; + cdbfr->ptr = NULL; // (this needs attention if we move to LMDB) num_msgs = cdbfr->len / sizeof(long); cdbfr->len = 0; cdb_free(cdbfr); diff --git a/citadel/server/modules/nntp/serv_nntp.c b/citadel/server/modules/nntp/serv_nntp.c index ef305d50f..4c6daaf5e 100644 --- a/citadel/server/modules/nntp/serv_nntp.c +++ b/citadel/server/modules/nntp/serv_nntp.c @@ -322,7 +322,7 @@ struct nntp_msglist nntp_fetch_msglist(struct ctdlroom *qrbuf) { cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf->QRnumber, sizeof(long)); if (cdbfr != NULL) { nm.msgnums = (long*)cdbfr->ptr; - cdbfr->ptr = NULL; + cdbfr->ptr = NULL; // (this needs attention if we move to LMDB) nm.num_msgs = cdbfr->len / sizeof(long); cdbfr->len = 0; cdb_free(cdbfr); diff --git a/citadel/server/msgbase.c b/citadel/server/msgbase.c index e5f8b1e19..9b4f2535f 100644 --- a/citadel/server/msgbase.c +++ b/citadel/server/msgbase.c @@ -448,7 +448,7 @@ void CtdlSetSeen(long *target_msgnums, int num_target_msgnums, cdbfr = cdb_fetch(CDB_MSGLISTS, &which_room->QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long *) cdbfr->ptr; - cdbfr->ptr = NULL; // CtdlSetSeen() now owns this memory + cdbfr->ptr = NULL; // CtdlSetSeen() now owns this memory (this needs attention if we move to LMDB) num_msgs = cdbfr->len / sizeof(long); cdb_free(cdbfr); } @@ -2265,9 +2265,10 @@ int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newms if (cdbfr == NULL) { msglist = NULL; num_msgs = 0; - } else { + } + else { msglist = (long *) cdbfr->ptr; - cdbfr->ptr = NULL; /* CtdlSaveMsgPointerInRoom() now owns this memory */ + cdbfr->ptr = NULL; // CtdlSaveMsgPointerInRoom() now owns this memory (this needs attention if we move to LMDB) num_msgs = cdbfr->len / sizeof(long); cdb_free(cdbfr); } @@ -3255,7 +3256,7 @@ int CtdlDeleteMessages(const char *room_name, // which room if (cdbfr != NULL) { dellist = malloc(cdbfr->len); msglist = (long *) cdbfr->ptr; - cdbfr->ptr = NULL; /* CtdlDeleteMessages() now owns this memory */ + cdbfr->ptr = NULL; // CtdlDeleteMessages() now owns this memory (this needs attention if we move to LMDB) num_msgs = cdbfr->len / sizeof(long); cdb_free(cdbfr); } @@ -3265,18 +3266,11 @@ int CtdlDeleteMessages(const char *room_name, // which room int have_more_del = 1; num_msgs = sort_msglist(msglist, num_msgs); - if (num_dmsgnums > 1) + if (num_dmsgnums > 1) { num_dmsgnums = sort_msglist(dmsgnums, num_dmsgnums); -/* - { - StrBuf *dbg = NewStrBuf(); - for (i = 0; i < num_dmsgnums; i++) - StrBufAppendPrintf(dbg, ", %ld", dmsgnums[i]); - syslog(LOG_DEBUG, "msgbase: Deleting before: %s", ChrPtr(dbg)); - FreeStrBuf(&dbg); } -*/ - i = 0; j = 0; + i = 0; + j = 0; while ((i < num_msgs) && (have_more_del)) { delete_this = 0x00; diff --git a/citadel/server/room_ops.c b/citadel/server/room_ops.c index 56c20e0d0..1566e74b0 100644 --- a/citadel/server/room_ops.c +++ b/citadel/server/room_ops.c @@ -670,7 +670,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently, int *retmsgs cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long *) cdbfr->ptr; - cdbfr->ptr = NULL; // CtdlUserGoto() now owns this memory + cdbfr->ptr = NULL; // CtdlUserGoto() now owns this memory (this requires attention if we move to LMDB) num_msgs = cdbfr->len / sizeof(long); cdb_free(cdbfr); } -- 2.39.2