From 27adb21b22d63b5ea6777595cb61e8bb20967225 Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Debian Linux)" <rob@synchro.net>
Date: Wed, 1 Jan 2025 03:42:43 -0800
Subject: [PATCH] Insure FILE_RETRY_DELAY before lock retries

---
 src/sbbs3/getnode.cpp |  6 ++++--
 src/sbbs3/putnode.cpp | 14 +++++++-------
 src/sbbs3/userdat.c   |  3 ++-
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp
index 475e59fda4..0d2eda66d5 100644
--- a/src/sbbs3/getnode.cpp
+++ b/src/sbbs3/getnode.cpp
@@ -56,6 +56,8 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit)
 		utime(str,NULL);		/* NFS fix... utime() forces a cache refresh */
 #endif
 	for(count=0;count<LOOP_NODEDAB;count++) {
+		if(count > 0)
+			FILE_RETRY_DELAY(count + 1);
 		if(lockit && lock(nodefile, nodedatoffset(number), sizeof(node_t))!=0) {
 			unlock(nodefile, nodedatoffset(number), sizeof(node_t));
 			continue;
@@ -67,7 +69,6 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit)
 			if(rd==sizeof(node_t))
 				break;
 		}
-		FILE_RETRY_DELAY(count + 1);
 	}
 	if(!lockit && cfg.node_misc&NM_CLOSENODEDAB) {
 		close(nodefile);
@@ -289,6 +290,8 @@ bool sbbs_t::getnodeext(uint number, char *ext)
 
 	number--;   /* make zero based */
 	for(count=0;count<LOOP_NODEDAB;count++) {
+		if(count > 0)
+			FILE_RETRY_DELAY(count + 1);
 		if(lock(node_ext,(long)number*128L,128)!=0)
 			continue;
 		lseek(node_ext,(long)number*128L,SEEK_SET);
@@ -296,7 +299,6 @@ bool sbbs_t::getnodeext(uint number, char *ext)
 		unlock(node_ext,(long)number*128L,128);
 		if(rd==128)
 			break;
-		FILE_RETRY_DELAY(count + 1);
 	}
 	close(node_ext);
 	node_ext=-1;
diff --git a/src/sbbs3/putnode.cpp b/src/sbbs3/putnode.cpp
index 4ebb40427a..8f579bc5a1 100644
--- a/src/sbbs3/putnode.cpp
+++ b/src/sbbs3/putnode.cpp
@@ -118,12 +118,12 @@ bool sbbs_t::putnodeext(uint number, char *ext)
 	}
 	for(count=0;count<LOOP_NODEDAB;count++) {
 		lseek(node_ext,(long)number*128L,SEEK_SET);
-		if(lock(node_ext,(long)number*128L,128)==-1) 
-			continue; 
-		wr=write(node_ext,ext,128);
-		unlock(node_ext,(long)number*128L,128);
-		if(wr==128)
-			break;
+		if(lock(node_ext,(long)number*128L,128) == 0) {
+			wr=write(node_ext,ext,128);
+			unlock(node_ext,(long)number*128L,128);
+			if(wr==128)
+				break;
+		}
 		FILE_RETRY_DELAY(count + 1);
 	}
 	close(node_ext);
@@ -132,7 +132,7 @@ bool sbbs_t::putnodeext(uint number, char *ext)
 	if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) {
 		snprintf(str, sizeof str, "NODE.EXB (node %d) COLLISION - Count: %d"
 			,number+1, count);
-		logline(LOG_NOTICE,"!!",str); 
+		logline(LOG_NOTICE,"!!",str);
 	}
 	if(count==LOOP_NODEDAB) {
 		errormsg(WHERE,ERR_WRITE,"NODE.EXB",number+1);
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 42c6ab0a83..a714487664 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1149,6 +1149,8 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp)
 	int result = USER_SIZE_ERROR;
 	if(filelength(file)>=(long)(number*sizeof(node_t))) {
 		for(count=0;count<LOOP_NODEDAB;count++) {
+			if(count > 0)
+				FILE_RETRY_DELAY(count + 1);
 			if(!seeknodedat(file, number)) {
 				result = USER_SEEK_ERROR;
 				continue;
@@ -1166,7 +1168,6 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp)
 				result = USER_SUCCESS;
 				break;
 			}
-			FILE_RETRY_DELAY(count + 1);
 		}
 	}
 
-- 
GitLab