summaryrefslogtreecommitdiff
path: root/src/xcb_in.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xcb_in.c')
-rw-r--r--src/xcb_in.c18
1 files changed, 17 insertions, 1 deletions
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;