Calls to cdb_fetch()/cdb_next_item() now check ptr for NULL or non-NULL
authorArt Cancro <ajc@citadel.org>
Tue, 22 Aug 2023 03:14:31 +0000 (18:14 -0900)
committerArt Cancro <ajc@citadel.org>
Tue, 22 Aug 2023 03:14:31 +0000 (18:14 -0900)
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.

13 files changed:
citadel/server/config.c
citadel/server/control.c
citadel/server/euidindex.c
citadel/server/internet_addressing.c
citadel/server/modules/ctdlproto/serv_rooms.c
citadel/server/modules/ctdlproto/serv_user.c
citadel/server/modules/expire/serv_expire.c
citadel/server/modules/fulltext/serv_fulltext.c
citadel/server/modules/imap/imap_acl.c
citadel/server/msgbase.c
citadel/server/room_ops.c
citadel/server/user_ops.c
citadel/server/usetable.c

index fc3d49ce75da654b7a91c2554db6600e6ef64d72..49ef9600c69bf58734b727c8087cb19a8960f9da 100644 (file)
@@ -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);
        }
 
index 3427240e1f98412f9f14484e724181448e91cb0e..ff3cccaa0de11fcc7584760186a04f07dc6ea409 100644 (file)
@@ -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;
index 2ebd2048430aa13af79819adf85ba43c37a6114d..23221f1f37c7bfed5a7dccc06abe173bf70aeff1 100644 (file)
@@ -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 {
index 2a4b0a56777d2a8fc170ea977a5b7ebdff5d0713..05a77671b8c952d81964eded68ebd76ab3410355 100644 (file)
@@ -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);
                }
index d81a4e1e2e292f83d98f7bc7f58f9491d005347c..c57395a78252806bb63d29f229d47dec20428be8 100644 (file)
@@ -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);
 
index f3c5c33a730ddd9388fd9592a7e0a259212324e3..3b356ed4c6498ab07671d61fb079373a42b1d8d7 100644 (file)
@@ -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)) {
index bda629bf35887a6db7bd460017d2001303bceb03..20ac197ddd9c4a33fc712256eab4235d0a694c85 100644 (file)
@@ -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));
 
index b7a497801e1974831df795dafc01ee17954b04df..99d80cbba1731744fe9368e5912735241d6232ee 100644 (file)
@@ -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);
index bcaacbce82303e24f6dd6c5c263d65c4089538c7..da1ff39bdee553a583ec056a8a1a2bffbcd40d29 100644 (file)
@@ -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);
 
index a1d003abf0bd6b3439ed3736f5448248956017be..d277f070d38f943e53b3195fdefd9c3f356bab61 100644 (file)
@@ -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));
index b45913c485bfe653b4645949f20205fb516e4a6c..7c48922f3a6654ffb257153834cea0c2037769a5 100644 (file)
@@ -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;
index 76325e984cc3f8f56997cfddd5d42913a8f92462..d05d0ef3dad8e544330894ceb17ee0a6ad4dd469 100644 (file)
@@ -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);
index 6364a8fa0bf6b7b3917d79cf8bb59ff997c0a93a..7095f53ed8d8491075db64ffb317a488249f46d1 100644 (file)
@@ -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);
 }