Shut down the connection in all "fatal" error cases.
This commit is contained in:
parent
79e3227022
commit
2c8b5994b3
|
@ -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)
|
||||
|
|
18
src/xcb_in.c
18
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue