diff options
-rw-r--r-- | src/xcb_conn.c | 6 | ||||
-rw-r--r-- | src/xcb_in.c | 18 | ||||
-rw-r--r-- | src/xcb_out.c | 9 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/xcb_conn.c b/src/xcb_conn.c index 29d91f4..de1f6e4 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -156,7 +156,10 @@ static int write_vec(XCBConnection *c, struct iovec **vector, int *count) if(n < 0 && errno == EAGAIN) return 1; if(n <= 0) + { + _xcb_conn_shutdown(c); return 0; + } for(; *count; --*count, ++*vector) { @@ -280,7 +283,10 @@ int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector ret = select(c->fd + 1, &rfds, &wfds, 0, 0); } while (ret == -1 && errno == EINTR); if (ret < 0) + { + _xcb_conn_shutdown(c); ret = 0; + } pthread_mutex_lock(&c->iolock); if(ret) diff --git a/src/xcb_in.c b/src/xcb_in.c index d8b608a..2ac1e52 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -142,7 +142,10 @@ static int read_packet(XCBConnection *c) buf = malloc(length + (genrep.response_type == XCBReply ? 0 : sizeof(CARD32))); if(!buf) + { + _xcb_conn_shutdown(c); return 0; + } if(_xcb_in_read_block(c, buf, length) <= 0) { free(buf); @@ -164,7 +167,10 @@ static int read_packet(XCBConnection *c) reader_list *reader; struct reply_list *cur = malloc(sizeof(struct reply_list)); if(!cur) + { + _xcb_conn_shutdown(c); return 0; + } cur->reply = buf; cur->next = 0; *c->in.current_reply_tail = cur; @@ -187,6 +193,7 @@ static int read_packet(XCBConnection *c) event = malloc(sizeof(struct event_list)); if(!event) { + _xcb_conn_shutdown(c); free(buf); return 0; } @@ -486,7 +493,10 @@ int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workaround pending_reply *pend = malloc(sizeof(pending_reply)); assert(workaround != WORKAROUND_NONE || flags != 0); if(!pend) + { + _xcb_conn_shutdown(c); return 0; + } pend->request = request; pend->workaround = workaround; pend->flags = flags; @@ -503,7 +513,10 @@ int _xcb_in_read(XCBConnection *c) c->in.queue_len += n; while(read_packet(c)) /* empty */; - return (n > 0) || (n < 0 && errno == EAGAIN); + if((n > 0) || (n < 0 && errno == EAGAIN)) + return 1; + _xcb_conn_shutdown(c); + return 0; } int _xcb_in_read_block(XCBConnection *c, void *buf, int len) @@ -520,7 +533,10 @@ int _xcb_in_read_block(XCBConnection *c, void *buf, int len) { int ret = read_block(c->fd, (char *) buf + done, len - done); if(ret <= 0) + { + _xcb_conn_shutdown(c); return ret; + } } return len; diff --git a/src/xcb_out.c b/src/xcb_out.c index 91f7ea1..1b68215 100644 --- a/src/xcb_out.c +++ b/src/xcb_out.c @@ -112,7 +112,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c { const XCBQueryExtensionRep *extension = XCBGetExtensionData(c, req->ext); if(!(extension && extension->present)) + { + _xcb_conn_shutdown(c); return 0; + } ((CARD8 *) vector[0].iov_base)[0] = extension->major_opcode; ((CARD8 *) vector[0].iov_base)[1] = req->opcode; } @@ -139,7 +142,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c longlen = 0; } else if(longlen > XCBGetMaximumRequestLength(c)) + { + _xcb_conn_shutdown(c); return 0; /* server can't take this; maybe need BIGREQUESTS? */ + } /* set the length field. */ ((CARD16 *) vector[0].iov_base)[1] = shortlen; @@ -197,7 +203,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c } if(!write_block(c, vector, veclen)) + { + _xcb_conn_shutdown(c); request = 0; + } pthread_mutex_unlock(&c->iolock); return request; } |