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