Cygwin: pty: Stop closing and recreating attach_mutex.
- Closing attach_mutex and recreating it causes the race issue between pty and console codes. With this patch, attach_mutex is created only once in a process which opens pty, and never closed in order to avoid this issue. Addresses: https://cygwin.com/pipermail/cygwin-developers/2021-December/012548.html
This commit is contained in:
parent
4f490c4cef
commit
3af461092e
|
@ -1881,6 +1881,9 @@ class fhandler_serial: public fhandler_base
|
||||||
#define release_output_mutex() \
|
#define release_output_mutex() \
|
||||||
__release_output_mutex (__PRETTY_FUNCTION__, __LINE__)
|
__release_output_mutex (__PRETTY_FUNCTION__, __LINE__)
|
||||||
|
|
||||||
|
DWORD acquire_attach_mutex (DWORD t);
|
||||||
|
void release_attach_mutex (void);
|
||||||
|
|
||||||
class tty;
|
class tty;
|
||||||
class tty_min;
|
class tty_min;
|
||||||
class fhandler_termios: public fhandler_base
|
class fhandler_termios: public fhandler_base
|
||||||
|
|
|
@ -56,25 +56,8 @@ fhandler_console::console_state NO_COPY *fhandler_console::shared_console_info;
|
||||||
|
|
||||||
bool NO_COPY fhandler_console::invisible_console;
|
bool NO_COPY fhandler_console::invisible_console;
|
||||||
|
|
||||||
/* Mutex for AttachConsole()/FreeConsole() in fhandler_tty.cc */
|
|
||||||
HANDLE attach_mutex;
|
|
||||||
|
|
||||||
extern DWORD mutex_timeout; /* defined in fhandler_termios.cc */
|
extern DWORD mutex_timeout; /* defined in fhandler_termios.cc */
|
||||||
|
|
||||||
static inline void
|
|
||||||
acquire_attach_mutex (DWORD t)
|
|
||||||
{
|
|
||||||
if (attach_mutex)
|
|
||||||
WaitForSingleObject (attach_mutex, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
release_attach_mutex ()
|
|
||||||
{
|
|
||||||
if (attach_mutex)
|
|
||||||
ReleaseMutex (attach_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* con_ra is shared in the same process.
|
/* con_ra is shared in the same process.
|
||||||
Only one console can exist in a process, therefore, static is suitable. */
|
Only one console can exist in a process, therefore, static is suitable. */
|
||||||
static struct fhandler_base::rabuf_t con_ra;
|
static struct fhandler_base::rabuf_t con_ra;
|
||||||
|
|
|
@ -58,8 +58,21 @@ struct pipe_reply {
|
||||||
DWORD error;
|
DWORD error;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern HANDLE attach_mutex; /* Defined in fhandler_console.cc */
|
HANDLE attach_mutex;
|
||||||
static LONG master_cnt = 0;
|
|
||||||
|
DWORD acquire_attach_mutex (DWORD t)
|
||||||
|
{
|
||||||
|
if (!attach_mutex)
|
||||||
|
return WAIT_OBJECT_0;
|
||||||
|
return WaitForSingleObject (attach_mutex, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_attach_mutex (void)
|
||||||
|
{
|
||||||
|
if (!attach_mutex)
|
||||||
|
return;
|
||||||
|
ReleaseMutex (attach_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
inline static bool pcon_pid_alive (DWORD pid);
|
inline static bool pcon_pid_alive (DWORD pid);
|
||||||
|
|
||||||
|
@ -523,13 +536,13 @@ fhandler_pty_master::accept_input ()
|
||||||
{
|
{
|
||||||
/* Slave attaches to a different console than master.
|
/* Slave attaches to a different console than master.
|
||||||
Therefore reattach here. */
|
Therefore reattach here. */
|
||||||
WaitForSingleObject (attach_mutex, mutex_timeout);
|
acquire_attach_mutex (mutex_timeout);
|
||||||
FreeConsole ();
|
FreeConsole ();
|
||||||
AttachConsole (target_pid);
|
AttachConsole (target_pid);
|
||||||
cp_to = GetConsoleCP ();
|
cp_to = GetConsoleCP ();
|
||||||
FreeConsole ();
|
FreeConsole ();
|
||||||
AttachConsole (resume_pid);
|
AttachConsole (resume_pid);
|
||||||
ReleaseMutex (attach_mutex);
|
release_attach_mutex ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cp_to = GetConsoleCP ();
|
cp_to = GetConsoleCP ();
|
||||||
|
@ -2111,8 +2124,6 @@ fhandler_pty_master::close ()
|
||||||
master_fwd_thread->detach ();
|
master_fwd_thread->detach ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (InterlockedDecrement (&master_cnt) == 0)
|
|
||||||
CloseHandle (attach_mutex);
|
|
||||||
|
|
||||||
/* Check if the last master handle has been closed. If so, set
|
/* Check if the last master handle has been closed. If so, set
|
||||||
input_available_event to wake up potentially waiting slaves. */
|
input_available_event to wake up potentially waiting slaves. */
|
||||||
|
@ -2838,13 +2849,13 @@ fhandler_pty_master::pty_master_fwd_thread (const master_fwd_thread_param_t *p)
|
||||||
{
|
{
|
||||||
/* Slave attaches to a different console than master.
|
/* Slave attaches to a different console than master.
|
||||||
Therefore reattach here. */
|
Therefore reattach here. */
|
||||||
WaitForSingleObject (attach_mutex, mutex_timeout);
|
acquire_attach_mutex (mutex_timeout);
|
||||||
FreeConsole ();
|
FreeConsole ();
|
||||||
AttachConsole (target_pid);
|
AttachConsole (target_pid);
|
||||||
cp_from = GetConsoleOutputCP ();
|
cp_from = GetConsoleOutputCP ();
|
||||||
FreeConsole ();
|
FreeConsole ();
|
||||||
AttachConsole (resume_pid);
|
AttachConsole (resume_pid);
|
||||||
ReleaseMutex (attach_mutex);
|
release_attach_mutex ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cp_from = GetConsoleOutputCP ();
|
cp_from = GetConsoleOutputCP ();
|
||||||
|
@ -2993,7 +3004,7 @@ fhandler_pty_master::setup ()
|
||||||
if (!(pcon_mutex = CreateMutex (&sa, FALSE, buf)))
|
if (!(pcon_mutex = CreateMutex (&sa, FALSE, buf)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (InterlockedIncrement (&master_cnt) == 1)
|
if (!attach_mutex)
|
||||||
attach_mutex = CreateMutex (&sa, FALSE, NULL);
|
attach_mutex = CreateMutex (&sa, FALSE, NULL);
|
||||||
|
|
||||||
/* Create master control pipe which allows the master to duplicate
|
/* Create master control pipe which allows the master to duplicate
|
||||||
|
@ -3057,7 +3068,6 @@ err:
|
||||||
close_maybe (input_available_event);
|
close_maybe (input_available_event);
|
||||||
close_maybe (output_mutex);
|
close_maybe (output_mutex);
|
||||||
close_maybe (input_mutex);
|
close_maybe (input_mutex);
|
||||||
close_maybe (attach_mutex);
|
|
||||||
close_maybe (from_master_nat);
|
close_maybe (from_master_nat);
|
||||||
close_maybe (from_master);
|
close_maybe (from_master);
|
||||||
close_maybe (to_master_nat);
|
close_maybe (to_master_nat);
|
||||||
|
|
|
@ -1095,22 +1095,6 @@ fhandler_fifo::select_except (select_stuff *ss)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern HANDLE attach_mutex; /* Defined in fhandler_console.cc */
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
acquire_attach_mutex (DWORD t)
|
|
||||||
{
|
|
||||||
if (attach_mutex)
|
|
||||||
WaitForSingleObject (attach_mutex, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
release_attach_mutex ()
|
|
||||||
{
|
|
||||||
if (attach_mutex)
|
|
||||||
ReleaseMutex (attach_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern DWORD mutex_timeout; /* defined in fhandler_termios.cc */
|
extern DWORD mutex_timeout; /* defined in fhandler_termios.cc */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue