[PATCH xserver] Fix id in error when resource does not exist
Peter Harris
pharris at opentext.com
Wed Sep 28 20:17:00 UTC 2016
Always set client->errorValue before returning an error.
Test program:
#include <stdio.h>
#include <xcb/xcb.h>
#include <xcb/xproto.h>
#define BAD_VALUE 0xFACE0FF
int main(int argc, char *argv[]) {
int screen = 0;
xcb_connection_t *c = xcb_connect(NULL, &screen);
if (!c) {
printf("Cannot connect\n");
return 1;
}
xcb_void_cookie_t tok = xcb_free_gc_checked(c, BAD_VALUE);
xcb_g_context_error_t *err = (xcb_g_context_error_t *)xcb_request_check(c, tok);
if (!err) {
printf("Unexpected request success\n");
return 1;
}
if (err->bad_value != BAD_VALUE) {
printf("Error: Got 0x%X, expected 0x%X\n", err->bad_value, BAD_VALUE);
return 1;
}
printf("Success! Got expected bad value of 0x%X\n", BAD_VALUE);
return 0;
}
---
I was confused for a while when a BadGC error report had the XID of a drawable
in it.
dix/resource.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dix/resource.c b/dix/resource.c
index ad71b24..68efd24 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -1220,11 +1220,13 @@ dixLookupResourceByType(void **result, XID id, RESTYPE rtype,
if (res->id == id && res->type == rtype)
break;
}
+ if (client) {
+ client->errorValue = id;
+ }
if (!res)
return resourceTypes[rtype & TypeMask].errorValue;
if (client) {
- client->errorValue = id;
cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
res->value, RT_NONE, NULL, mode);
if (cid == BadValue)
@@ -1253,11 +1255,13 @@ dixLookupResourceByClass(void **result, XID id, RESTYPE rclass,
if (res->id == id && (res->type & rclass))
break;
}
+ if (client) {
+ client->errorValue = id;
+ }
if (!res)
return BadValue;
if (client) {
- client->errorValue = id;
cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
res->value, RT_NONE, NULL, mode);
if (cid != Success)
--
2.7.4
More information about the xorg-devel
mailing list