From 4c13ab157731cd069ccc1106d1d945b6791ae004 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 21 Aug 2023 18:14:31 -0900 Subject: [PATCH] Calls to cdb_fetch()/cdb_next_item() now check ptr for NULL or non-NULL This is a better practice than checking to see if the data length was 0. It now allows for extant but zero-length data to be returned. --- citadel/server/config.c | 2 +- citadel/server/control.c | 2 +- citadel/server/euidindex.c | 2 +- citadel/server/internet_addressing.c | 4 ++-- citadel/server/modules/ctdlproto/serv_rooms.c | 2 +- citadel/server/modules/ctdlproto/serv_user.c | 2 +- citadel/server/modules/expire/serv_expire.c | 6 +++--- citadel/server/modules/fulltext/serv_fulltext.c | 4 ++-- citadel/server/modules/imap/imap_acl.c | 2 +- citadel/server/msgbase.c | 6 +++--- citadel/server/room_ops.c | 17 ++++++++--------- citadel/server/user_ops.c | 14 +++++++------- citadel/server/usetable.c | 4 ++-- 13 files changed, 33 insertions(+), 34 deletions(-) diff --git a/citadel/server/config.c b/citadel/server/config.c index fc3d49ce7..49ef9600c 100644 --- a/citadel/server/config.c +++ b/citadel/server/config.c @@ -374,7 +374,7 @@ char *CtdlGetConfigStr(char *key) { // Then look in the database. cdb = cdb_fetch(CDB_CONFIG, key, key_len); - if (cdb.len <= 0) { // nope, not there either. + if (cdb.ptr == NULL) { // nope, not there either. return(NULL); } diff --git a/citadel/server/control.c b/citadel/server/control.c index 3427240e1..ff3cccaa0 100644 --- a/citadel/server/control.c +++ b/citadel/server/control.c @@ -646,7 +646,7 @@ void cmd_conf(char *argbuf) { cprintf("%d all configuration variables\n", LISTING_FOLLOWS); cdb_rewind(CDB_CONFIG); - while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg.len>0) { + while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg.ptr!=NULL) { if (cdbcfg.len < 1020) { keylen = strlen(cdbcfg.ptr); key = cdbcfg.ptr; diff --git a/citadel/server/euidindex.c b/citadel/server/euidindex.c index 2ebd20484..23221f1f3 100644 --- a/citadel/server/euidindex.c +++ b/citadel/server/euidindex.c @@ -65,7 +65,7 @@ long CtdlLocateMessageByEuid(char *euid, struct ctdlroom *qrbuf) { cdb_euid = cdb_fetch(CDB_EUIDINDEX, key, key_len); free(key); - if (cdb_euid.len == 0) { + if (cdb_euid.ptr == NULL) { msgnum = (-1L); } else { diff --git a/citadel/server/internet_addressing.c b/citadel/server/internet_addressing.c index 2a4b0a567..05a77671b 100644 --- a/citadel/server/internet_addressing.c +++ b/citadel/server/internet_addressing.c @@ -1250,8 +1250,8 @@ int CtdlDirectoryLookup(char *target, char *internet_addr, size_t targbuflen) { if (IsDirectory(internet_addr, 0) == 0) return(-1); directory_key(key, internet_addr); - cdbrec = cdb_fetch(CDB_DIRECTORY, key, strlen(key) ); - if (cdbrec.len == 0) { + cdbrec = cdb_fetch(CDB_DIRECTORY, key, strlen(key)); + if (cdbrec.ptr != NULL) { if (target != NULL) { safestrncpy(target, cdbrec.ptr, targbuflen); } diff --git a/citadel/server/modules/ctdlproto/serv_rooms.c b/citadel/server/modules/ctdlproto/serv_rooms.c index d81a4e1e2..c57395a78 100644 --- a/citadel/server/modules/ctdlproto/serv_rooms.c +++ b/citadel/server/modules/ctdlproto/serv_rooms.c @@ -327,7 +327,7 @@ void cmd_whok(char *cmdbuf) { cprintf("%d Who knows room:\n", LISTING_FOLLOWS); cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) { memset(&temp, 0, sizeof temp); memcpy(&temp, cdbus.ptr, sizeof temp); diff --git a/citadel/server/modules/ctdlproto/serv_user.c b/citadel/server/modules/ctdlproto/serv_user.c index f3c5c33a7..3b356ed4c 100644 --- a/citadel/server/modules/ctdlproto/serv_user.c +++ b/citadel/server/modules/ctdlproto/serv_user.c @@ -395,7 +395,7 @@ void cmd_gnur(char *argbuf) { // There are unvalidated users. Traverse the user database, and return the first user we find that needs validation. cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) { memset(&usbuf, 0, sizeof(struct ctdluser)); memcpy(&usbuf, cdbus.ptr, ((cdbus.len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus.len)); if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) { diff --git a/citadel/server/modules/expire/serv_expire.c b/citadel/server/modules/expire/serv_expire.c index bda629bf3..20ac197dd 100644 --- a/citadel/server/modules/expire/serv_expire.c +++ b/citadel/server/modules/expire/serv_expire.c @@ -505,7 +505,7 @@ int PurgeVisits(void) { // Now traverse through the visits, purging irrelevant records... cdb_rewind(CDB_VISIT); - while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit.len>0) { + while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit.ptr!=NULL) { memset(&vbuf, 0, sizeof(struct visit)); memcpy(&vbuf, cdbvisit.ptr, ( (cdbvisit.len > sizeof(struct visit)) ? @@ -584,7 +584,7 @@ int PurgeUseTable(StrBuf *ErrMsg) { syslog(LOG_DEBUG, "Purge use table: phase 1"); cdb_rewind(CDB_USETABLE); - while(cdbut = cdb_next_item(CDB_USETABLE), cdbut.len>0) { + while(cdbut = cdb_next_item(CDB_USETABLE), cdbut.ptr!=NULL) { ++total; if (cdbut.len > sizeof(struct UseTable)) memcpy(&ut, cdbut.ptr, sizeof(struct UseTable)); @@ -625,7 +625,7 @@ int PurgeEuidIndexTable(void) { // Phase 1: traverse through the table, discovering old records... syslog(LOG_DEBUG, "Purge EUID index: phase 1"); cdb_rewind(CDB_EUIDINDEX); - while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei.len>0) { + while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei.ptr!=NULL) { memcpy(&msgnum, cdbei.ptr, sizeof(long)); diff --git a/citadel/server/modules/fulltext/serv_fulltext.c b/citadel/server/modules/fulltext/serv_fulltext.c index b7a497801..99d80cbba 100644 --- a/citadel/server/modules/fulltext/serv_fulltext.c +++ b/citadel/server/modules/fulltext/serv_fulltext.c @@ -128,7 +128,7 @@ void ft_index_message(long msgnum, int op) { // fetch the bucket, Liza if (ftc_msgs[tok] == NULL) { cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int)); - if (cdb_bucket.len > 0) { + if (cdb_bucket.ptr != NULL) { ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long); ftc_msgs[tok] = malloc(cdb_bucket.len); memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len); @@ -310,7 +310,7 @@ void ft_search(int *fts_num_msgs, long **fts_msgs, const char *search_string) { // fetch the bucket, Liza if (ftc_msgs[tok] == NULL) { cdb_bucket = cdb_fetch(CDB_FULLTEXT, &tok, sizeof(int)); - if (cdb_bucket.len > 0) { + if (cdb_bucket.ptr != NULL) { ftc_num_msgs[tok] = cdb_bucket.len / sizeof(long); ftc_msgs[tok] = (long *) malloc(cdb_bucket.len); memcpy(ftc_msgs[tok], cdb_bucket.ptr, cdb_bucket.len); diff --git a/citadel/server/modules/imap/imap_acl.c b/citadel/server/modules/imap/imap_acl.c index bcaacbce8..da1ff39bd 100644 --- a/citadel/server/modules/imap/imap_acl.c +++ b/citadel/server/modules/imap/imap_acl.c @@ -136,7 +136,7 @@ void imap_getacl(int num_parms, ConstStr *Params) { // Traverse the userlist rights = NewStrBuf(); cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(CDB_USERS), cdbus.len > 0) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) { memset(&temp, 0, sizeof temp); memcpy(&temp, cdbus.ptr, sizeof temp); diff --git a/citadel/server/msgbase.c b/citadel/server/msgbase.c index a1d003abf..d277f070d 100644 --- a/citadel/server/msgbase.c +++ b/citadel/server/msgbase.c @@ -1109,7 +1109,7 @@ struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body) { syslog(LOG_DEBUG, "msgbase: CtdlFetchMessage(%ld, %d)", msgnum, with_body); dmsgtext = cdb_fetch(CDB_MSGMAIN, &msgnum, sizeof(long)); - if (dmsgtext.len == 0) { + if (dmsgtext.ptr == NULL) { syslog(LOG_ERR, "msgbase: message #%ld was not found", msgnum); return NULL; } @@ -1132,7 +1132,7 @@ struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body) { // if ( (CM_IsEmpty(ret, eMesageText)) && (with_body) ) { dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long)); - if (dmsgtext.len > 0) { + if (dmsgtext.ptr != NULL) { CM_SetAsField(ret, eMesageText, &dmsgtext.ptr, dmsgtext.len - 1); } } @@ -3306,7 +3306,7 @@ void GetMetaData(struct MetaData *smibuf, long msgnum) { TheIndex = (0L - msgnum); cdbsmi = cdb_fetch(CDB_MSGMAIN, &TheIndex, sizeof(long)); - if (cdbsmi.len == 0) { + if (cdbsmi.ptr == NULL) { return; /* record not found; leave it alone */ } memcpy(smibuf, cdbsmi.ptr, ((cdbsmi.len > sizeof(struct MetaData)) ? sizeof(struct MetaData) : cdbsmi.len)); diff --git a/citadel/server/room_ops.c b/citadel/server/room_ops.c index b45913c48..7c48922f3 100644 --- a/citadel/server/room_ops.c +++ b/citadel/server/room_ops.c @@ -322,11 +322,11 @@ int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) { cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name)); // If that didn't work, try the user's personal namespace - if (cdbqr.len == 0) { + if (cdbqr.ptr == NULL) { snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name); cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name)); } - if (cdbqr.len > 0) { + if (cdbqr.ptr != NULL) { memcpy(qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len)); room_sanity_check(qrbuf); return (0); @@ -435,7 +435,7 @@ void CtdlGetFloor(struct floor *flbuf, int floor_num) { memset(flbuf, 0, sizeof(struct floor)); cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int)); - if (cdbfl.len > 0) { + if (cdbfl.ptr != NULL) { memcpy(flbuf, cdbfl.ptr, ((cdbfl.len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl.len)); } else { @@ -527,7 +527,7 @@ void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) { cdb_rewind(CDB_ROOMS); - while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.len>0) { + while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.ptr!=NULL) { memset(&qrbuf, 0, sizeof(struct ctdlroom)); memcpy(&qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len) ); room_sanity_check(&qrbuf); @@ -542,11 +542,10 @@ void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) { void delete_msglist(struct ctdlroom *whichroom) { struct cdbdata cdbml; - // Make sure the msglist we're deleting actually exists, otherwise - // libdb will complain when we try to delete an invalid record + // Make sure the msglist we're deleting actually exists; don't try to delete an invalid record cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long)); - if (cdbml.len > 0) { - // Go ahead and delete it + if (cdbml.ptr != NULL) { + // ok it exists, go ahead and delete it cdb_delete(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long)); } } @@ -605,7 +604,7 @@ int CtdlFetchMsgList(long roomnum, long **msgs) { struct cdbdata cdbfr; cdbfr = cdb_fetch(CDB_MSGLISTS, &roomnum, sizeof(long)); - if (cdbfr.len == 0) { + if (cdbfr.ptr == NULL) { syslog(LOG_ERR, "room_ops: no msglist for room %ld", roomnum); *msgs = malloc(sizeof(long)); // dummy buffer *msgs[0] = 0; diff --git a/citadel/server/user_ops.c b/citadel/server/user_ops.c index 76325e984..d05d0ef3d 100644 --- a/citadel/server/user_ops.c +++ b/citadel/server/user_ops.c @@ -55,7 +55,7 @@ int CtdlGetUser(struct ctdluser *usbuf, char *name) { } cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey)); - if (cdbus.len == 0) { // user not found + if (cdbus.ptr == NULL) { // user not found return(1); } if (usbuf != NULL) { @@ -188,7 +188,7 @@ void reindex_user_928(char *username, void *out_data) { // Fetch the user record using the old index format cdbus = cdb_fetch(CDB_USERS, oldkey, strlen(oldkey)); - if (cdbus.len == 0) { + if (cdbus.ptr == NULL) { syslog(LOG_INFO, "user_ops: <%s> not found, were they already reindexed?", username); return; } @@ -245,8 +245,8 @@ void CtdlGetRelationship(struct visit *vbuf, struct ctdluser *rel_user, struct c vbuf->v_usernum = rel_user->usernum; cdbvisit = cdb_fetch(CDB_VISIT, vbuf, (sizeof(long)*3)); - if (cdbvisit.len > 0) { - memcpy(vbuf, cdbvisit.ptr, ((cdbvisit.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.len)); + if (cdbvisit.ptr != NULL) { + memcpy(vbuf, cdbvisit.ptr, ((cdbvisit.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.len)); } else { // If this is the first time the user has seen this room, set the view to be the default for the room. @@ -358,7 +358,7 @@ int CtdlGetUserByNumber(struct ctdluser *usbuf, long number) { int r; cdbun = cdb_fetch(CDB_USERSBYNUMBER, &number, sizeof(long)); - if (cdbun.len == 0) { + if (cdbun.ptr == NULL) { syslog(LOG_INFO, "user_ops: %ld not found", number); return(-1); } @@ -399,7 +399,7 @@ int getuserbyuid(struct ctdluser *usbuf, uid_t number) { // No, we don't use CtdlForEachUser() because that requires multiple reads for each record // TODO: make an index cdb_rewind(CDB_USERS); - while (cdbus = cdb_next_item(CDB_USERS), cdbus.len>0) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) { usptr = (struct ctdluser *) cdbus.ptr; if (usptr->uid == number) { @@ -1044,7 +1044,7 @@ void ForEachUser(void (*CallBack) (char *, void *out_data), void *in_data) { cdb_rewind(CDB_USERS); // Phase 1 : build an array of all our user account names - while (cdbus = cdb_next_item(CDB_USERS), cdbus.len > 0) { + while (cdbus = cdb_next_item(CDB_USERS), cdbus.ptr!=NULL) { usptr = (struct ctdluser *) cdbus.ptr; if (strlen(usptr->fullname) > 0) { array_append(all_users, usptr->fullname); diff --git a/citadel/server/usetable.c b/citadel/server/usetable.c index 6364a8fa0..7095f53ed 100644 --- a/citadel/server/usetable.c +++ b/citadel/server/usetable.c @@ -26,7 +26,7 @@ int CheckIfAlreadySeen(StrBuf *guid) { syslog(LOG_DEBUG, "usetable: CheckIfAlreadySeen(0x%8x)", hash); cdbut = cdb_fetch(CDB_USETABLE, &hash, sizeof(hash)); - if (cdbut.len > 0) { + if (cdbut.ptr != NULL) { found = 1; } @@ -34,5 +34,5 @@ int CheckIfAlreadySeen(StrBuf *guid) { ut.hash = hash; ut.timestamp = time(NULL); cdb_store(CDB_USETABLE, &hash, sizeof(hash), &ut, sizeof(struct UseTable)); - return (found); + return(found); } -- 2.39.2