dix: set errorValue correctly when XID lookup fails in ChangeGCXIDs()

dixLookupResourceByType always overwrites the pointer passed in as the
first arg, so we shouldn't use the union it's in after that to get the
requested XID value to put in the errorValue.

Closes: #1857
Fixes: 2d7eb4a19 ("Pre-validate ChangeGC XIDs.")
Reported-by: Mouse <mouse@Rodents-Montreal.ORG>
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
(cherry picked from commit ac42c39145)
(cherry picked from commit 7f1050de78)

Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2151>
This commit is contained in:
Alan Coopersmith 2025-12-07 15:57:53 -08:00 committed by Marge Bot
parent ab16adb21a
commit c001e1330a

View file

@ -441,6 +441,7 @@ ChangeGCXIDs(ClientPtr client, GC * pGC, BITS32 mask, CARD32 *pC32)
vals[i].val = pC32[i];
for (i = 0; i < ARRAY_SIZE(xidfields); ++i) {
int offset, rc;
XID id;
if (!(mask & xidfields[i].mask))
continue;
@ -449,11 +450,13 @@ ChangeGCXIDs(ClientPtr client, GC * pGC, BITS32 mask, CARD32 *pC32)
vals[offset].ptr = NullPixmap;
continue;
}
rc = dixLookupResourceByType(&vals[offset].ptr, vals[offset].val,
/* save the id, since dixLookupResourceByType overwrites &vals[offset] */
id = vals[offset].val;
rc = dixLookupResourceByType(&vals[offset].ptr, id,
xidfields[i].type, client,
xidfields[i].access_mode);
if (rc != Success) {
client->errorValue = vals[offset].val;
client->errorValue = id;
return rc;
}
}