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; } Signed-off-by: Peter Harris <phar...@opentext.com> --- v2 changes: Add sign-off 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 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel