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)
|
if(n < 0 && errno == EAGAIN)
|
||||||
return 1;
|
return 1;
|
||||||
if(n <= 0)
|
if(n <= 0)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for(; *count; --*count, ++*vector)
|
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);
|
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
|
||||||
} while (ret == -1 && errno == EINTR);
|
} while (ret == -1 && errno == EINTR);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
}
|
||||||
pthread_mutex_lock(&c->iolock);
|
pthread_mutex_lock(&c->iolock);
|
||||||
|
|
||||||
if(ret)
|
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)));
|
buf = malloc(length + (genrep.response_type == XCBReply ? 0 : sizeof(CARD32)));
|
||||||
if(!buf)
|
if(!buf)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
if(_xcb_in_read_block(c, buf, length) <= 0)
|
if(_xcb_in_read_block(c, buf, length) <= 0)
|
||||||
{
|
{
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -164,7 +167,10 @@ static int read_packet(XCBConnection *c)
|
||||||
reader_list *reader;
|
reader_list *reader;
|
||||||
struct reply_list *cur = malloc(sizeof(struct reply_list));
|
struct reply_list *cur = malloc(sizeof(struct reply_list));
|
||||||
if(!cur)
|
if(!cur)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
cur->reply = buf;
|
cur->reply = buf;
|
||||||
cur->next = 0;
|
cur->next = 0;
|
||||||
*c->in.current_reply_tail = cur;
|
*c->in.current_reply_tail = cur;
|
||||||
|
@ -187,6 +193,7 @@ static int read_packet(XCBConnection *c)
|
||||||
event = malloc(sizeof(struct event_list));
|
event = malloc(sizeof(struct event_list));
|
||||||
if(!event)
|
if(!event)
|
||||||
{
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
free(buf);
|
free(buf);
|
||||||
return 0;
|
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));
|
pending_reply *pend = malloc(sizeof(pending_reply));
|
||||||
assert(workaround != WORKAROUND_NONE || flags != 0);
|
assert(workaround != WORKAROUND_NONE || flags != 0);
|
||||||
if(!pend)
|
if(!pend)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
pend->request = request;
|
pend->request = request;
|
||||||
pend->workaround = workaround;
|
pend->workaround = workaround;
|
||||||
pend->flags = flags;
|
pend->flags = flags;
|
||||||
|
@ -503,7 +513,10 @@ int _xcb_in_read(XCBConnection *c)
|
||||||
c->in.queue_len += n;
|
c->in.queue_len += n;
|
||||||
while(read_packet(c))
|
while(read_packet(c))
|
||||||
/* empty */;
|
/* 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)
|
int _xcb_in_read_block(XCBConnection *c, void *buf, int len)
|
||||||
|
@ -520,8 +533,11 @@ int _xcb_in_read_block(XCBConnection *c, void *buf, int len)
|
||||||
{
|
{
|
||||||
int ret = read_block(c->fd, (char *) buf + done, len - done);
|
int ret = read_block(c->fd, (char *) buf + done, len - done);
|
||||||
if(ret <= 0)
|
if(ret <= 0)
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,10 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c
|
||||||
{
|
{
|
||||||
const XCBQueryExtensionRep *extension = XCBGetExtensionData(c, req->ext);
|
const XCBQueryExtensionRep *extension = XCBGetExtensionData(c, req->ext);
|
||||||
if(!(extension && extension->present))
|
if(!(extension && extension->present))
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
((CARD8 *) vector[0].iov_base)[0] = extension->major_opcode;
|
((CARD8 *) vector[0].iov_base)[0] = extension->major_opcode;
|
||||||
((CARD8 *) vector[0].iov_base)[1] = req->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;
|
longlen = 0;
|
||||||
}
|
}
|
||||||
else if(longlen > XCBGetMaximumRequestLength(c))
|
else if(longlen > XCBGetMaximumRequestLength(c))
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
return 0; /* server can't take this; maybe need BIGREQUESTS? */
|
return 0; /* server can't take this; maybe need BIGREQUESTS? */
|
||||||
|
}
|
||||||
|
|
||||||
/* set the length field. */
|
/* set the length field. */
|
||||||
((CARD16 *) vector[0].iov_base)[1] = shortlen;
|
((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))
|
if(!write_block(c, vector, veclen))
|
||||||
|
{
|
||||||
|
_xcb_conn_shutdown(c);
|
||||||
request = 0;
|
request = 0;
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&c->iolock);
|
pthread_mutex_unlock(&c->iolock);
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue