diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 25f7dfc9d33cdf1d0253e24899d0a8163d69e5f3..80641ce632bdbbe259a728fc7a62e0abda426f95 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