No subject

Wed Jul 7 15:13:13 PDT 2010

I can fix up the test case, but given this was behaviour that used to work
(presumably) with Xlib a decision needs to be made whether to explicitly
change this behaviour. quite frankly, I don't care either way.


> When you pass a file descriptor to some one else, you give up reading,
> writing and closing it as far as I can tell. Standard functions such as
> fdopen() or fdopendir() make similar assumptions.
> > XFlush(3), libxcb causes a hang in the client.
> > 
> > XFlush(3) eventually calls _xcb_out_send() with has the following loop:
> >     while(ret && *count)
> >         ret = _xcb_conn_wait(c, &c->out.cond, vector, count);
> > 
> > _xcb_conn_wait(), if built with USE_POLL gets the POLLNVAL error. It only
> > checks for POLLIN and POLLOUT though, ignoring the error.  Return value
> is
> > 1, count is unmodified, leaving us with an endless loop and the a client
> > hang.
> POLLNVAL fails to solve the "file descriptor closed behind your back"
> problem in at least two cases. First, it cannot cope if the poll() system
> call was entered before the file descriptor is closed; the process will
> deadlock instead. Second, it will obviously give totally incorrect results
> if the file descriptor is reallocated to something else in the mean time,
> with close() + something or with dup2(). 
> > This patch adds a check for POLLNVAL in the polling code. If POLLNVAL is
> > detected, _xcb_conn_shutdown() is invoked an and error is returned. This
> > matches the behaviour if select(2) is used instead of poll(2). select(2)
> > returns -1 and EBADF for an already closed file descriptor.
> That looks much like a wrong design choice to me. poll() should always be
> checked for POLLERR and POLLHUP, but POLLNVAL is best ignored in my
> opinion. Alternatively, you can write a big "YOUR PROGRAM SUCK" message and
> abort() because this is definitely a bug.

More information about the Xcb mailing list