From 0fa6774aa3e30ee07ba15cc52f602a86fc4196ca Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 2 Jan 2003 04:30:19 +0000
Subject: [PATCH] Fixed bug in external() on NT-based oses, now that the Win32
 pthread_mutex implementation uses CriticalSections, it would lock the
 input_thread by leaving (releasing) the critical section when it didn't own
 it.

---
 src/sbbs3/xtrn.cpp | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 25f7dfc9d3..80641ce632 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -253,6 +253,7 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
     bool	was_online=true;
 	bool	rio_abortable_save;
 	bool	use_pipes=false;	// NT-compatible console redirection
+	bool	input_thread_mutex_locked=false;
 	uint	i;
     time_t	hungup=0;
 	HANDLE	vxd=INVALID_HANDLE_VALUE;
@@ -555,8 +556,10 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 		fclose(fp);
 
 		/* not temporary */
-		if(!(mode&EX_INR)) 
+		if(!(mode&EX_INR)) {
 			pthread_mutex_lock(&input_thread_mutex);
+			input_thread_mutex_locked=true;
+		}
 	}
 
     if(!CreateProcess(
@@ -572,7 +575,7 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 		&process_info  	// pointer to PROCESS_INFORMATION
 		)) {
 		XTRN_CLEANUP;
-		if(native && !(mode&EX_OFFLINE))
+		if(input_thread_mutex_locked)
 			pthread_mutex_unlock(&input_thread_mutex);
 		SetLastError(last_error);	/* Restore LastError */
         errormsg(WHERE, ERR_EXEC, realcmdline, mode);
@@ -921,7 +924,8 @@ int sbbs_t::external(char* cmdline, long mode, char* startup_dir)
 		if(native) {
 			ulong l=0;
 			ioctlsocket(client_socket, FIONBIO, &l);
-			pthread_mutex_unlock(&input_thread_mutex);
+			if(input_thread_mutex_locked)
+				pthread_mutex_unlock(&input_thread_mutex);
 		}
 
 		curatr=~0;			// Can't guarantee current attributes
-- 
GitLab