Shut down the connection in all "fatal" error cases.
authorJamey Sharp <jamey@minilop.net>
Fri, 15 Sep 2006 08:51:05 +0000 (01:51 -0700)
committerJamey Sharp <jamey@minilop.net>
Thu, 21 Sep 2006 22:35:01 +0000 (15:35 -0700)
src/xcb_conn.c
src/xcb_in.c
src/xcb_out.c

index 29d91f4..de1f6e4 100644 (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)
index d8b608a..2ac1e52 100644 (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;
index 91f7ea1..1b68215 100644 (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;
 }