cygwin 3.3.x: another problem that may be related to pipes
Takashi Yano
takashi.yano@nifty.ne.jp
Tue Nov 16 14:35:14 GMT 2021
On Tue, 16 Nov 2021 19:20:15 +0900
Takashi Yano wrote:
> On Tue, 16 Nov 2021 18:45:15 +0900
> Takashi Yano wrote:
> > Hi Ken,
> >
> > I noticed the following while fixing this issue.
> >
> > We now noticed that NtWriteFile() may return STATUS_PENDING
> > even in nonblocking mode.
> >
> > If NtWriteFile() returns STATUS_PENDING in nonblocking mode,
> > does not the following 'if' block in raw_write() refer to
> > uninitialized io.Information?
> >
> > while (len1 > 0)
> > {
> > status = NtWriteFile (get_handle (), evt, NULL, NULL, &io,
> > (PVOID) ptr, len1, NULL, NULL);
> > if (evt || !NT_SUCCESS (status) || io.Information > 0
> > || len <= PIPE_BUF)
> > break;
> > len1 >>= 1;
> > }
> >
> > 'evt' is false if we are in nonblocking mode.
> > '!NT_SUCCESS(status)' is false if status == STATUS_PENDING.
> > Then io.Information would be referred I think.
> >
> > Isn't this another bug in raw_write()?
> >
> > What should we do in this case? Should we do like:
> >
> > if (evt || !NT_SUCCESS (status) || status == STATUS_PENDING
> > || io.Information > 0 || len <= PIPE_BUF)
> >
> > ?
>
> Answer to myself.
>
> I think moving cygwait(evt, ...) before this 'if' block is the
> right thing.
>
> Right? If so, I will submit v3 patch.
I have just submitted v3 patch. Please have a look.
--
Takashi Yano <takashi.yano@nifty.ne.jp>
More information about the Cygwin-developers
mailing list