When opening a cursor, always read through to the end.
authorArt Cancro <ajc@citadel.org>
Tue, 29 Aug 2023 02:38:55 +0000 (22:38 -0400)
committerArt Cancro <ajc@citadel.org>
Tue, 29 Aug 2023 02:38:55 +0000 (22:38 -0400)
This should theoretically eliminate the need to ever call cdb_close_cursor()

citadel/server/control.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/imap/imap_acl.c
citadel/server/room_ops.c
citadel/server/user_ops.c
citadel/utils/ctdldump.c

index 9476e40bea79270ccc8b5e449a8e1e8ed45418ed..51e9f7d60a64f58f12743d606f2803fa851c9675 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.val.ptr!=NULL) {
+               while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg.val.ptr!=NULL) {              // always read to the end
                        if (cdbcfg.val.len < 1020) {
                                keylen = strlen(cdbcfg.val.ptr);
                                key = cdbcfg.val.ptr;
index 29f57c8883241bd84e6d0ae71c22ae4a2efaa266..f8d571d1f97a489f83a2ab08c04d4e72995c2217 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.val.ptr!=NULL) {
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read to the end
                memset(&temp, 0, sizeof temp);
                memcpy(&temp, cdbus.val.ptr, sizeof temp);
                CtdlRoomAccess(&CC->room, &temp, &ra, NULL);
index 48fe21d9f3ccb7c661d6ea14d4a3b7d8be5da54b..981b56ff77136fd5104e073bda8491057b466cba 100644 (file)
@@ -383,6 +383,7 @@ void cmd_forg(char *argbuf) {
 void cmd_gnur(char *argbuf) {
        struct cdbkeyval cdbus;
        struct ctdluser usbuf;
+       int found_it = 0;
 
        if (CtdlAccessCheck(ac_aide)) {
                return;
@@ -400,11 +401,14 @@ void cmd_gnur(char *argbuf) {
                memcpy(&usbuf, cdbus.val.ptr, ((cdbus.val.len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus.val.len));
                if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) {
                        cprintf("%d %s\n", MORE_DATA, usbuf.fullname);
-                       cdb_close_cursor(CDB_USERS);
-                       return;
+                       found_it = 1;                                           // always read through to the end
                }
        }
 
+       if (found_it) {
+               return;
+       }
+
        // If we get to this point, there are no more unvalidated users.  Therefore we clear the "users need validation" flag.
        begin_critical_section(S_CONTROL);
        int flags;
index f360804a2639c2068b4d0cf7a4aad7a9d221f628..48f76b8f25a438877dec5c099901808f82e929d9 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.val.ptr!=NULL) {
+       while(cdbvisit = cdb_next_item(CDB_VISIT), cdbvisit.val.ptr!=NULL) {            // always read through to the end
                memset(&vbuf, 0, sizeof(struct visit));
                memcpy(&vbuf, cdbvisit.val.ptr, ((cdbvisit.val.len > sizeof(struct visit)) ? sizeof(struct visit) : cdbvisit.val.len));
                RoomIsValid = 0;
@@ -583,7 +583,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.val.ptr!=NULL) {
+       while(cdbut = cdb_next_item(CDB_USETABLE), cdbut.val.ptr!=NULL) {               // always read through to the end
                ++total;
                if (cdbut.val.len > sizeof(struct UseTable))
                        memcpy(&ut, cdbut.val.ptr, sizeof(struct UseTable));
@@ -626,7 +626,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.val.ptr!=NULL) {
+       while(cdbei = cdb_next_item(CDB_EUIDINDEX), cdbei.val.ptr!=NULL) {      // always read through to the end
 
                memcpy(&msgnum, cdbei.val.ptr, sizeof(long));
 
index fbc5460af268b22c107e09ec9eb34809f7619aac..69e56301d27fe7452ad724179f806f12af5d33c3 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.val.ptr!=NULL) {
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read through to the end
                memset(&temp, 0, sizeof temp);
                memcpy(&temp, cdbus.val.ptr, sizeof temp);
 
index cabaf96fdaf3fdd279a29d6b7dab843c8c738170..f61e1f12668b96577fa1c1cef0aafea63dba8821 100644 (file)
@@ -526,10 +526,9 @@ void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) {
        struct cdbkeyval cdbqr;
 
        cdb_rewind(CDB_ROOMS);
-
-       while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.val.ptr!=NULL) {
+       while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.val.ptr!=NULL) {         // always read through to the end
                memset(&qrbuf, 0, sizeof(struct ctdlroom));
-               memcpy(&qrbuf, cdbqr.val.ptr, ((cdbqr.val.len > sizeof(struct ctdlroom)) ?  sizeof(struct ctdlroom) : cdbqr.val.len) );
+               memcpy(&qrbuf, cdbqr.val.ptr, ((cdbqr.val.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.val.len) );
                room_sanity_check(&qrbuf);
                if (qrbuf.QRflags & QR_INUSE) {
                        callback_func(&qrbuf, in_data);
index 7c85b011893b76daa02311e668d234e05de4d9c7..61183bcc06c1274834c2bff5f5a26278aa372e07 100644 (file)
@@ -398,7 +398,7 @@ int getuserbyuid(struct ctdluser *usbuf, uid_t number) {
        // Yes, we do this the long way.  Someday we might want to try an index.
        // No, we don't use CtdlForEachUser() because that requires multiple reads for each record
        cdb_rewind(CDB_USERS);
-       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read through to the end
                usptr = (struct ctdluser *) cdbus.val.ptr;
 
                if (usptr->uid == number) {
@@ -1040,10 +1040,9 @@ 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.val.ptr!=NULL) {
+       cdb_rewind(CDB_USERS);
+       while (cdbus = cdb_next_item(CDB_USERS), cdbus.val.ptr!=NULL) {         // always read through to the end
                usptr = (struct ctdluser *) cdbus.val.ptr;
                if (strlen(usptr->fullname) > 0) {
                        array_append(all_users, usptr->fullname);
index 0997189de6bd7fc8121741ef8b5d7f2c1ccc6868..cf7257813c5d232a4de3ffc19f6b33002b5d88c4 100644 (file)
@@ -343,7 +343,7 @@ void export_table(int which_cdb) {
        int num_bad_rows = 0;
 
        cdb_rewind(which_cdb);
-       while (ckv = cdb_next_item(which_cdb), ckv.val.ptr!=NULL) {
+       while (ckv = cdb_next_item(which_cdb), ckv.val.ptr!=NULL) {             // always read through to the end
                // Call the export function registered to this table
                export_functions[which_cdb](which_cdb, ckv);
        }