diff --git a/src/sbbs3/addfiles.c b/src/sbbs3/addfiles.c
index 5b20a8dcf7b2fd4e6ee597fad6a8778333a07b73..0c956cb504b908412e6e079f77eff9a74d150ff8 100644
--- a/src/sbbs3/addfiles.c
+++ b/src/sbbs3/addfiles.c
@@ -732,7 +732,7 @@ int main(int argc, char **argv)
 		fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir);
 
 	printf("\nLoading configuration files from %s\n",scfg.ctrl_dir);
-	if(!load_cfg(&scfg,NULL,TRUE,error)) {
+	if(!load_cfg(&scfg,NULL,TRUE,error, sizeof(error))) {
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",error);
 		exit(1);
 	}
diff --git a/src/sbbs3/ctrl/ConfigWizardUnit.cpp b/src/sbbs3/ctrl/ConfigWizardUnit.cpp
index 32667eaecdf39e4e6f40ea852ffab419bab9823c..66b01669d234ef3ffd50da1ca751dabdb553322d 100644
--- a/src/sbbs3/ctrl/ConfigWizardUnit.cpp
+++ b/src/sbbs3/ctrl/ConfigWizardUnit.cpp
@@ -1,7 +1,5 @@
 /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
 
-/* $Id: ConfigWizardUnit.cpp,v 1.26 2018/11/06 01:49:51 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 //---------------------------------------------------------------------------
@@ -145,7 +131,7 @@ void __fastcall TConfigWizard::FormShow(TObject *Sender)
     scfg.size=sizeof(scfg);
     char error[256];
 	SAFECOPY(error,UNKNOWN_LOAD_ERROR);
-    if(!load_cfg(&scfg,NULL,FALSE,error)) {
+    if(!load_cfg(&scfg,NULL,FALSE,error,sizeof(error))) {
         Application->MessageBox(error,"ERROR Loading Configuration"
         	,MB_OK|MB_ICONEXCLAMATION);
         Close();
diff --git a/src/sbbs3/ctrl/MainFormUnit.cpp b/src/sbbs3/ctrl/MainFormUnit.cpp
index 660684b7c68ea22bb61d0f84b1bd9620539815b1..39668a3869f85ab370665eec74c2de0eef6753c7 100644
--- a/src/sbbs3/ctrl/MainFormUnit.cpp
+++ b/src/sbbs3/ctrl/MainFormUnit.cpp
@@ -1950,7 +1950,7 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender)
 	SAFECOPY(error,UNKNOWN_LOAD_ERROR);
 
    	StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Loading configuration...";
-	if(!load_cfg(&cfg, NULL, TRUE, error)) {
+	if(!load_cfg(&cfg, NULL, TRUE, error, sizeof(error))) {
     	Application->MessageBox(error,"ERROR Loading Configuration"
 	        ,MB_OK|MB_ICONEXCLAMATION);
         Application->Terminate();
@@ -3121,7 +3121,7 @@ void __fastcall TMainForm::reload_config(void)
 	char error[256];
 	SAFECOPY(error,UNKNOWN_LOAD_ERROR);
    	StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Reloading configuration...";
-	if(!load_cfg(&cfg, NULL, TRUE, error)) {
+	if(!load_cfg(&cfg, NULL, TRUE, error, sizeof(error))) {
     	Application->MessageBox(error,"ERROR Re-loading Configuration"
 	        ,MB_OK|MB_ICONEXCLAMATION);
         Application->Terminate();
diff --git a/src/sbbs3/delfiles.c b/src/sbbs3/delfiles.c
index c38e8fad6d8bee4ae8d6d89da82f41d8a7c7e05b..8e7e051dca404b435078124a66c71f9240463c0d 100644
--- a/src/sbbs3/delfiles.c
+++ b/src/sbbs3/delfiles.c
@@ -113,7 +113,7 @@ int main(int argc, char **argv)
 	SAFECOPY(cfg.ctrl_dir, p);
 	backslash(cfg.ctrl_dir);
 
-	load_cfg(&cfg, NULL, TRUE, str);
+	load_cfg(&cfg, NULL, TRUE, str, sizeof(str));
 	chdir(cfg.ctrl_dir);
 
 	dirnum=libnum=-1;
diff --git a/src/sbbs3/dupefind.c b/src/sbbs3/dupefind.c
index 554436aace2c734077e1164dfca38c1963396327..6e516db5fd22fdeaedbc8a3f76d4ec63153d6876 100644
--- a/src/sbbs3/dupefind.c
+++ b/src/sbbs3/dupefind.c
@@ -111,7 +111,7 @@ int main(int argc,char **argv)
 	cfg.size=sizeof(cfg);
 	SAFECOPY(cfg.ctrl_dir,p);
 
-	if(!load_cfg(&cfg,NULL,TRUE,str)) {
+	if(!load_cfg(&cfg,NULL,TRUE,str, sizeof(str))) {
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",str);
 		return(1);
 	}
diff --git a/src/sbbs3/filelist.c b/src/sbbs3/filelist.c
index ee1a762714b9ef832929b37c8d5046fa2e5b83f9..e3922471902757d85137414f9be2729e81e3bfd6 100644
--- a/src/sbbs3/filelist.c
+++ b/src/sbbs3/filelist.c
@@ -153,7 +153,7 @@ int main(int argc, char **argv)
 		fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir);
 
 	printf("\nLoading configuration files from %s\n",scfg.ctrl_dir);
-	if(!load_cfg(&scfg,NULL,TRUE,error)) {
+	if(!load_cfg(&scfg,NULL,TRUE,error, sizeof(error))) {
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",error);
 		exit(1);
 	}
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index ab67deb720199b344add3165053788d05e60729c..4558db1bc36f511e98b900e3eaad257674b65764 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -5175,7 +5175,7 @@ void DLLCALL ftp_server(void* arg)
 		lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
 		scfg.size=sizeof(scfg);
 		SAFECOPY(error,UNKNOWN_LOAD_ERROR);
-		if(!load_cfg(&scfg, text, TRUE, error)) {
+		if(!load_cfg(&scfg, text, TRUE, error, sizeof(error))) {
 			lprintf(LOG_CRIT,"!ERROR %s",error);
 			lprintf(LOG_CRIT,"!Failed to load configuration files");
 			cleanup(1,__LINE__);
diff --git a/src/sbbs3/gtkchat/chatfuncs.c b/src/sbbs3/gtkchat/chatfuncs.c
index cccaac1529978a6e68331d28a7b4b43d4d2fac47..ab016c0744ee4bce69f9e321baf9f4e392172823 100644
--- a/src/sbbs3/gtkchat/chatfuncs.c
+++ b/src/sbbs3/gtkchat/chatfuncs.c
@@ -53,7 +53,7 @@ int chat_open(int node_num, char *ctrl_dir)
     memset(&cfg,0,sizeof(cfg));
     cfg.size=sizeof(cfg);
     SAFECOPY(cfg.ctrl_dir,ctrl_dir);
-    if(!load_cfg(&cfg, NULL, TRUE, str))
+    if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str)))
         return(-1);
 
 	nodenum=node_num;
diff --git a/src/sbbs3/gtkmonitor/gtkmonitor.c b/src/sbbs3/gtkmonitor/gtkmonitor.c
index 9453c9afa9c1880d4eceda1ce32871998feec7de..3d714899a361a087f9cb39fe229a0e319f29a6b8 100644
--- a/src/sbbs3/gtkmonitor/gtkmonitor.c
+++ b/src/sbbs3/gtkmonitor/gtkmonitor.c
@@ -76,7 +76,7 @@ void refresh_events(void)
 
     /* Read .cfg files here */
 	free_cfg(&cfg);
-    if(!load_cfg(&cfg, NULL, TRUE, str)) {
+    if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		char error[256];
 		SAFEPRINTF(error, "ERROR Loading Configuration Files: %s", str);
 		display_message("Load Error",error,"gtk-dialog-error");
diff --git a/src/sbbs3/gtkuseredit/gtkuseredit.c b/src/sbbs3/gtkuseredit/gtkuseredit.c
index f3c3f1e5e730d294f7ec93c25cdb04c7b1e8f301..0aa7b7dd254079a923f7ff5e9d1c73850c7ca40b 100644
--- a/src/sbbs3/gtkuseredit/gtkuseredit.c
+++ b/src/sbbs3/gtkuseredit/gtkuseredit.c
@@ -90,7 +90,7 @@ int refresh_globals(void)
 	}
 
     /* Read .cfg files here */
-    if(!load_cfg(&cfg, NULL, TRUE, str)) {
+    if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		fprintf(stderr,"Cannot load configuration data: %s\n", str);
         return(-1);
 	}
diff --git a/src/sbbs3/gtkuserlist/events.c b/src/sbbs3/gtkuserlist/events.c
index 49a93cd8f26f3063284177423c1115adf016ba4c..c1f52b4fdc5cb72204025d4e2c4023146d89a3b3 100644
--- a/src/sbbs3/gtkuserlist/events.c
+++ b/src/sbbs3/gtkuserlist/events.c
@@ -125,7 +125,7 @@ G_MODULE_EXPORT void update_userlist_callback(GtkWidget *wiggy, gpointer data)
 	char			str[1024];
 
 	free_cfg(&cfg);
-	if(!load_cfg(&cfg, NULL, TRUE, str)) {
+	if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		char error[256];
 		SAFEPRINTF(error, "ERROR Loading Configuration Data: %s", str);
 		display_message("Load Error",error,"gtk-dialog-error");
diff --git a/src/sbbs3/gtkuserlist/gtkuserlist.c b/src/sbbs3/gtkuserlist/gtkuserlist.c
index c40749ab35f042583d59c72ff0ab9324a88064ae..f99a8268bbc23cdbee01b1372efe7daeed3265a7 100644
--- a/src/sbbs3/gtkuserlist/gtkuserlist.c
+++ b/src/sbbs3/gtkuserlist/gtkuserlist.c
@@ -39,7 +39,7 @@ int main(int argc, char **argv)
 	}
     cfg.size=sizeof(cfg);
 
-    if(!load_cfg(&cfg, NULL, TRUE, str)) {
+    if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		fprintf(stderr,"Cannot load configuration data (%s)",str);
         return(-1);
 	}
diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index afa5cd907b8637de6daf64be2ee05edb6d6ceeb5..63ab04784c931816ec50e164e137881e94e52f66 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -294,7 +294,7 @@ js_execfile(JSContext *cx, uintN argc, jsval *arglist)
 	JSObject*	pscope;
 	JSObject*	js_script=NULL;
 	JSObject*	nargv;
-	jsval		rval;
+	jsval		rval = JSVAL_VOID;
 	jsrefcount	rc;
 	uintN		i;
 	jsval		val;
@@ -465,7 +465,9 @@ js_execfile(JSContext *cx, uintN argc, jsval *arglist)
 		JS_GetPendingException(cx, &rval);
 	}
 	else {
-		JS_GetProperty(cx, js_scope, "exit_code", &rval);
+		jsval exit_code = JSVAL_VOID;
+		if(JS_GetProperty(cx, js_scope, "exit_code", &exit_code) && exit_code != JSVAL_VOID)
+			rval = exit_code;
 	}
 	JS_SET_RVAL(cx, arglist, rval);
 	JS_ClearPendingException(cx);
@@ -935,7 +937,7 @@ void DLLCALL js_PrepareToExecute(JSContext *cx, JSObject *obj, const char *filen
 		JS_DefineProperty(cx, js, "scope", OBJECT_TO_JSVAL(scope)
 			,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
 	}
-	JS_DefineProperty(cx, scope, "exit_code", JSVAL_NULL
+	JS_DefineProperty(cx, scope, "exit_code", JSVAL_VOID
 		,NULL,NULL,JSPROP_ENUMERATE|JSPROP_PERMANENT);
 #if defined(_MSC_VER)
 	_set_invalid_parameter_handler(msvc_invalid_parameter_handler);
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 7ae57cf6f12c0dc8209bfa8c04bf4b26df6b9fe5..6c42f16a12d5940e3edd8a3b7bdb99cdcd40bde6 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -1391,7 +1391,7 @@ int main(int argc, char **argv, char** env)
 		fprintf(errfp,"!ERROR changing directory to: %s\n", scfg.ctrl_dir);
 
 	fprintf(statfp,"\nLoading configuration files from %s\n",scfg.ctrl_dir);
-	if(!load_cfg(&scfg,text,TRUE,error)) {
+	if(!load_cfg(&scfg,text,TRUE,error, sizeof(error))) {
 		fprintf(errfp,"!ERROR loading configuration files: %s\n",error);
 		return(do_bail(1));
 	}
diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index d9e10f09f10427ec8f01465a9d676a09d85294b3..147d66bbd403c7485ab6d24535903dc63238aa77 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -40,7 +40,7 @@ char *	readtext(long *line, FILE *stream, long dflt);
 /****************************************************************************/
 /* Initializes system and node configuration information and data variables */
 /****************************************************************************/
-BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
+BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error, size_t maxerrlen)
 {
 	int		i;
 #ifdef SBBS
@@ -50,7 +50,7 @@ BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
 #endif
 
 	if(cfg->size!=sizeof(scfg_t)) {
-		sprintf(error,"cfg->size (%"PRIu32") != sizeof(scfg_t) (%" XP_PRIsize_t "d)"
+		safe_snprintf(error, maxerrlen,"cfg->size (%"PRIu32") != sizeof(scfg_t) (%" XP_PRIsize_t "d)"
 			,cfg->size,sizeof(scfg_t));
 		return(FALSE);
 	}
@@ -64,7 +64,7 @@ BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
 		cfg->node_num=1;
 
 	backslash(cfg->ctrl_dir);
-	if(read_main_cfg(cfg, error)==FALSE)
+	if(read_main_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
 
 	if(prep)
@@ -73,17 +73,17 @@ BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
 
 	SAFECOPY(cfg->node_dir,cfg->node_path[cfg->node_num-1]);
 	prep_dir(cfg->ctrl_dir, cfg->node_dir, sizeof(cfg->node_dir));
-	if(read_node_cfg(cfg, error)==FALSE)
+	if(read_node_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
-	if(read_msgs_cfg(cfg, error)==FALSE)
+	if(read_msgs_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
-	if(read_file_cfg(cfg, error)==FALSE)
+	if(read_file_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
-	if(read_xtrn_cfg(cfg, error)==FALSE)
+	if(read_xtrn_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
-	if(read_chat_cfg(cfg, error)==FALSE)
+	if(read_chat_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
-	if(read_attr_cfg(cfg, error)==FALSE)
+	if(read_attr_cfg(cfg, error, maxerrlen)==FALSE)
 		return(FALSE);
 
 #ifdef SBBS
@@ -94,7 +94,7 @@ BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
 
 		SAFEPRINTF(str,"%stext.dat",cfg->ctrl_dir);
 		if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-			sprintf(error,"%d opening %s",errno,str);
+			safe_snprintf(error, maxerrlen,"%d opening %s",errno,str);
 			return(FALSE); 
 		}
 		for(i=0;i<TOTAL_TEXT;i++)
@@ -105,7 +105,7 @@ BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error)
 		fclose(instream);
 
 		if(i<TOTAL_TEXT) {
-			sprintf(error,"line %d: Less than TOTAL_TEXT (%u) strings defined in %s."
+			safe_snprintf(error, maxerrlen,"line %d: Less than TOTAL_TEXT (%u) strings defined in %s."
 				,i
 				,TOTAL_TEXT,str);
 			return(FALSE); 
@@ -353,7 +353,7 @@ int md(const char* inpath)
 /****************************************************************************/
 /* Reads in ATTR.CFG and initializes the associated variables               */
 /****************************************************************************/
-BOOL read_attr_cfg(scfg_t* cfg, char* error)
+BOOL read_attr_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
 	uint*	clr;
     char    str[256];
@@ -362,12 +362,12 @@ BOOL read_attr_cfg(scfg_t* cfg, char* error)
 
 	SAFEPRINTF(str,"%sattr.cfg",cfg->ctrl_dir);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d opening %s",errno,str);
+		safe_snprintf(error, maxerrlen,"%d opening %s",errno,str);
 		return(FALSE); 
 	}
 	FREE_AND_NULL(cfg->color);
 	if((cfg->color=malloc(MIN_COLORS * sizeof(uint)))==NULL) {
-		sprintf(error,"Error allocating memory (%u bytes) for colors"
+		safe_snprintf(error, maxerrlen,"Error allocating memory (%u bytes) for colors"
 			,MIN_COLORS);
 		fclose(instream);
 		return(FALSE);
diff --git a/src/sbbs3/load_cfg.h b/src/sbbs3/load_cfg.h
index 7f36380c650ace0ca3f631ddb7da4603f03670fc..fc0e5c468326b50a1dac896197003044996b591c 100644
--- a/src/sbbs3/load_cfg.h
+++ b/src/sbbs3/load_cfg.h
@@ -29,7 +29,7 @@
 extern "C" {
 #endif
 
-DLLEXPORT BOOL		load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error);
+DLLEXPORT BOOL		load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error, size_t);
 DLLEXPORT void		free_cfg(scfg_t* cfg);
 DLLEXPORT void		free_text(char* text[]);
 DLLEXPORT ushort	sys_timezone(scfg_t* cfg);
@@ -40,4 +40,4 @@ DLLEXPORT int 		md(const char *path);
 #ifdef __cplusplus
 }
 #endif
-#endif /* Don't add anything after this line */
\ No newline at end of file
+#endif /* Don't add anything after this line */
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 627932d9341164775370bd6bc2ab60dffbabe74c..00b9683cab38fe904cfb1b60aab93850256e097d 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -6145,7 +6145,7 @@ void DLLCALL mail_server(void* arg)
 		lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
 		scfg.size=sizeof(scfg);
 		SAFECOPY(error,UNKNOWN_LOAD_ERROR);
-		if(!load_cfg(&scfg, text, TRUE, error)) {
+		if(!load_cfg(&scfg, text, TRUE, error, sizeof(error))) {
 			lprintf(LOG_CRIT,"!ERROR %s",error);
 			lprintf(LOG_CRIT,"!Failed to load configuration files");
 			cleanup(1);
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index ae9bf8761c66ad890fb971bd34fd49cb7e49496b..81f25742c1465177ade4a95c10e46388e6f2713d 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -5131,7 +5131,7 @@ void DLLCALL bbs_thread(void* arg)
 	scfg.size=sizeof(scfg);
 	scfg.node_num=startup->first_node;
 	SAFECOPY(logstr,UNKNOWN_LOAD_ERROR);
-	if(!load_cfg(&scfg, text, TRUE, logstr)) {
+	if(!load_cfg(&scfg, text, TRUE, logstr, sizeof(logstr))) {
 		lprintf(LOG_CRIT,"!ERROR %s",logstr);
 		lprintf(LOG_CRIT,"!FAILED to load configuration files");
 		cleanup(1);
@@ -5744,10 +5744,10 @@ NO_SSH:
 		    SAFECOPY(cfg->ctrl_dir, startup->ctrl_dir);
 			lprintf(LOG_INFO,"Node %d Loading configuration files from %s", cfg->node_num, cfg->ctrl_dir);
 			SAFECOPY(logstr,UNKNOWN_LOAD_ERROR);
-			if(!load_cfg(cfg, node_text[i - 1], TRUE, logstr)) {
+			if(!load_cfg(cfg, node_text[i - 1], TRUE, logstr, sizeof(logstr))) {
 				lprintf(LOG_WARNING, "Node %d LOAD ERROR: %s, falling back to Node %d", cfg->node_num, logstr, first_node);
 				cfg->node_num = first_node;
-				if(!load_cfg(cfg, node_text[i - 1], TRUE, logstr)) {
+				if(!load_cfg(cfg, node_text[i - 1], TRUE, logstr, sizeof(logstr))) {
 					lprintf(LOG_CRIT,"!ERROR %s",logstr);
 					lprintf(LOG_CRIT,"!FAILED to load configuration files");
 					sbbs->bprintf("\r\nFAILED: %s", logstr);
diff --git a/src/sbbs3/makeuser.c b/src/sbbs3/makeuser.c
index 14274aaf288a3fc3537c34fc1b8c102a44de6ea8..a7f5943f6f064637bd51fd90a91045aa211b3aa2 100644
--- a/src/sbbs3/makeuser.c
+++ b/src/sbbs3/makeuser.c
@@ -103,7 +103,7 @@ int main(int argc, char **argv)
 		fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir);
 
 	printf("\nLoading configuration files from %s\n",scfg.ctrl_dir);
-	if(!load_cfg(&scfg,NULL,TRUE,error)) {
+	if(!load_cfg(&scfg,NULL,TRUE,error, sizeof(error))) {
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",error);
 		exit(1);
 	}
diff --git a/src/sbbs3/msg_id.c b/src/sbbs3/msg_id.c
index 6dc987f255c29ee227a9cb647f54a1d810de63d7..cfde9524672d0bb773c08062bb02b84db23c189a 100644
--- a/src/sbbs3/msg_id.c
+++ b/src/sbbs3/msg_id.c
@@ -167,8 +167,7 @@ BOOL DLLCALL add_msg_ids(scfg_t* cfg, smb_t* smb, smbmsg_t* msg, smbmsg_t* remsg
  	if(msg->ftn_msgid == NULL) {
 		if(smb->subnum == INVALID_SUB && msg->to_net.type == NET_FIDO) {
 			safe_snprintf(msg_id, sizeof(msg_id)
-				,"%lu@%s %08lx"
-				,msg_number(msg)
+				,"%s %08lx"
 				,smb_faddrtoa(&cfg->faddr[nearest_sysfaddr(cfg, msg->to_net.addr)], NULL)
 				,msgid_serialno(msg)
 				);
diff --git a/src/sbbs3/qwknodes.c b/src/sbbs3/qwknodes.c
index 1532403201e3112133d26f73e03cdd813f88f912..4ffd07055c84697227691f75a3f32a54e0effc9f 100644
--- a/src/sbbs3/qwknodes.c
+++ b/src/sbbs3/qwknodes.c
@@ -244,7 +244,7 @@ int main(int argc, char **argv)
 	cfg.size=sizeof(cfg);
 	SAFECOPY(cfg.ctrl_dir, get_ctrl_dir(/* warn: */TRUE));
 
-	if(!load_cfg(&cfg, NULL, TRUE, str)) {
+	if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		printf("\7\n%s\n",str);
 	}
 
diff --git a/src/sbbs3/sbbs_status.c b/src/sbbs3/sbbs_status.c
index 80cf1caf20699950c1f98002799fae708f17acc7..c433d4b2775b32f4bd21f4d06756cda66d3d17dd 100644
--- a/src/sbbs3/sbbs_status.c
+++ b/src/sbbs3/sbbs_status.c
@@ -496,7 +496,7 @@ void status_thread(void *arg)
 	lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
 	scfg.size=sizeof(scfg);
 	SAFECOPY(error,UNKNOWN_LOAD_ERROR);
-	if(!load_cfg(&scfg, NULL, TRUE, error)) {
+	if(!load_cfg(&scfg, NULL, TRUE, error, sizeof(error))) {
 		lprintf(LOG_CRIT,"!ERROR %s",error);
 		lprintf(LOG_CRIT,"!Failed to load configuration files");
 		return;
diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c
index 4741e715a84c466a3654e1788a5e9657bf801950..ff7c3d2d966642b5736f1108deaaa78e49146f69 100644
--- a/src/sbbs3/sbbscon.c
+++ b/src/sbbs3/sbbscon.c
@@ -1914,7 +1914,7 @@ int main(int argc, char** argv)
     scfg.size=sizeof(scfg);
 	SAFECOPY(error,UNKNOWN_LOAD_ERROR);
 	lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
-	if(!load_cfg(&scfg, NULL /* text.dat */, TRUE /* prep */, error)) {
+	if(!load_cfg(&scfg, NULL /* text.dat */, TRUE /* prep */, error, sizeof(error))) {
 		lprintf(LOG_ERR,"!ERROR Loading Configuration Files: %s", error);
         return(-1);
     }
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 54ae34ef61ea21c363464ffa9b4b34ba2006944b..7a6c8327e8a8c73cd86b9d1423c0b3bb401b6e67 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -6259,7 +6259,7 @@ int main(int argc, char **argv)
     printf("\nLoading configuration files from %s\n", scfg.ctrl_dir);
 	scfg.size=sizeof(scfg);
 	SAFECOPY(str,UNKNOWN_LOAD_ERROR);
-	if(!load_cfg(&scfg, NULL, true, str)) {
+	if(!load_cfg(&scfg, NULL, true, str, sizeof(str))) {
 		fprintf(stderr,"!ERROR %s\n",str);
 		fprintf(stderr,"!Failed to load configuration files\n");
 		bail(1);
diff --git a/src/sbbs3/scfg/scfg.c b/src/sbbs3/scfg/scfg.c
index 54f7f126d73501a3a6f7dd7aacceb4302bf142a1..768b030b797c221f470ea4e627dfe4c7e2ff2335 100644
--- a/src/sbbs3/scfg/scfg.c
+++ b/src/sbbs3/scfg/scfg.c
@@ -348,13 +348,13 @@ int main(int argc, char **argv)
 		}
 
 		printf("Reading main.cnf ... ");
-		if(!read_main_cfg(&cfg,error)) {
+		if(!read_main_cfg(&cfg,error,sizeof(error))) {
 			printf("ERROR: %s",error);
 			return EXIT_FAILURE;
 		}
 		printf("\n");
 		printf("Reading msgs.cnf ... ");
-		if(!read_msgs_cfg(&cfg,error)) {
+		if(!read_msgs_cfg(&cfg,error,sizeof(error))) {
 			printf("ERROR: %s",error);
 			return EXIT_FAILURE;
 		}
@@ -434,7 +434,7 @@ int main(int argc, char **argv)
 
 	SAFEPRINTF(str,"%smain.cnf",cfg.ctrl_dir);
 	if(!fexist(str)) {
-		sprintf(errormsg,"Main configuration file (%s) missing!",str);
+		SAFEPRINTF(errormsg, "Main configuration file (%s) missing!",str);
 		uifc.msg(errormsg);
 	}
 
@@ -475,8 +475,8 @@ int main(int argc, char **argv)
 		switch(uifc.list(WIN_ORG|WIN_MID|WIN_ESC|WIN_ACT,0,0,30,&main_dflt,0
 			,"Configure",mopt)) {
 			case 0:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -484,13 +484,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 1:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_xtrn_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_xtrn_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -499,13 +499,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 2:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_msgs_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_msgs_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -514,13 +514,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 3:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_file_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_file_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}	
@@ -529,13 +529,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 4:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_file_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_file_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -544,8 +544,8 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 5:
-				if(!load_chat_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_chat_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg,"ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}	
@@ -590,13 +590,13 @@ int main(int argc, char **argv)
 				free_chat_cfg(&cfg);
 				break;
 			case 6:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_msgs_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_msgs_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -605,13 +605,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 7:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_msgs_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_msgs_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -620,8 +620,8 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 8:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -629,13 +629,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 9:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_xtrn_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_xtrn_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -644,13 +644,13 @@ int main(int argc, char **argv)
 				free_main_cfg(&cfg);
 				break;
 			case 10:
-				if(!load_main_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_main_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
-				if(!load_file_cfg(&cfg,error)) {
-					sprintf(errormsg,"ERROR: %s",error);
+				if(!load_file_cfg(&cfg, error, sizeof(error))) {
+					SAFEPRINTF(errormsg, "ERROR: %s",error);
 					uifc.msg(errormsg);
 					break;
 				}
@@ -677,50 +677,50 @@ int main(int argc, char **argv)
 	}
 }
 
-BOOL load_main_cfg(scfg_t* cfg, char *error)
+BOOL load_main_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading main.cnf ...");
-	BOOL result = read_main_cfg(cfg, error);
+	BOOL result = read_main_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
 
-BOOL load_node_cfg(scfg_t* cfg, char *error)
+BOOL load_node_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading node.cnf ...");
-	BOOL result = read_node_cfg(cfg, error);
+	BOOL result = read_node_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
 
-BOOL load_msgs_cfg(scfg_t* cfg, char *error)
+BOOL load_msgs_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading msgs.cnf ...");
-	BOOL result = read_msgs_cfg(cfg, error);
+	BOOL result = read_msgs_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
 
-BOOL load_file_cfg(scfg_t* cfg, char *error)
+BOOL load_file_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading file.cnf ...");
-	BOOL result = read_file_cfg(cfg, error);
+	BOOL result = read_file_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
 
-BOOL load_chat_cfg(scfg_t* cfg, char *error)
+BOOL load_chat_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading chat.cnf ...");
-	BOOL result = read_chat_cfg(cfg, error);
+	BOOL result = read_chat_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
 
-BOOL load_xtrn_cfg(scfg_t* cfg, char *error)
+BOOL load_xtrn_cfg(scfg_t* cfg, char *error, size_t maxerrlen)
 {
 	uifc.pop("Reading xtrn.cnf ...");
-	BOOL result = read_xtrn_cfg(cfg, error);
+	BOOL result = read_xtrn_cfg(cfg, error, maxerrlen);
 	uifc.pop(NULL);
 	return result;
 }
@@ -2193,11 +2193,11 @@ void bail(int code)
 		getchar();
 	}
     else if(forcesave) {
-        load_main_cfg(&cfg,error);
-        load_msgs_cfg(&cfg,error);
-        load_file_cfg(&cfg,error);
-        load_chat_cfg(&cfg,error);
-        load_xtrn_cfg(&cfg,error);
+        load_main_cfg(&cfg, error, sizeof(error));
+        load_msgs_cfg(&cfg, error, sizeof(error));
+        load_file_cfg(&cfg, error, sizeof(error));
+        load_chat_cfg(&cfg, error, sizeof(error));
+        load_xtrn_cfg(&cfg, error, sizeof(error));
 		cfg.new_install=new_install;
         save_main_cfg(&cfg,backup_level);
         save_msgs_cfg(&cfg,backup_level);
diff --git a/src/sbbs3/scfg/scfg.h b/src/sbbs3/scfg/scfg.h
index f050dc05420e4baf46f24f42443abc4fca09d031..f2e04f2b10954bcc58ca252689fff836f1bb745d 100644
--- a/src/sbbs3/scfg/scfg.h
+++ b/src/sbbs3/scfg/scfg.h
@@ -153,12 +153,12 @@ void sort_subs(int grpnum);
 void sort_dirs(int libnum);
 unsigned subs_in_group(unsigned grpnum);
 char random_code_char(void);
-BOOL load_main_cfg(scfg_t*, char*);
-BOOL load_node_cfg(scfg_t*, char*);
-BOOL load_msgs_cfg(scfg_t*, char*);
-BOOL load_file_cfg(scfg_t*, char*);
-BOOL load_chat_cfg(scfg_t*, char*);
-BOOL load_xtrn_cfg(scfg_t*, char*);
+BOOL load_main_cfg(scfg_t*, char*, size_t);
+BOOL load_node_cfg(scfg_t*, char*, size_t);
+BOOL load_msgs_cfg(scfg_t*, char*, size_t);
+BOOL load_file_cfg(scfg_t*, char*, size_t);
+BOOL load_chat_cfg(scfg_t*, char*, size_t);
+BOOL load_xtrn_cfg(scfg_t*, char*, size_t);
 BOOL save_main_cfg(scfg_t*, int);
 BOOL save_node_cfg(scfg_t*, int);
 BOOL save_msgs_cfg(scfg_t*, int);
diff --git a/src/sbbs3/scfg/scfgnode.c b/src/sbbs3/scfg/scfgnode.c
index d4fe0fd22a2ef6c3805d27f5854da01ee04e1125..3903fbabb677a4d1d1f65e48937bf48055d3cec5 100644
--- a/src/sbbs3/scfg/scfgnode.c
+++ b/src/sbbs3/scfg/scfgnode.c
@@ -100,7 +100,7 @@ void node_menu()
 		if(msk == MSK_INS) {
 			SAFECOPY(cfg.node_dir,cfg.node_path[cfg.sys_nodes-1]);
 			i=cfg.sys_nodes+1;
-			load_node_cfg(&cfg,error);
+			load_node_cfg(&cfg,error, sizeof(error));
 			if(i == 1) {
 				SAFEPRINTF(str,"../node%d/",i);
 			} else {
@@ -135,7 +135,7 @@ void node_menu()
 				free_node_cfg(&cfg);
 			i&=MSK_OFF;
 			SAFECOPY(cfg.node_dir,cfg.node_path[i]);
-			load_node_cfg(&cfg,error);
+			load_node_cfg(&cfg,error, sizeof(error));
 			savnode=1;
 			continue; 
 		}
@@ -155,7 +155,7 @@ void node_menu()
 		SAFECOPY(cfg.node_dir,cfg.node_path[i]);
 		prep_dir(cfg.ctrl_dir, cfg.node_dir, sizeof(cfg.node_dir));
 
-		load_node_cfg(&cfg,error);
+		load_node_cfg(&cfg,error, sizeof(error));
 		if (cfg.node_num != i + 1) { 	/* Node number isn't right? */
 			cfg.node_num = i + 1;		/* so fix it */
 			save_node_cfg(&cfg, backup_level); /* and write it back */
diff --git a/src/sbbs3/scfglib.h b/src/sbbs3/scfglib.h
index 34dac1d7f154733790dc4932ae9ea909db96c7d9..3353552d37264571cf8a84bd8ee7c139ed997b63 100644
--- a/src/sbbs3/scfglib.h
+++ b/src/sbbs3/scfglib.h
@@ -1,7 +1,5 @@
 /* Synchronet configuration library routine prototypes */
 
-/* $Id: scfglib.h,v 1.25 2020/05/14 07:50:00 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -51,16 +37,16 @@ extern "C" {
 #endif
 
 char*	get_alloc(long *offset, char *outstr, int maxlen, FILE *instream);
-BOOL	allocerr(FILE*, char* error, long offset, char *fname, uint size);
+BOOL	allocerr(FILE*, char* error, size_t maxerrlen, long offset, const char *fname, size_t size);
 char*	readline(long *offset, char *str, int maxlen, FILE *stream);
 
-BOOL	read_node_cfg(scfg_t* cfg, char* error);
-BOOL	read_main_cfg(scfg_t* cfg, char* error);
-BOOL	read_xtrn_cfg(scfg_t* cfg, char* error);
-BOOL	read_file_cfg(scfg_t* cfg, char* error);
-BOOL	read_msgs_cfg(scfg_t* cfg, char* error);
-BOOL	read_chat_cfg(scfg_t* cfg, char* error);
-BOOL	read_attr_cfg(scfg_t* cfg, char* error);
+BOOL	read_node_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_main_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_xtrn_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_file_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_msgs_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_chat_cfg(scfg_t* cfg, char* error, size_t);
+BOOL	read_attr_cfg(scfg_t* cfg, char* error, size_t);
 char*	prep_path(char* path); 
 void	make_data_dirs(scfg_t* cfg);
 
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 6fc8fbdc76cbd988bbc1e4fa1a56cbfcc934b4aa..966dbf90871b044b62a4f6cf17b6b8853d760bff 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -24,10 +24,10 @@
 #include "nopen.h"
 #include "ars_defs.h"
 
-BOOL allocerr(FILE* fp, char* error, long offset, char *fname, uint size)
+BOOL allocerr(FILE* fp, char* error, size_t maxerrlen, long offset, const char *fname, size_t size)
 {
-	sprintf(error,"offset %ld in %s, allocating %u bytes of memory"
-		,offset,fname,size);
+	safe_snprintf(error, maxerrlen, "offset %ld in %s, allocating %u bytes of memory"
+		,offset,fname, (uint)size);
 	fclose(fp);
 	return(FALSE);
 }
@@ -35,23 +35,23 @@ BOOL allocerr(FILE* fp, char* error, long offset, char *fname, uint size)
 /****************************************************************************/
 /* Reads in NODE.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_node_cfg(scfg_t* cfg, char* error)
+BOOL read_node_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	c,str[MAX_PATH+1],fname[13];
+	char	c,str[MAX_PATH+1];
 	int 	i;
 	long	offset=0;
 	FILE	*instream;
 
-	SAFECOPY(fname,"node.cnf");
-	sprintf(str,"%s%s",cfg->node_dir,fname);
+	const char* fname = "node.cnf";
+	SAFEPRINTF2(str,"%s%s",cfg->node_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen, "%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE); 
 	}
 
 	get_int(cfg->node_num,instream);
 	if(!cfg->node_num) {
-		sprintf(error,"offset %ld in %s, Node number must be non-zero"
+		safe_snprintf(error, maxerrlen,"offset %ld in %s, Node number must be non-zero"
 			,offset,fname);
 		fclose(instream);
 		return(FALSE); 
@@ -115,18 +115,18 @@ BOOL read_node_cfg(scfg_t* cfg, char* error)
 /****************************************************************************/
 /* Reads in MAIN.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_main_cfg(scfg_t* cfg, char* error)
+BOOL read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	str[MAX_PATH+1],fname[13],c;
+	char	str[MAX_PATH+1],c;
 	short	i,j;
 	int16_t	n;
 	long	offset=0;
 	FILE	*instream;
 
-	SAFECOPY(fname,"main.cnf");
+	const char* fname = "main.cnf";
 	SAFEPRINTF2(str,"%s%s",cfg->ctrl_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen,"%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE); 
 	}
 
@@ -142,11 +142,11 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 #if 0	/* removed Jan-10-2003: cfg->node_num may be old or uninitialized */
 	if(!cfg->sys_nodes || cfg->sys_nodes<cfg->node_num || cfg->sys_nodes>MAX_NODES) {
 		if(!cfg->sys_nodes)
-			sprintf(error,"Total nodes on system must be non-zero.");
+			safe_snprintf(error, maxerrlen,"Total nodes on system must be non-zero.");
 		else if(cfg->sys_nodes>MAX_NODES)
-			sprintf(error,"Total nodes exceeds %u.",MAX_NODES);
+			safe_snprintf(error, maxerrlen,"Total nodes exceeds %u.",MAX_NODES);
 		else
-			sprintf(error,"Total nodes (%u) < node number in NODE.CNF (%u)"
+			safe_snprintf(error, maxerrlen,"Total nodes (%u) < node number in NODE.CNF (%u)"
 				,cfg->sys_nodes,cfg->node_num);
 		fclose(instream);
 		return(FALSE); 
@@ -334,7 +334,7 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 			get_int(n,instream); 
 	}
 	if(i!=100) {
-		sprintf(error,"Insufficient User Level Information: "
+		safe_snprintf(error, maxerrlen,"Insufficient User Level Information: "
 			"%d user levels read, 100 needed.",i);
 		fclose(instream);
 		return(FALSE); 
@@ -343,7 +343,7 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 	get_int(cfg->total_shells,instream);
 	#ifdef SBBS
 	if(!cfg->total_shells) {
-		sprintf(error,"At least one command shell must be configured.");
+		safe_snprintf(error, maxerrlen,"At least one command shell must be configured.");
 		fclose(instream);
 		return(FALSE); 
 	}
@@ -351,14 +351,14 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_shells) {
 		if((cfg->shell=(shell_t **)malloc(sizeof(shell_t *)*cfg->total_shells))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(shell_t *)*cfg->total_shells);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(shell_t *)*cfg->total_shells);
 	} else
 		cfg->shell=NULL;
 
 	for(i=0;i<cfg->total_shells;i++) {
 		if(feof(instream)) break;
 		if((cfg->shell[i]=(shell_t *)malloc(sizeof(shell_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(shell_t));
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(shell_t));
 		memset(cfg->shell[i],0,sizeof(shell_t));
 
 		get_str(cfg->shell[i]->name,instream);
@@ -381,18 +381,18 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 /****************************************************************************/
 /* Reads in MSGS.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_msgs_cfg(scfg_t* cfg, char* error)
+BOOL read_msgs_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	str[MAX_PATH+1],fname[13],c;
+	char	str[MAX_PATH+1],c;
 	short	i,j;
 	int16_t	n,k;
 	long	offset=0;
 	FILE	*instream;
 
-	SAFECOPY(fname,"msgs.cnf");
-	sprintf(str,"%s%s",cfg->ctrl_dir,fname);
+	const char* fname = "msgs.cnf";
+	SAFEPRINTF2(str,"%s%s",cfg->ctrl_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen,"%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE);
 	}
 
@@ -425,7 +425,7 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_grps) {
 		if((cfg->grp=(grp_t **)malloc(sizeof(grp_t *)*cfg->total_grps))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(grp_t *)*cfg->total_grps);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(grp_t *)*cfg->total_grps);
 	} else
 		cfg->grp=NULL;
 
@@ -433,7 +433,7 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 		if(feof(instream)) break;
 		if((cfg->grp[i]=(grp_t *)malloc(sizeof(grp_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(grp_t));
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(grp_t));
 		memset(cfg->grp[i],0,sizeof(grp_t));
 
 		get_str(cfg->grp[i]->lname,instream);
@@ -459,14 +459,14 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_subs) {
 		if((cfg->sub=(sub_t **)malloc(sizeof(sub_t *)*cfg->total_subs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(sub_t *)*cfg->total_subs);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(sub_t *)*cfg->total_subs);
 	} else
 		cfg->sub=NULL;
 
 	for(i=0;i<cfg->total_subs;i++) {
 		if(feof(instream)) break;
 		if((cfg->sub[i]=(sub_t *)malloc(sizeof(sub_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(sub_t));
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(sub_t));
 		memset(cfg->sub[i],0,sizeof(sub_t));
 
 		cfg->sub[i]->subnum = i;
@@ -480,7 +480,7 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 #ifdef SBBS
 		if(cfg->sub[i]->grp >= cfg->total_grps) {
-			sprintf(error,"offset %ld in %s: invalid group number (%u) for sub-board: %s"
+			safe_snprintf(error, maxerrlen,"offset %ld in %s: invalid group number (%u) for sub-board: %s"
 				,offset,fname
 				,cfg->sub[i]->grp
 				,cfg->sub[i]->code_suffix);
@@ -522,7 +522,7 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 #ifdef SBBS
 		for(j=0;j<i;j++)
 			if(cfg->sub[i]->ptridx==cfg->sub[j]->ptridx) {
-				sprintf(error,"offset %ld in %s: Duplicate pointer index for subs %s and %s"
+				safe_snprintf(error, maxerrlen,"offset %ld in %s: Duplicate pointer index for subs %s and %s"
 					,offset,fname
 					,cfg->sub[i]->code_suffix,cfg->sub[j]->code_suffix);
 				fclose(instream);
@@ -550,7 +550,7 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_faddrs) {
 		if((cfg->faddr=(faddr_t *)malloc(sizeof(faddr_t)*cfg->total_faddrs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(faddr_t)*cfg->total_faddrs);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(faddr_t)*cfg->total_faddrs);
 	} else
 		cfg->faddr=NULL;
 
@@ -579,14 +579,14 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_qhubs) {
 		if((cfg->qhub=(qhub_t **)malloc(sizeof(qhub_t *)*cfg->total_qhubs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(qhub_t*)*cfg->total_qhubs);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(qhub_t*)*cfg->total_qhubs);
 	} else
 		cfg->qhub=NULL;
 
 	for(i=0;i<cfg->total_qhubs;i++) {
 		if(feof(instream)) break;
 		if((cfg->qhub[i]=(qhub_t *)malloc(sizeof(qhub_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(qhub_t));
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(qhub_t));
 		memset(cfg->qhub[i],0,sizeof(qhub_t));
 
 		get_str(cfg->qhub[i]->id,instream);
@@ -601,11 +601,11 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 		if(k) {
 			if((cfg->qhub[i]->sub=(sub_t**)malloc(sizeof(sub_t*)*k))==NULL)
-				return allocerr(instream,error,offset,fname,sizeof(ulong)*k);
+				return allocerr(instream, error, maxerrlen, offset,fname,sizeof(ulong)*k);
 			if((cfg->qhub[i]->conf=(ushort *)malloc(sizeof(ushort)*k))==NULL)
-				return allocerr(instream,error,offset,fname,sizeof(ushort)*k);
+				return allocerr(instream, error, maxerrlen, offset,fname,sizeof(ushort)*k);
 			if((cfg->qhub[i]->mode=(char *)malloc(sizeof(char)*k))==NULL)
-				return allocerr(instream,error,offset,fname,sizeof(uchar)*k);
+				return allocerr(instream, error, maxerrlen, offset,fname,sizeof(uchar)*k);
 		}
 
 		for(j=0;j<k;j++) {
@@ -645,14 +645,14 @@ BOOL read_msgs_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_phubs) {
 		if((cfg->phub=(phub_t **)malloc(sizeof(phub_t *)*cfg->total_phubs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(phub_t*)*cfg->total_phubs);
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(phub_t*)*cfg->total_phubs);
 	} else
 		cfg->phub=NULL;
 
 	for(i=0;i<cfg->total_phubs;i++) {
 		if(feof(instream)) break;
 		if((cfg->phub[i]=(phub_t *)malloc(sizeof(phub_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(phub_t));
+			return allocerr(instream, error, maxerrlen, offset,fname,sizeof(phub_t));
 		memset(cfg->phub[i],0,sizeof(phub_t));
 
 		get_str(cfg->phub[i]->name,instream);
diff --git a/src/sbbs3/scfglib2.c b/src/sbbs3/scfglib2.c
index f714bc7cd1d768bc8fc073928bde81385a5b1d39..adb5387dadc5f904729b8789c37edb2d684f7f4c 100644
--- a/src/sbbs3/scfglib2.c
+++ b/src/sbbs3/scfglib2.c
@@ -26,19 +26,19 @@
 /****************************************************************************/
 /* Reads in FILE.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_file_cfg(scfg_t* cfg, char* error)
+BOOL read_file_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	str[MAX_PATH+1],fname[13],c,cmd[LEN_CMD+1];
+	char	str[MAX_PATH+1],c,cmd[LEN_CMD+1];
 	short	i,j;
 	int16_t	n;
 	long	offset=0;
 	int32_t	t;
 	FILE	*instream;
 
-	strcpy(fname,"file.cnf");
-	sprintf(str,"%s%s",cfg->ctrl_dir,fname);
+	const char* fname = "file.cnf";
+	SAFEPRINTF2(str,"%s%s",cfg->ctrl_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen,"%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE); 
 	}
 
@@ -69,7 +69,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_fextrs) {
 		if((cfg->fextr=(fextr_t **)malloc(sizeof(fextr_t *)*cfg->total_fextrs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fextr_t*)*cfg->total_fextrs); 
+			return allocerr(instream, error, maxerrlen, offset, fname, sizeof(fextr_t*)*cfg->total_fextrs); 
 	} else
 		cfg->fextr=NULL;
 
@@ -77,7 +77,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 		if(feof(instream))
 			break;
 		if((cfg->fextr[i]=(fextr_t *)malloc(sizeof(fextr_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fextr_t));
+			return allocerr(instream, error, maxerrlen, offset, fname, sizeof(fextr_t));
 		memset(cfg->fextr[i],0,sizeof(fextr_t));
 		get_str(cfg->fextr[i]->ext,instream);
 		get_str(cfg->fextr[i]->cmd,instream);
@@ -97,7 +97,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_fcomps) {
 		if((cfg->fcomp=(fcomp_t **)malloc(sizeof(fcomp_t *)*cfg->total_fcomps))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fcomp_t*)*cfg->total_fcomps); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(fcomp_t*)*cfg->total_fcomps); 
 	} else
 		cfg->fcomp=NULL;
 
@@ -105,7 +105,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 		if(feof(instream))
 			break;
 		if((cfg->fcomp[i]=(fcomp_t *)malloc(sizeof(fcomp_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fcomp_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(fcomp_t));
 		memset(cfg->fcomp[i],0,sizeof(fcomp_t));
 		get_str(cfg->fcomp[i]->ext,instream);
 		get_str(cfg->fcomp[i]->cmd,instream);
@@ -125,14 +125,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_fviews) {
 		if((cfg->fview=(fview_t **)malloc(sizeof(fview_t *)*cfg->total_fviews))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fview_t*)*cfg->total_fviews); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(fview_t*)*cfg->total_fviews); 
 	} else
 		cfg->fview=NULL;
 
 	for(i=0; i<cfg->total_fviews; i++) {
 		if(feof(instream)) break;
 		if((cfg->fview[i]=(fview_t *)malloc(sizeof(fview_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(fview_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(fview_t));
 		memset(cfg->fview[i],0,sizeof(fview_t));
 		get_str(cfg->fview[i]->ext,instream);
 		get_str(cfg->fview[i]->cmd,instream);
@@ -152,14 +152,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_ftests) {
 		if((cfg->ftest=(ftest_t **)malloc(sizeof(ftest_t *)*cfg->total_ftests))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(ftest_t*)*cfg->total_ftests); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(ftest_t*)*cfg->total_ftests); 
 	} else
 		cfg->ftest=NULL;
 
 	for(i=0; i<cfg->total_ftests; i++) {
 		if(feof(instream)) break;
 		if((cfg->ftest[i]=(ftest_t *)malloc(sizeof(ftest_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(ftest_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(ftest_t));
 		memset(cfg->ftest[i],0,sizeof(ftest_t));
 		get_str(cfg->ftest[i]->ext,instream);
 		get_str(cfg->ftest[i]->cmd,instream);
@@ -181,14 +181,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 	if(cfg->total_dlevents) {
 		if((cfg->dlevent=(dlevent_t **)malloc(sizeof(dlevent_t *)*cfg->total_dlevents))
 			==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(dlevent_t*)*cfg->total_dlevents); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(dlevent_t*)*cfg->total_dlevents); 
 	} else
 		cfg->dlevent=NULL;
 
 	for(i=0; i<cfg->total_dlevents; i++) {
 		if(feof(instream)) break;
 		if((cfg->dlevent[i]=(dlevent_t *)malloc(sizeof(dlevent_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(dlevent_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(dlevent_t));
 		memset(cfg->dlevent[i],0,sizeof(dlevent_t));
 		get_str(cfg->dlevent[i]->ext,instream);
 		get_str(cfg->dlevent[i]->cmd,instream);
@@ -210,14 +210,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_prots) {
 		if((cfg->prot=(prot_t **)malloc(sizeof(prot_t *)*cfg->total_prots))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(prot_t*)*cfg->total_prots); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(prot_t*)*cfg->total_prots); 
 	} else
 		cfg->prot=NULL;
 
 	for(i=0;i<cfg->total_prots;i++) {
 		if(feof(instream)) break;
 		if((cfg->prot[i]=(prot_t *)malloc(sizeof(prot_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(prot_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(prot_t));
 		memset(cfg->prot[i],0,sizeof(prot_t));
 
 		get_int(cfg->prot[i]->mnemonic,instream);
@@ -245,7 +245,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->altpaths) {
 		if((cfg->altpath=(char **)malloc(sizeof(char *)*cfg->altpaths))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(char *)*cfg->altpaths); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(char *)*cfg->altpaths); 
 	} else
 		cfg->altpath=NULL;
 
@@ -257,7 +257,7 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 		backslash(str);
 		j=LEN_DIR+1;
 		if((cfg->altpath[i]=(char *)malloc(j))==NULL)
-			return allocerr(instream,error,offset,fname,j);
+			return allocerr(instream, error, maxerrlen,offset,fname,j);
 		memset(cfg->altpath[i],0,j);
 		strcpy(cfg->altpath[i],str);
 		for(j=0;j<8;j++)
@@ -274,14 +274,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_libs) {
 		if((cfg->lib=(lib_t **)malloc(sizeof(lib_t *)*cfg->total_libs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(lib_t *)*cfg->total_libs);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(lib_t *)*cfg->total_libs);
 	} else
 		cfg->lib=NULL;
 
 	for(i=0;i<cfg->total_libs;i++) {
 		if(feof(instream)) break;
 		if((cfg->lib[i]=(lib_t *)malloc(sizeof(lib_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(lib_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(lib_t));
 		memset(cfg->lib[i],0,sizeof(lib_t));
 		cfg->lib[i]->offline_dir=INVALID_DIR;
 
@@ -317,14 +317,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_dirs) {
 		if((cfg->dir=(dir_t **)malloc(sizeof(dir_t *)*(cfg->total_dirs+1)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(dir_t *)*(cfg->total_dirs+1));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(dir_t *)*(cfg->total_dirs+1));
 	} else
 		cfg->dir=NULL;
 
 	for(i=0;i<cfg->total_dirs;i++) {
 		if(feof(instream)) break;
 		if((cfg->dir[i]=(dir_t *)malloc(sizeof(dir_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(dir_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(dir_t));
 		memset(cfg->dir[i],0,sizeof(dir_t));
 
 		cfg->dir[i]->dirnum = i;
@@ -389,14 +389,14 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_txtsecs) {
 		if((cfg->txtsec=(txtsec_t **)malloc(sizeof(txtsec_t *)*cfg->total_txtsecs))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(txtsec_t *)*cfg->total_txtsecs); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(txtsec_t *)*cfg->total_txtsecs); 
 	} else
 		cfg->txtsec=NULL;
 
 	for(i=0;i<cfg->total_txtsecs;i++) {
 		if(feof(instream)) break;
 		if((cfg->txtsec[i]=(txtsec_t *)malloc(sizeof(txtsec_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(txtsec_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(txtsec_t));
 		memset(cfg->txtsec[i],0,sizeof(txtsec_t));
 
 		get_str(cfg->txtsec[i]->name,instream);
@@ -416,18 +416,18 @@ BOOL read_file_cfg(scfg_t* cfg, char* error)
 /****************************************************************************/
 /* Reads in XTRN.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
+BOOL read_xtrn_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	str[MAX_PATH+1],fname[13],c;
+	char	str[MAX_PATH+1],c;
 	short	i,j;
 	int16_t	n;
 	long	offset=0;
 	FILE	*instream;
 
-	strcpy(fname,"xtrn.cnf");
-	sprintf(str,"%s%s",cfg->ctrl_dir,fname);
+	const char* fname = "xtrn.cnf";
+	SAFEPRINTF2(str,"%s%s",cfg->ctrl_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen,"%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE); 
 	}
 
@@ -439,14 +439,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_swaps) {
 		if((cfg->swap=(swap_t **)malloc(sizeof(swap_t *)*cfg->total_swaps))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(swap_t *)*cfg->total_swaps); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(swap_t *)*cfg->total_swaps); 
 	} else
 		cfg->swap=NULL;
 
 	for(i=0;i<cfg->total_swaps;i++) {
 		if(feof(instream)) break;
 		if((cfg->swap[i]=(swap_t *)malloc(sizeof(swap_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(swap_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(swap_t));
 		get_str(cfg->swap[i]->cmd,instream); 
 	}
 	cfg->total_swaps=i;
@@ -459,14 +459,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_xedits) {
 		if((cfg->xedit=(xedit_t **)malloc(sizeof(xedit_t *)*cfg->total_xedits))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xedit_t *)*cfg->total_xedits); 
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xedit_t *)*cfg->total_xedits); 
 	} else
 		cfg->xedit=NULL;
 
 	for(i=0;i<cfg->total_xedits;i++) {
 		if(feof(instream)) break;
 		if((cfg->xedit[i]=(xedit_t *)malloc(sizeof(xedit_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xedit_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xedit_t));
 		memset(cfg->xedit[i],0,sizeof(xedit_t));
 
 		get_str(cfg->xedit[i]->name,instream);
@@ -499,14 +499,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 	if(cfg->total_xtrnsecs) {
 		if((cfg->xtrnsec=(xtrnsec_t **)malloc(sizeof(xtrnsec_t *)*cfg->total_xtrnsecs))
 			==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xtrnsec_t *)*cfg->total_xtrnsecs);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xtrnsec_t *)*cfg->total_xtrnsecs);
 	} else
 		cfg->xtrnsec=NULL;
 
 	for(i=0;i<cfg->total_xtrnsecs;i++) {
 		if(feof(instream)) break;
 		if((cfg->xtrnsec[i]=(xtrnsec_t *)malloc(sizeof(xtrnsec_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xtrnsec_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xtrnsec_t));
 		memset(cfg->xtrnsec[i],0,sizeof(xtrnsec_t));
 
 		get_str(cfg->xtrnsec[i]->name,instream);
@@ -528,14 +528,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_xtrns) {
 		if((cfg->xtrn=(xtrn_t **)malloc(sizeof(xtrn_t *)*cfg->total_xtrns))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xtrn_t *)*cfg->total_xtrns);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xtrn_t *)*cfg->total_xtrns);
 	} else
 		cfg->xtrn=NULL;
 
 	for(i=0;i<cfg->total_xtrns;i++) {
 		if(feof(instream)) break;
 		if((cfg->xtrn[i]=(xtrn_t *)malloc(sizeof(xtrn_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(xtrn_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(xtrn_t));
 		memset(cfg->xtrn[i],0,sizeof(xtrn_t));
 
 		get_int(cfg->xtrn[i]->sec,instream);
@@ -569,14 +569,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_events) {
 		if((cfg->event=(event_t **)malloc(sizeof(event_t *)*cfg->total_events))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(event_t *)*cfg->total_events);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(event_t *)*cfg->total_events);
 	} else
 		cfg->event=NULL;
 
 	for(i=0;i<cfg->total_events;i++) {
 		if(feof(instream)) break;
 		if((cfg->event[i]=(event_t *)malloc(sizeof(event_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(event_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(event_t));
 		memset(cfg->event[i],0,sizeof(event_t));
 
 		get_str(cfg->event[i]->code,instream);
@@ -610,14 +610,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_natvpgms) {
 		if((cfg->natvpgm=(natvpgm_t **)malloc(sizeof(natvpgm_t *)*cfg->total_natvpgms))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(natvpgm_t *)*cfg->total_natvpgms);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(natvpgm_t *)*cfg->total_natvpgms);
 	} else
 		cfg->natvpgm=NULL;
 
 	for(i=0;i<cfg->total_natvpgms;i++) {
 		if(feof(instream)) break;
 		if((cfg->natvpgm[i]=(natvpgm_t *)malloc(sizeof(natvpgm_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(natvpgm_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(natvpgm_t));
 		get_str(cfg->natvpgm[i]->name,instream);
 		cfg->natvpgm[i]->misc=0; 
 	}
@@ -635,14 +635,14 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_hotkeys) {
 		if((cfg->hotkey=(hotkey_t **)malloc(sizeof(hotkey_t *)*cfg->total_hotkeys))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(hotkey_t *)*cfg->total_hotkeys);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(hotkey_t *)*cfg->total_hotkeys);
 	} else
 		cfg->hotkey=NULL;
 
 	for(i=0;i<cfg->total_hotkeys;i++) {
 		if(feof(instream)) break;
 		if((cfg->hotkey[i]=(hotkey_t *)malloc(sizeof(hotkey_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(hotkey_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(hotkey_t));
 		memset(cfg->hotkey[i],0,sizeof(hotkey_t));
 
 		get_int(cfg->hotkey[i]->key,instream);
@@ -665,18 +665,18 @@ BOOL read_xtrn_cfg(scfg_t* cfg, char* error)
 /****************************************************************************/
 /* Reads in CHAT.CNF and initializes the associated variables				*/
 /****************************************************************************/
-BOOL read_chat_cfg(scfg_t* cfg, char* error)
+BOOL read_chat_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 {
-	char	str[MAX_PATH+1],fname[13];
+	char	str[MAX_PATH+1];
 	short	i,j;
 	int16_t	n;
 	long	offset=0;
 	FILE	*instream;
 
-	strcpy(fname,"chat.cnf");
-	sprintf(str,"%s%s",cfg->ctrl_dir,fname);
+	const char* fname = "chat.cnf";
+	SAFEPRINTF2(str,"%s%s",cfg->ctrl_dir,fname);
 	if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
-		sprintf(error,"%d (%s) opening %s",errno,STRERROR(errno),str);
+		safe_snprintf(error, maxerrlen,"%d (%s) opening %s",errno,STRERROR(errno),str);
 		return(FALSE);
 	}
 
@@ -688,14 +688,14 @@ BOOL read_chat_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_gurus) {
 		if((cfg->guru=(guru_t **)malloc(sizeof(guru_t *)*cfg->total_gurus))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(guru_t *)*cfg->total_gurus);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(guru_t *)*cfg->total_gurus);
 	} else
 		cfg->guru=NULL;
 
 	for(i=0;i<cfg->total_gurus;i++) {
 		if(feof(instream)) break;
 		if((cfg->guru[i]=(guru_t *)malloc(sizeof(guru_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(guru_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(guru_t));
 		memset(cfg->guru[i],0,sizeof(guru_t));
 
 		get_str(cfg->guru[i]->name,instream);
@@ -718,14 +718,14 @@ BOOL read_chat_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_actsets) {
 		if((cfg->actset=(actset_t **)malloc(sizeof(actset_t *)*cfg->total_actsets))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(actset_t *)*cfg->total_actsets);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(actset_t *)*cfg->total_actsets);
 	} else
 		cfg->actset=NULL;
 
 	for(i=0;i<cfg->total_actsets;i++) {
 		if(feof(instream)) break;
 		if((cfg->actset[i]=(actset_t *)malloc(sizeof(actset_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(actset_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(actset_t));
 		get_str(cfg->actset[i]->name,instream);
 	}
 	cfg->total_actsets=i;
@@ -740,14 +740,14 @@ BOOL read_chat_cfg(scfg_t* cfg, char* error)
 	if(cfg->total_chatacts) {
 		if((cfg->chatact=(chatact_t **)malloc(sizeof(chatact_t *)*cfg->total_chatacts))
 			==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(chatact_t *)*cfg->total_chatacts);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(chatact_t *)*cfg->total_chatacts);
 	} else
 		cfg->chatact=NULL;
 
 	for(i=0;i<cfg->total_chatacts;i++) {
 		if(feof(instream)) break;
 		if((cfg->chatact[i]=(chatact_t *)malloc(sizeof(chatact_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(chatact_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(chatact_t));
 		memset(cfg->chatact[i],0,sizeof(chatact_t));
 
 		get_int(cfg->chatact[i]->actset,instream);
@@ -768,14 +768,14 @@ BOOL read_chat_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_chans) {
 		if((cfg->chan=(chan_t **)malloc(sizeof(chan_t *)*cfg->total_chans))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(chan_t *)*cfg->total_chans);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(chan_t *)*cfg->total_chans);
 	} else
 		cfg->chan=NULL;
 
 	for(i=0;i<cfg->total_chans;i++) {
 		if(feof(instream)) break;
 		if((cfg->chan[i]=(chan_t *)malloc(sizeof(chan_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(chan_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(chan_t));
 		memset(cfg->chan[i],0,sizeof(chan_t));
 
 		get_int(cfg->chan[i]->actset,instream);
@@ -803,14 +803,14 @@ BOOL read_chat_cfg(scfg_t* cfg, char* error)
 
 	if(cfg->total_pages) {
 		if((cfg->page=(page_t **)malloc(sizeof(page_t *)*cfg->total_pages))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(page_t *)*cfg->total_pages);
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(page_t *)*cfg->total_pages);
 	} else
 		cfg->page=NULL;
 
 	for(i=0;i<cfg->total_pages;i++) {
 		if(feof(instream)) break;
 		if((cfg->page[i]=(page_t *)malloc(sizeof(page_t)))==NULL)
-			return allocerr(instream,error,offset,fname,sizeof(page_t));
+			return allocerr(instream, error, maxerrlen,offset,fname,sizeof(page_t));
 		memset(cfg->page[i],0,sizeof(page_t));
 
 		get_str(cfg->page[i]->cmd,instream);
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 8f99438eb9c8af4c5ca6317735d03f011908bfd4..af6a86fccbf846620083a379103e33992769784c 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1805,7 +1805,7 @@ void DLLCALL services_thread(void* arg)
 		lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
 		scfg.size=sizeof(scfg);
 		SAFECOPY(error,UNKNOWN_LOAD_ERROR);
-		if(!load_cfg(&scfg, text, TRUE, error)) {
+		if(!load_cfg(&scfg, text, TRUE, error, sizeof(error))) {
 			lprintf(LOG_CRIT,"!ERROR %s",error);
 			lprintf(LOG_CRIT,"!Failed to load configuration files");
 			cleanup(1);
diff --git a/src/sbbs3/smbactiv.c b/src/sbbs3/smbactiv.c
index 055fc32d2cc13c02a4965db4268c0bf8c8b7139a..8954266f4b70ca18e6eae183f492a1c153f657ef 100644
--- a/src/sbbs3/smbactiv.c
+++ b/src/sbbs3/smbactiv.c
@@ -109,7 +109,7 @@ int main(int argc, char **argv)
 	cfg.size=sizeof(cfg);
 	SAFECOPY(cfg.ctrl_dir,p);
 
-	if(!load_cfg(&cfg,NULL,TRUE,str)) {
+	if(!load_cfg(&cfg,NULL,TRUE,str, sizeof(str))) {
 		fprintf(stderr,"!ERROR loading configuration files: %s\n",str);
 		return(1);
 	}
diff --git a/src/sbbs3/uedit/uedit.c b/src/sbbs3/uedit/uedit.c
index 6cf2fa35422d6c3efe35c202588414d1d6dfe13d..e7b4c8eadcae988950e34f0f96ba15de7601e245 100644
--- a/src/sbbs3/uedit/uedit.c
+++ b/src/sbbs3/uedit/uedit.c
@@ -1945,7 +1945,7 @@ int main(int argc, char** argv)  {
     memset(&cfg,0,sizeof(cfg));
 	cfg.size=sizeof(cfg);
 	SAFECOPY(cfg.ctrl_dir,bbs_startup.ctrl_dir);
-	if(!load_cfg(&cfg, NULL, TRUE, str)) {
+	if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		printf("ERROR! %s\n",str);
 		exit(1);
 	}
diff --git a/src/sbbs3/umonitor/umonitor.c b/src/sbbs3/umonitor/umonitor.c
index 917e31b88d6d6925d30474b062aac2da646094ff..190f4d66e243a0c077dce872a552a59e5fd670e6 100644
--- a/src/sbbs3/umonitor/umonitor.c
+++ b/src/sbbs3/umonitor/umonitor.c
@@ -892,7 +892,7 @@ int main(int argc, char** argv)  {
 	memset(&cfg,0,sizeof(cfg));
 	cfg.size=sizeof(cfg);
 	SAFECOPY(cfg.ctrl_dir,bbs_startup.ctrl_dir);
-	if(!load_cfg(&cfg, NULL, TRUE, str)) {
+	if(!load_cfg(&cfg, NULL, TRUE, str, sizeof(str))) {
 		printf("ERROR! %s\n",str);
 		exit(1);
 	}
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index f34f9879d9d1eb5b0d589d54b387032d3eceb53e..200f070763962730d4e09ff8f115a003984abbaa 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -7005,7 +7005,7 @@ void DLLCALL web_server(void* arg)
 		lprintf(LOG_INFO,"Loading configuration files from %s", scfg.ctrl_dir);
 		scfg.size=sizeof(scfg);
 		SAFECOPY(logstr,UNKNOWN_LOAD_ERROR);
-		if(!load_cfg(&scfg, text, TRUE, logstr)) {
+		if(!load_cfg(&scfg, text, TRUE, logstr, sizeof(logstr))) {
 			lprintf(LOG_CRIT,"!ERROR %s",logstr);
 			lprintf(LOG_CRIT,"!FAILED to load configuration files");
 			cleanup(1);
diff --git a/src/xpdev/genwrap.h b/src/xpdev/genwrap.h
index 787514c0c1af9a2c42fb50917e98f2562df9857d..1b643f7d075c211f4f2efc5f9e55fc8449fd18c7 100644
--- a/src/xpdev/genwrap.h
+++ b/src/xpdev/genwrap.h
@@ -272,11 +272,7 @@ DLLEXPORT char*		DLLCALL truncsp_lines(char* str);
 /* Truncate new-line chars off end of string */
 DLLEXPORT char*		DLLCALL truncnl(char* str);
 
-#if defined(__unix__)
-	#define STRERROR(x)		strerror(x)
-#else
-	#define STRERROR(x)		truncsp(strerror(x))
-#endif
+#define STRERROR(x)		strerror(x)
 
 /* Re-entrant version of strerror() */
 DLLEXPORT char*		DLLCALL safe_strerror(int errnum, char* buf, size_t buflen);