From 36908e5d8ca8ad1207d7f8466c0858c71c9588b4 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 10 Feb 2021 11:24:35 -0500 Subject: [PATCH] Fixed a bug in the startup sanity checks. When it had to make a fix it was trying to do so during an open cursor. Refactored those functions. --- citadel/control.c | 73 ++++++++++++++++---------- citadel/domain.c | 12 +++-- citadel/modules/smtp/serv_smtpclient.c | 2 +- citadel/server_main.c | 1 + 4 files changed, 54 insertions(+), 34 deletions(-) diff --git a/citadel/control.c b/citadel/control.c index a99bbf6f6..ec3179f8c 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -40,6 +40,15 @@ struct legacy_ctrl_format { }; +/* + * data that gets passed back and forth between control_find_highest() and its caller + */ +struct cfh { + long highest_roomnum_found; + long highest_msgnum_found; +}; + + /* * Callback to get highest room number when rebuilding message base metadata * @@ -48,48 +57,36 @@ struct legacy_ctrl_format { * 1 = show inconsistencies but don't repair them, exit after complete * 2 = show inconsistencies but don't repair them, continue execution */ -void control_find_highest(struct ctdlroom *qrbuf, void *data) -{ - struct ctdlroom room; +void control_find_highest(struct ctdlroom *qrbuf, void *data) { + struct cfh *cfh = (struct cfh *)data; struct cdbdata *cdbfr; long *msglist; int num_msgs=0; int c; - - if (qrbuf->QRnumber > CtdlGetConfigLong("MMnextroom")) { - syslog(LOG_DEBUG, "control: fixing MMnextroom %ld > %ld , found in %s", - qrbuf->QRnumber, CtdlGetConfigLong("MMnextroom"), qrbuf->QRname - ); - if (!sanity_diag_mode) { - CtdlSetConfigLong("MMnextroom", qrbuf->QRnumber); - } + + if (qrbuf->QRnumber > cfh->highest_roomnum_found) { + cfh->highest_roomnum_found = qrbuf->QRnumber; } - - CtdlGetRoom(&room, qrbuf->QRname); - + /* Load the message list */ - cdbfr = cdb_fetch(CDB_MSGLISTS, &room.QRnumber, sizeof(long)); + cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf->QRnumber, sizeof(long)); if (cdbfr != NULL) { msglist = (long *) cdbfr->ptr; num_msgs = cdbfr->len / sizeof(long); - } else { + } + else { return; /* No messages at all? No further action. */ } if (num_msgs > 0) { for (c=0; c CtdlGetConfigLong("MMhighest")) { - syslog(LOG_DEBUG, "control: fixing MMhighest %ld > %ld , found in %s", - msglist[c], CtdlGetConfigLong("MMhighest"), qrbuf->QRname - ); - if (!sanity_diag_mode) { - CtdlSetConfigLong("MMhighest", msglist[c]); - } + if (msglist[c] > cfh->highest_msgnum_found) { + cfh->highest_msgnum_found = msglist[c]; } } } + cdb_free(cdbfr); - return; } @@ -117,8 +114,7 @@ void control_find_user(char *username, void *out_data) { /* * If we have a legacy format control record on disk, import it. */ -void migrate_legacy_control_record(void) -{ +void migrate_legacy_control_record(void) { FILE *fp = NULL; struct legacy_ctrl_format c; memset(&c, 0, sizeof(c)); @@ -149,13 +145,32 @@ void migrate_legacy_control_record(void) /* * check_control - check the control record has sensible values for message, user and room numbers */ -void check_control(void) -{ +void check_control(void) { + syslog(LOG_INFO, "control: sanity checking the recorded highest message and room numbers"); - CtdlForEachRoom(control_find_highest, NULL); + struct cfh cfh; + memset(&cfh, 0, sizeof(struct cfh)); + CtdlForEachRoom(control_find_highest, &cfh); + + if (cfh.highest_roomnum_found > CtdlGetConfigLong("MMnextroom")) { + syslog(LOG_DEBUG, "control: fixing MMnextroom %ld > %ld", cfh.highest_roomnum_found, CtdlGetConfigLong("MMnextroom")); + if (!sanity_diag_mode) { + CtdlSetConfigLong("MMnextroom", cfh.highest_roomnum_found); + } + } + + if (cfh.highest_msgnum_found > CtdlGetConfigLong("MMhighest")) { + syslog(LOG_DEBUG, "control: fixing MMhighest %ld > %ld", cfh.highest_msgnum_found, CtdlGetConfigLong("MMhighest")); + if (!sanity_diag_mode) { + CtdlSetConfigLong("MMhighest", cfh.highest_msgnum_found); + } + } + syslog(LOG_INFO, "control: sanity checking the recorded highest user number"); ForEachUser(control_find_user, NULL); + syslog(LOG_INFO, "control: sanity checks complete"); + if (sanity_diag_mode == 1) { syslog(LOG_INFO, "control: sanity check diagnostic mode is active - exiting now"); abort(); diff --git a/citadel/domain.c b/citadel/domain.c index 2e16a20af..25a4d7afc 100644 --- a/citadel/domain.c +++ b/citadel/domain.c @@ -1,7 +1,7 @@ /* * DNS lookup for SMTP sender * - * Copyright (c) 1987-2017 by the citadel.org team + * Copyright (c) 1987-2021 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 3. @@ -115,12 +115,14 @@ int getmx(char *mxbuf, char *dest) { struct mx *mxrecs = NULL; int num_mxrecs = 0; - + /* If we're configured to send all mail to a smart-host, then our * job here is really easy. */ n = get_hosts(mxbuf, "smarthost"); - if (n > 0) return(n); + if (n > 0) { + return(n); + } /* * No smart-host? Look up the best MX for a site. @@ -136,7 +138,6 @@ int getmx(char *mxbuf, char *dest) { num_mxrecs = 1; } else { - /* If we had to truncate, shrink the number to avoid fireworks */ if (ret > sizeof(answer)) { ret = sizeof(answer); @@ -154,6 +155,7 @@ int getmx(char *mxbuf, char *dest) { } while(1) { + TRACE; memset(expanded_buf, 0, sizeof(expanded_buf)); ret = dn_expand(startptr, endptr, ptr, expanded_buf, sizeof(expanded_buf)); if (ret < 0) break; @@ -163,6 +165,7 @@ int getmx(char *mxbuf, char *dest) { ptr += INT16SZ + INT32SZ; GETSHORT(n, ptr); + syslog(LOG_DEBUG, "\033[35mgetmx: found record of type %d and length %d\033[0m", type, n); if (type != T_MX) { ptr += n; } @@ -193,6 +196,7 @@ int getmx(char *mxbuf, char *dest) { strcpy(mxbuf, ""); for (n=0; n\033[0m", n, mxrecs[n].host); strcat(mxbuf, mxrecs[n].host); strcat(mxbuf, "|"); } diff --git a/citadel/modules/smtp/serv_smtpclient.c b/citadel/modules/smtp/serv_smtpclient.c index c266a259b..e31581fa1 100644 --- a/citadel/modules/smtp/serv_smtpclient.c +++ b/citadel/modules/smtp/serv_smtpclient.c @@ -300,7 +300,7 @@ int smtp_attempt_delivery(long msgid, char *recp, char *envelope_from, char *res try_this_mx, CtdlGetConfigStr("c_fqdn") ); curl_easy_setopt(curl, CURLOPT_URL, smtp_url); - syslog(LOG_DEBUG, "smtpclient: trying %s", smtp_url); // send the message + syslog(LOG_DEBUG, "smtpclient: trying mx %d of %d <%s>", i, num_mx, smtp_url); // send the message res = curl_easy_perform(curl); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); syslog(LOG_DEBUG, diff --git a/citadel/server_main.c b/citadel/server_main.c index 753e73a6b..cd5a023e0 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -187,6 +187,7 @@ int main(int argc, char **argv) { if (chdir(ctdldir) != 0) { syslog(LOG_ERR, "main: unable to change directory to [%s]: %m", ctdldir); + exit(CTDLEXIT_HOME); } else { syslog(LOG_INFO, "main: running in data directory %s", ctdldir); -- 2.30.2