Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2022-01-14 13:35:12 +0300
committerTakashi Yano <takashi.yano@nifty.ne.jp>2022-01-14 17:11:20 +0300
commit909ed837ccb932ea70f71cc41891fa2c8143133f (patch)
tree1ec642af25b68216dd65b2516e0f4c00fbabcc93
parentbff4594b089c10c41edcdd14c2682d19f36b3241 (diff)
Cygwin: pty: Fix race issue between closing and opening master.
- If the from_master is closed before cleaning up other pipes, such as from_slave_nat, the same pty may be allocated and pty master may try to open the pipe which is not closed yet, and it will fail. This patch fixes the issue.
-rw-r--r--winsup/cygwin/fhandler_tty.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 1ae4edd63..7bef6958c 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -2146,8 +2146,6 @@ fhandler_pty_master::close ()
if (!ForceCloseHandle (from_master_nat))
termios_printf ("error closing from_master_nat %p, %E", from_master_nat);
- if (!ForceCloseHandle (from_master))
- termios_printf ("error closing from_master %p, %E", from_master);
if (!ForceCloseHandle (to_master_nat))
termios_printf ("error closing to_master_nat %p, %E", to_master_nat);
from_master_nat = to_master_nat = NULL;
@@ -2156,7 +2154,7 @@ fhandler_pty_master::close ()
from_slave_nat = NULL;
if (!ForceCloseHandle (to_master))
termios_printf ("error closing to_master %p, %E", to_master);
- to_master = from_master = NULL;
+ to_master = NULL;
ForceCloseHandle (echo_r);
ForceCloseHandle (echo_w);
echo_r = echo_w = NULL;
@@ -2171,6 +2169,12 @@ fhandler_pty_master::close ()
termios_printf ("CloseHandle (input_available_event<%p>), %E",
input_available_event);
+ /* The from_master must be closed last so that the same pty is not
+ allocated before cleaning up the other corresponding instances. */
+ if (!ForceCloseHandle (from_master))
+ termios_printf ("error closing from_master %p, %E", from_master);
+ from_master = NULL;
+
return 0;
}
@@ -3069,12 +3073,14 @@ err:
close_maybe (output_mutex);
close_maybe (input_mutex);
close_maybe (from_master_nat);
- close_maybe (from_master);
close_maybe (to_master_nat);
close_maybe (to_master);
close_maybe (echo_r);
close_maybe (echo_w);
close_maybe (master_ctl);
+ /* The from_master must be closed last so that the same pty is not
+ allocated before cleaning up the other corresponding instances. */
+ close_maybe (from_master);
termios_printf ("pty%d open failed - failed to create %s", unit, errstr);
return false;
}