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

View File

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

View File

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