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