[PATCH] Cygwin: pipe: Fix SSH hang with non-cygwin pipe reader
Takashi Yano
takashi.yano@nifty.ne.jp
Fri Jun 27 11:15:04 GMT 2025
On Fri, 27 Jun 2025 12:25:18 +0200 (CEST)
Johannes Schindelin wrote:
> Hi Takashi,
> Good explanation, thank you for improving your commit message writing
> skill.
Thanks.
> > Also, pipe_data_available() returns PDA_UNKNOWN rather than 1 when the
> > pipe space estimation fails so that select() and raw_write() can perform
> > appropriate fallback handling.
>
> This looks unrelated? Would this not rather be in a separate patch, to
> make it substantially easier to review for correctness?
I'll make a separate patch.
> P.S.: One thing that strikes me as immediately concerning is this part:
>
> > - if (avail < 1) /* error or pipe closed */
> > + if (avail == PDA_UNKNOWN && real_non_blocking_mode)
> > + avail = len1;
>
> That means that the next loop iteration will call `NtWriteFile()` with
> `len1` bytes (`len1` now being identical to `avail`), even if `len1` can
> be substantially larger than `PIPE_BUF` (in my tests, it got stuck at
> `len1 == 2097152` in some instances), which is highly likely to be
> undesirable.
I don't think so. avail = len1 is performed only when real_non_blocking_mode.
In real non blocking mode, we can call NtWriteFile() with larger data than
actual pipe space without blocking.
When you observed `len1 == 2097152`, perhaps avail was 1, I guess.
--
Takashi Yano <takashi.yano@nifty.ne.jp>
More information about the Cygwin-patches
mailing list