From d9af0e5314a215100c61ef0d4a3d7109affa7696 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Sun, 6 Nov 2011 23:02:50 +0000 Subject: [PATCH] Fix witnessed infinite loop in bbs_thread() during SSH connection if the output_thread is terminated (for some uknown reason, perhaps due to the new checking of the "online" value): outbuf will never drain if the output_thread isn't running, and possibly, even if it is (but there is no connection). Added error logging during node status change in dailly_main(). --- src/sbbs3/main.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 06cef3754f..b398cd98dd 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -4083,15 +4083,18 @@ void sbbs_t::daily_maint(void) uint i; uint usernum; uint lastusernum; - node_t node; user_t user; now=time(NULL); - sbbs->getnodedat(sbbs->cfg.node_num,&node,1); - node.status=NODE_EVENT_RUNNING; - sbbs->putnodedat(sbbs->cfg.node_num,&node); - + if(sbbs->cfg.node_num) { + if((i=sbbs->getnodedat(sbbs->cfg.node_num,&sbbs->thisnode,true)) != 0) + sbbs->errormsg(WHERE,ERR_LOCK,"node file",i); + else { + sbbs->thisnode.status=NODE_EVENT_RUNNING; + sbbs->putnodedat(sbbs->cfg.node_num,&sbbs->thisnode); + } + } sbbs->logentry("!:","Ran system daily maintenance"); if(sbbs->cfg.user_backup_level) { @@ -5422,7 +5425,7 @@ NO_PASSTHRU: new_node->telnet_mode|=TELNET_MODE_OFF; // SSH does not use Telnet commands new_node->ssh_session=sbbs->ssh_session; /* Wait for pending data to be sent then turn off ssh_mode for uber-output */ - while(RingBufFull(&sbbs->outbuf)) + while(sbbs->output_thread_running && RingBufFull(&sbbs->outbuf)) SLEEP(1); cryptPopData(sbbs->ssh_session, str, sizeof(str), &i); sbbs->ssh_mode=false; -- GitLab