From 800abeee3baf3f2306ad79679387218c4aa6e1e9 Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Windows 11)" <rob@synchro.net>
Date: Sun, 3 Nov 2024 17:06:27 -0800
Subject: [PATCH] Check return value of putuserdat() and log any errors

Trying to get to the bottom of user.tab corruption (issue #797).
---
 src/sbbs3/answer.cpp   |  2 +-
 src/sbbs3/ftpsrvr.c    |  4 +++-
 src/sbbs3/logon.cpp    |  2 +-
 src/sbbs3/sbbs.h       |  1 +
 src/sbbs3/services.c   |  7 ++++++-
 src/sbbs3/useredit.cpp | 17 ++++++++++++++---
 src/sbbs3/websrvr.c    |  7 ++++++-
 7 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/sbbs3/answer.cpp b/src/sbbs3/answer.cpp
index d2952b9e85..34ea886662 100644
--- a/src/sbbs3/answer.cpp
+++ b/src/sbbs3/answer.cpp
@@ -452,7 +452,7 @@ bool sbbs_t::answer()
 								SAFECOPY(useron.ipaddr, client_ipaddr);
 								SAFECOPY(useron.comp, client_name);
 								useron.logons++;
-								putuserdat(&cfg,&useron);
+								putuserdat(&useron);
 								snprintf(str, sizeof(str), "(%04u)  %-25s  %s Logon"
 									,useron.number, useron.alias, client.protocol);
 								logline("++", str);
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 8115f23d81..216752481f 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -2628,7 +2628,9 @@ static void ctrl_thread(void* arg)
 			SAFECOPY(user.comp,host_name);
 			SAFECOPY(user.ipaddr,host_ip);
 			user.logontime=(time32_t)logintime;
-			putuserdat(&scfg, &user);
+			if((result = putuserdat(&scfg, &user)) != 0)
+				lprintf(LOG_ERR, "%04d [%s] <%s> !Error %d writing user data for user #%d"
+					,sock, host_ip, user.alias, result, user.number);
 			mqtt_user_login(&mqtt, &client);
 
 #ifdef _WIN32
diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index 711fbefbd0..41721fe5c9 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -443,7 +443,7 @@ bool sbbs_t::logon()
 	SAFECOPY(useron.ipaddr, client_ipaddr);
 	SAFECOPY(useron.comp, client_name);
 	useron.logons++;
-	putuserdat(&cfg,&useron);
+	putuserdat(&useron);
 	getmsgptrs();
 	sys_status|=SS_USERON;          /* moved from further down */
 
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 3ef8e9faf6..a3e705215d 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1322,6 +1322,7 @@ public:
 	int		searchdn(char *search,int usernum);
 	void	maindflts(user_t* user);
 	void	purgeuser(int usernumber);
+	void	putuserdat(user_t*);
 
 	/* ver.cpp */
 	void	ver(void);
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 2cff60677b..bc8a3540ac 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -475,7 +475,12 @@ js_login(JSContext *cx, uintN argc, jsval *arglist)
 		client->user.ltoday++;
 	}
 
-	putuserdat(&scfg,&client->user);
+	int result = putuserdat(&scfg,&client->user);
+	if(result != 0) {
+		lprintf(LOG_ERR, "%04d %s !Error %d writing user data for user #%d"
+			,client->socket,client->service->protocol
+			,result, client->user.number);
+	}
 	if(client->subscan==NULL) {
 		client->subscan=(subscan_t*)calloc(scfg.total_subs, sizeof(subscan_t));
 		if(client->subscan==NULL)
diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp
index 768f8ad1b6..54b9fa17d3 100644
--- a/src/sbbs3/useredit.cpp
+++ b/src/sbbs3/useredit.cpp
@@ -78,7 +78,7 @@ void sbbs_t::useredit(int usernumber)
 		if(strcmp(str,tmp) && user.ltoday) {
 			user.ltoday=user.ttoday=user.ptoday=user.etoday=user.textra=0;
 			user.freecdt=cfg.level_freecdtperday[user.level];
-			putuserdat(&cfg,&user); 	/* Leave alone */
+			putuserdat(&user); 	/* Leave alone */
 		}
 		char user_pass[LEN_PASS + 1];
 		SAFECOPY(user_pass, user.pass);
@@ -494,7 +494,7 @@ void sbbs_t::useredit(int usernumber)
 					else
 						user.expire+=((long)cfg.val_expire[i]*24L*60L*60L); 
 				}
-				putuserdat(&cfg,&user);
+				putuserdat(&user);
 				break;
 			case 'W':
 				bputs(text[UeditPassword]);
@@ -516,7 +516,7 @@ void sbbs_t::useredit(int usernumber)
 					if((int)i>0) {
 						user.number=i;
 						putusername(&cfg,user.number,user.alias);
-						putuserdat(&cfg,&user); 
+						putuserdat(&user);
 					} 
 				}
 				break;
@@ -1170,3 +1170,14 @@ void sbbs_t::purgeuser(int usernumber)
 	putusername(&cfg,usernumber,nulstr);
 	putusermisc(usernumber, user.misc | DELETED);
 }
+
+/****************************************************************************/
+/* An error checking/logging wrapper for userdat.c putuserdat()				*/
+/****************************************************************************/
+void sbbs_t::putuserdat(user_t* user)
+{
+	int result = ::putuserdat(&cfg, user);
+	if(result != 0)
+		lprintf(LOG_ERR, "!Error %d writing user data for user #%d"
+			,result, user->number);
+}
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index f7fc816aeb..9783a8af95 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -1654,7 +1654,12 @@ void http_logon(http_session_t * session, user_t *usr)
 		SAFECOPY(session->user.comp, session->host_name);
 		SAFECOPY(session->user.ipaddr, session->host_ip);
 		session->user.logontime = (time32_t)session->logon_time;
-		putuserdat(&scfg, &session->user);
+		int result = putuserdat(&scfg, &session->user);
+		if(result != 0)
+			lprintf(LOG_ERR, "%04d %s [%s] <%s> !Error %d writing user data for user #%d"
+				,session->socket, session->client.protocol, session->host_ip
+				,session->username, session->user.number);
+
 	}
 	SAFECOPY(session->client.user, session->username);
 	session->client.usernum = session->user.number;
-- 
GitLab