From 35785af326a906ecf43519a3815ff7058f4f7f6a Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Tue, 15 Sep 2020 00:07:53 -0700
Subject: [PATCH] Fix observed crash on a fresh install (no data/user.dat) on
 Windows XP

Apparently, calling close(-1) on WinXP will cause a crash. Don't do that.
Make closeuserdat() resilient to an un-open file descriptor and use it
instead of close().
---
 src/sbbs3/main.cpp  | 4 ++--
 src/sbbs3/str.cpp   | 2 +-
 src/sbbs3/userdat.c | 2 ++
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index dc20a334cd..f1b26382e5 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -2785,7 +2785,7 @@ void event_thread(void* arg)
 						sbbs->online=FALSE;
 					}
 				}
-				close(userfile);
+				closeuserdat(userfile);
 				lastprepack=(time32_t)now;
 				SAFEPRINTF(str,"%stime.dab",sbbs->cfg.ctrl_dir);
 				if((file=sbbs->nopen(str,O_WRONLY))==-1) {
@@ -4824,7 +4824,7 @@ void sbbs_t::daily_maint(void)
 			putuserrec(&cfg,user.number,U_MISC,8,ultoa(user.misc|DELETED,str,16));
 		}
 	}
-	close(userfile);
+	closeuserdat(userfile);
 
 	lputs(LOG_INFO,"DAILY: Purging deleted/expired e-mail");
 	SAFEPRINTF(smb.file,"%smail",cfg.data_dir);
diff --git a/src/sbbs3/str.cpp b/src/sbbs3/str.cpp
index 3200e3f67f..6607442ebf 100644
--- a/src/sbbs3/str.cpp
+++ b/src/sbbs3/str.cpp
@@ -111,7 +111,7 @@ void sbbs_t::userlist(long mode)
 		}
 		j++; 
 	}
-	close(userfile);
+	closeuserdat(userfile);
 	if(i<=k) {	/* aborted */
 		if(sort)
 			for(i=0;i<j;i++)
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 5b035417cd..c1c7837d6b 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -207,6 +207,8 @@ int openuserdat(scfg_t* cfg, BOOL for_modify)
 
 int closeuserdat(int file)
 {
+	if(file < 1)
+		return -1;
 	return close(file);
 }
 
-- 
GitLab