From: Daphne Pfister Date: Sun, 8 Sep 2013 20:25:11 +0000 (-0400) Subject: Fix poll() if POLLIN == ROLLRDNORM|POLLRDBAND X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1405d9fe4a6ddcae24585ba254389a4c4f4c8c9;p=free-sw%2Fxcb%2Flibxcb Fix poll() if POLLIN == ROLLRDNORM|POLLRDBAND It seems like POLLIN is specified as equivalent to POLLRDNORM | POLLRDBAND. Some systems (e.g. QNX and HP-UX) take this literaly and have POLLIN defined as the above bit combination. Other systems (e.g. Linux) have POLLIN as just a single bit. This means that if no out-of-band data is available (which should never be the case), the result of poll() will not fulfil (fd.revents & POLLIN) == POLLIN on QNX, because the POLLRDBAND bit is not set. In other words, even though poll() signaled that the fd is readable, xcb would not read from the file descriptor. Fix this by checking if any bits from POLLIN are set in the result of poll(), instead of all of them. (This change was independently done by seanb@qnx.com as well) Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=38001 Acked-by: Julien Cristau Signed-off-by: Uli Schlachter --- diff --git a/src/xcb_conn.c b/src/xcb_conn.c index 6a7a806..7dd25d3 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -443,14 +443,14 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec */ int may_read = c->in.reading == 1 || !count; #if USE_POLL - if(may_read && (fd.revents & POLLIN) == POLLIN) + if(may_read && (fd.revents & POLLIN) != 0) #else if(may_read && FD_ISSET(c->fd, &rfds)) #endif ret = ret && _xcb_in_read(c); #if USE_POLL - if((fd.revents & POLLOUT) == POLLOUT) + if((fd.revents & POLLOUT) != 0) #else if(FD_ISSET(c->fd, &wfds)) #endif