projects
/
free-sw
/
xcb
/
libxcb
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix off-by-one error that kept the last byte(s) of the output queue from being used.
[free-sw/xcb/libxcb]
/
src
/
xcb_in.c
diff --git
a/src/xcb_in.c
b/src/xcb_in.c
index
cacb220
..
ea851c7
100644
(file)
--- a/
src/xcb_in.c
+++ b/
src/xcb_in.c
@@
-91,6
+91,8
@@
static int read_packet(XCBConnection *c)
c->in.request_read = (lastread & 0xffff0000) | genrep.sequence;
if(c->in.request_read < lastread)
c->in.request_read += 0x10000;
c->in.request_read = (lastread & 0xffff0000) | genrep.sequence;
if(c->in.request_read < lastread)
c->in.request_read += 0x10000;
+ if(c->in.request_read > c->in.request_expected)
+ c->in.request_expected = c->in.request_read;
if(c->in.request_read != lastread)
{
if(c->in.request_read != lastread)
{
@@
-133,7
+135,7
@@
static int read_packet(XCBConnection *c)
length += genrep.length * 4;
}
length += genrep.length * 4;
}
- buf = malloc(length);
+ buf = malloc(length
+ (genrep.response_type == 1 ? 0 : sizeof(CARD32))
);
if(!buf)
return 0;
if(_xcb_in_read_block(c, buf, length) <= 0)
if(!buf)
return 0;
if(_xcb_in_read_block(c, buf, length) <= 0)
@@
-141,6
+143,14
@@
static int read_packet(XCBConnection *c)
free(buf);
return 0;
}
free(buf);
return 0;
}
+ if(pend && (pend->flags & XCB_REQUEST_DISCARD_REPLY))
+ {
+ free(buf);
+ return 1;
+ }
+
+ if(genrep.response_type != 1)
+ ((XCBGenericEvent *) buf)->full_sequence = c->in.request_read;
/* reply, or checked error */
if(genrep.response_type == 1 || (genrep.response_type == 0 && pend && (pend->flags & XCB_REQUEST_CHECKED)))
/* reply, or checked error */
if(genrep.response_type == 1 || (genrep.response_type == 0 && pend && (pend->flags & XCB_REQUEST_CHECKED)))
@@
-235,6
+245,10
@@
void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **
if(e)
*e = 0;
if(e)
*e = 0;
+ /* If an error occurred when issuing the request, fail immediately. */
+ if(!request)
+ return 0;
+
pthread_mutex_lock(&c->iolock);
/* If this request has not been written yet, write it. */
pthread_mutex_lock(&c->iolock);
/* If this request has not been written yet, write it. */