Shut down the connection in all "fatal" error cases.

This commit is contained in:
Jamey Sharp 2006-09-15 01:51:05 -07:00
parent 79e3227022
commit 2c8b5994b3
3 changed files with 32 additions and 1 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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;
}