Possible pipe(2) bug
Mon Aug 9 18:03:00 GMT 2010
On Mon, Aug 09, 2010 at 07:01PM +0200, Christopher Faylor wrote:
> On Mon, Aug 09, 2010 at 03:00:03AM +0200, Bert Belder wrote:
> >I think the pipe(2) implementation may have a bug.
> >The pipe function creates a pipe and returns two file descriptors
> >(which are just numbers), one for reading and one for writing.
> >sometimes (but rarely) two subsequent calls to the pipe function
> >returns the same file descriptor twice. That is normal when a file
> >descriptor 'number' is re-used after being closed first, but
> >it is wrong. To demonstrate the problem I wrote a simple program
> >(attached as test.c) that does the following:
> >1. Create three pipes, so we get 6 file descriptors
> >2. (dump the FD's we got)
> >3. Close 3 of the 6 file descriptors
> >4. (Dump the FD's that were closed)
> >5. Repeat steps 1-4 a 100 times
> >The first three rounds give sound results:
> >? ??0 opened: pipe1=(3, 4), pipe2=(5, 6), pipe3=(7, 8)
> >? ??0 closed: pipe1=3, pipe2=6, pipe3=8
> >? ??1 opened: pipe1=(3, 6), pipe2=(8, 9), pipe3=(10, 11)
> >? ??1 closed: pipe1=3, pipe2=9, pipe3=11
> >? ??2 opened: pipe1=(3, 9), pipe2=(11, 12), pipe3=(13, 14)
> >? ??2 closed: pipe1=3, pipe2=12, pipe3=14
> >??? ...
> >As can be seen the FD's that were closed are re-used next round.
> Perfectly fine.
> >But then suddenly at round 94...
> >??? 93 opened: pipe1=(3, 282), pipe2=(284, 285), pipe3=(286, 287)
> >??? 93 closed: pipe1=3, pipe2=285, pipe3=287
> >??? 94 opened: pipe1=(3, 285), pipe2=(287, 288), pipe3=(287, 289) ?<-
> >File descriptor 287 is issued twice!
> >I think this is a bug. It actually causes problems under certain
> >circumstances when running a Cygwin build of nodejs
> >(http://nodejs.org). Or am I just doing something stupid?
> Nope. It was a very long-standing Cygwin bug. The error occurred
> Cygwin extended the size of its fd table. When that happened the the
> internal information for the fd of the  element to the pipe() call
> would never be filled out. If you attempted to use it you'd probably
> get an EBADF. And, since cygwin thought it wasn't used it would
> it to your program again. It's hard to believe that this hasn't shown
> up before.
> This should be fixed in the next snapshot, which is building now.
An EBADF error followed by a crash was actually the problem I originally
Using the latest snapshot DLL indeed solves my problem, thanks for
Problem reports: http://cygwin.com/problems.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin