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