Cygwin: pty: Fix thread safety of readahead buffer handling in pty master.
commit3b4f6217c371cf70d5ec5137436cfa5892bb45e8
authorTakashi Yano <takashi.yano@nifty.ne.jp>
Fri, 4 Aug 2023 08:45:34 +0000 (4 17:45 +0900)
committerTakashi Yano <takashi.yano@nifty.ne.jp>
Fri, 4 Aug 2023 08:49:29 +0000 (4 17:49 +0900)
tree5b02f7f74808559ef59e53b6d29a719302290244
parentab78bd2d228027d0ac5a84bfc409444d3ce18948
Cygwin: pty: Fix thread safety of readahead buffer handling in pty 

Previously, though readahead buffer handling in pty master was not
fully thread-safe, accept_input() was called from peek_pipe() thread
in select.cc. This caused the problem reported in:
https://cygwin.com/pipermail/cygwin/2023-July/253984.html

The mechanism of the problem is:
1) accept_input() which is called from peek_pipe() thread calls
   eat_readahead(-1) before reading readahead buffer. This allows
   writing to the readahead buffer from another (main) thread.
2) The main thread calls fhandler_pty_master::write() just after
   eat_readahead(-1) was called and before reading the readahead
   buffer by accept_input() called from peek_pipe() thread. This
   overwrites the readahead buffer.
3) The read result from readahead buffer which was overwritten is
   sent to the slave.

This patch makes readahead buffer handling fully thread-safe using
input_mutex to resolve this issue.

Fixes: 7b03b0d8cee0 ("select.cc (peek_pipe): Call flush_to_slave whenever we're checking for a pty master.")
Reported-by: Thomas Wolff <towo@towo.net>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
winsup/cygwin/fhandler/pty.cc
winsup/cygwin/local_includes/fhandler.h