Module Name: xsrc Committed By: martin Date: Sun Nov 3 15:52:50 UTC 2024
Modified Files: xsrc/external/mit/xorg-server/dist/Xi [netbsd-9]: exevents.c xichangehierarchy.c xipassivegrab.c xiquerypointer.c xiselectev.c xsrc/external/mit/xorg-server/dist/dix [netbsd-9]: devices.c enterleave.c xsrc/external/mit/xorg-server/dist/glx [netbsd-9]: glxcmds.c xsrc/external/mit/xorg-server/dist/randr [netbsd-9]: rrproperty.c rrproviderproperty.c xsrc/external/mit/xorg-server/dist/xkb [netbsd-9]: xkb.c Log Message: Apply patch, requested by mrg in ticket #1916: xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c xsrc/external/mit/xorg-server/dist/dix/devices.c xsrc/external/mit/xorg-server/dist/dix/enterleave.c xsrc/external/mit/xorg-server/dist/glx/glxcmds.c xsrc/external/mit/xorg-server/dist/randr/rrproperty.c xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c xsrc/external/mit/xorg-server/dist/xkb/xkb.c Update xorg-server to have various missing CVE fixes: CVE-2023-6377, CVE-2023-6478, CVE-2023-6816, CVE-2024-0229, CVE-2024-0408, CVE-2024-21885, CVE-2024-21886, CVE-2024-31080, CVE-2024-31081, CVE-2024-9632 To generate a diff of this commit: cvs rdiff -u -r1.1.1.9.2.1 -r1.1.1.9.2.2 \ xsrc/external/mit/xorg-server/dist/Xi/exevents.c cvs rdiff -u -r1.5 -r1.5.2.1 \ xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c cvs rdiff -u -r1.4.2.1 -r1.4.2.2 \ xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c cvs rdiff -u -r1.4 -r1.4.2.1 \ xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c \ xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c cvs rdiff -u -r1.10 -r1.10.2.1 \ xsrc/external/mit/xorg-server/dist/dix/devices.c cvs rdiff -u -r1.6 -r1.6.2.1 \ xsrc/external/mit/xorg-server/dist/dix/enterleave.c cvs rdiff -u -r1.12 -r1.12.2.1 \ xsrc/external/mit/xorg-server/dist/glx/glxcmds.c cvs rdiff -u -r1.1.1.6.2.1 -r1.1.1.6.2.2 \ xsrc/external/mit/xorg-server/dist/randr/rrproperty.c cvs rdiff -u -r1.1.1.1 -r1.1.1.1.4.1 \ xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c cvs rdiff -u -r1.4.2.2 -r1.4.2.3 xsrc/external/mit/xorg-server/dist/xkb/xkb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xorg-server/dist/Xi/exevents.c diff -u xsrc/external/mit/xorg-server/dist/Xi/exevents.c:1.1.1.9.2.1 xsrc/external/mit/xorg-server/dist/Xi/exevents.c:1.1.1.9.2.2 --- xsrc/external/mit/xorg-server/dist/Xi/exevents.c:1.1.1.9.2.1 Tue Feb 14 16:01:05 2023 +++ xsrc/external/mit/xorg-server/dist/Xi/exevents.c Sun Nov 3 15:52:49 2024 @@ -567,13 +567,13 @@ DeepCopyPointerClasses(DeviceIntPtr from } if (from->button->xkb_acts) { - if (!to->button->xkb_acts) { - to->button->xkb_acts = calloc(1, sizeof(XkbAction)); - if (!to->button->xkb_acts) - FatalError("[Xi] not enough memory for xkb_acts.\n"); - } + size_t maxbuttons = max(to->button->numButtons, from->button->numButtons); + to->button->xkb_acts = xnfreallocarray(to->button->xkb_acts, + maxbuttons, + sizeof(XkbAction)); + memset(to->button->xkb_acts, 0, maxbuttons * sizeof(XkbAction)); memcpy(to->button->xkb_acts, from->button->xkb_acts, - sizeof(XkbAction)); + from->button->numButtons * sizeof(XkbAction)); } else { free(to->button->xkb_acts); to->button->xkb_acts = NULL; Index: xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c diff -u xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.5 xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.5.2.1 --- xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c:1.5 Mon Dec 31 09:49:58 2018 +++ xsrc/external/mit/xorg-server/dist/Xi/xichangehierarchy.c Sun Nov 3 15:52:49 2024 @@ -416,6 +416,11 @@ ProcXIChangeHierarchy(ClientPtr client) size_t len; /* length of data remaining in request */ int rc = Success; int flags[MAXDEVICES] = { 0 }; + enum { + NO_CHANGE, + FLUSH, + CHANGED, + } changes = NO_CHANGE; REQUEST(xXIChangeHierarchyReq); REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq); @@ -465,8 +470,9 @@ ProcXIChangeHierarchy(ClientPtr client) rc = add_master(client, c, flags); if (rc != Success) goto unwind; - } + changes = FLUSH; break; + } case XIRemoveMaster: { xXIRemoveMasterInfo *r = (xXIRemoveMasterInfo *) any; @@ -475,8 +481,9 @@ ProcXIChangeHierarchy(ClientPtr client) rc = remove_master(client, r, flags); if (rc != Success) goto unwind; - } + changes = FLUSH; break; + } case XIDetachSlave: { xXIDetachSlaveInfo *c = (xXIDetachSlaveInfo *) any; @@ -485,8 +492,9 @@ ProcXIChangeHierarchy(ClientPtr client) rc = detach_slave(client, c, flags); if (rc != Success) goto unwind; - } + changes = CHANGED; break; + } case XIAttachSlave: { xXIAttachSlaveInfo *c = (xXIAttachSlaveInfo *) any; @@ -495,16 +503,25 @@ ProcXIChangeHierarchy(ClientPtr client) rc = attach_slave(client, c, flags); if (rc != Success) goto unwind; + changes = CHANGED; + break; } + default: break; } + if (changes == FLUSH) { + XISendDeviceHierarchyEvent(flags); + memset(flags, 0, sizeof(flags)); + changes = NO_CHANGE; + } + len -= any->length * 4; any = (xXIAnyHierarchyChangeInfo *) ((char *) any + any->length * 4); } unwind: - - XISendDeviceHierarchyEvent(flags); + if (changes != NO_CHANGE) + XISendDeviceHierarchyEvent(flags); return rc; } Index: xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c diff -u xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.4.2.1 xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.4.2.2 --- xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c:1.4.2.1 Mon Jan 23 13:40:00 2023 +++ xsrc/external/mit/xorg-server/dist/Xi/xipassivegrab.c Sun Nov 3 15:52:49 2024 @@ -93,6 +93,7 @@ ProcXIPassiveGrabDevice(ClientPtr client GrabParameters param; void *tmp; int mask_len; + uint32_t length; REQUEST(xXIPassiveGrabDeviceReq); REQUEST_FIXED_SIZE(xXIPassiveGrabDeviceReq, @@ -234,9 +235,11 @@ ProcXIPassiveGrabDevice(ClientPtr client } } + /* save the value before SRepXIPassiveGrabDevice swaps it */ + length = rep.length; WriteReplyToClient(client, sizeof(rep), &rep); if (rep.num_modifiers) - WriteToClient(client, rep.length * 4, modifiers_failed); + WriteToClient(client, length * 4, modifiers_failed); out: free(modifiers_failed); Index: xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c diff -u xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c:1.4 xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c:1.4.2.1 --- xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c:1.4 Mon Dec 31 09:49:58 2018 +++ xsrc/external/mit/xorg-server/dist/Xi/xiquerypointer.c Sun Nov 3 15:52:49 2024 @@ -149,8 +149,7 @@ ProcXIQueryPointer(ClientPtr client) if (pDev->button) { int i; - rep.buttons_len = - bytes_to_int32(bits_to_bytes(pDev->button->numButtons)); + rep.buttons_len = bytes_to_int32(bits_to_bytes(256)); /* button map up to 255 */ rep.length += rep.buttons_len; buttons = calloc(rep.buttons_len, 4); if (!buttons) Index: xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c diff -u xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c:1.4 xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c:1.4.2.1 --- xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c:1.4 Mon Dec 31 09:49:58 2018 +++ xsrc/external/mit/xorg-server/dist/Xi/xiselectev.c Sun Nov 3 15:52:49 2024 @@ -297,6 +297,7 @@ ProcXIGetSelectedEvents(ClientPtr client InputClientsPtr others = NULL; xXIEventMask *evmask = NULL; DeviceIntPtr dev; + uint32_t length; REQUEST(xXIGetSelectedEventsReq); REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq); @@ -366,10 +367,12 @@ ProcXIGetSelectedEvents(ClientPtr client } } + /* save the value before SRepXIGetSelectedEvents swaps it */ + length = reply.length; WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply); if (reply.num_masks) - WriteToClient(client, reply.length * 4, buffer); + WriteToClient(client, length * 4, buffer); free(buffer); return Success; Index: xsrc/external/mit/xorg-server/dist/dix/devices.c diff -u xsrc/external/mit/xorg-server/dist/dix/devices.c:1.10 xsrc/external/mit/xorg-server/dist/dix/devices.c:1.10.2.1 --- xsrc/external/mit/xorg-server/dist/dix/devices.c:1.10 Mon Dec 31 09:49:59 2018 +++ xsrc/external/mit/xorg-server/dist/dix/devices.c Sun Nov 3 15:52:49 2024 @@ -451,14 +451,20 @@ DisableDevice(DeviceIntPtr dev, BOOL sen { DeviceIntPtr *prev, other; BOOL enabled; + BOOL dev_in_devices_list = FALSE; int flags[MAXDEVICES] = { 0 }; if (!dev->enabled) return TRUE; - for (prev = &inputInfo.devices; - *prev && (*prev != dev); prev = &(*prev)->next); - if (*prev != dev) + for (other = inputInfo.devices; other; other = other->next) { + if (other == dev) { + dev_in_devices_list = TRUE; + break; + } + } + + if (!dev_in_devices_list) return FALSE; TouchEndPhysicallyActiveTouches(dev); @@ -474,6 +480,13 @@ DisableDevice(DeviceIntPtr dev, BOOL sen flags[other->id] |= XISlaveDetached; } } + + for (other = inputInfo.off_devices; other; other = other->next) { + if (!IsMaster(other) && GetMaster(other, MASTER_ATTACHED) == dev) { + AttachDevice(NULL, other, NULL); + flags[other->id] |= XISlaveDetached; + } + } } else { for (other = inputInfo.devices; other; other = other->next) { @@ -508,6 +521,9 @@ DisableDevice(DeviceIntPtr dev, BOOL sen LeaveWindow(dev); SetFocusOut(dev); + for (prev = &inputInfo.devices; + *prev && (*prev != dev); prev = &(*prev)->next); + *prev = dev->next; dev->next = inputInfo.off_devices; inputInfo.off_devices = dev; @@ -1067,6 +1083,11 @@ CloseDownDevices(void) dev->master = NULL; } + for (dev = inputInfo.off_devices; dev; dev = dev->next) { + if (!IsMaster(dev) && !IsFloating(dev)) + dev->master = NULL; + } + CloseDeviceList(&inputInfo.devices); CloseDeviceList(&inputInfo.off_devices); @@ -2499,6 +2520,8 @@ RecalculateMasterButtons(DeviceIntPtr sl if (master->button && master->button->numButtons != maxbuttons) { int i; + int last_num_buttons = master->button->numButtons; + DeviceChangedEvent event = { .header = ET_Internal, .type = ET_DeviceChanged, @@ -2509,6 +2532,14 @@ RecalculateMasterButtons(DeviceIntPtr sl }; master->button->numButtons = maxbuttons; + if (last_num_buttons < maxbuttons) { + master->button->xkb_acts = xnfreallocarray(master->button->xkb_acts, + maxbuttons, + sizeof(XkbAction)); + memset(&master->button->xkb_acts[last_num_buttons], + 0, + (maxbuttons - last_num_buttons) * sizeof(XkbAction)); + } memcpy(&event.buttons.names, master->button->labels, maxbuttons * sizeof(Atom)); Index: xsrc/external/mit/xorg-server/dist/dix/enterleave.c diff -u xsrc/external/mit/xorg-server/dist/dix/enterleave.c:1.6 xsrc/external/mit/xorg-server/dist/dix/enterleave.c:1.6.2.1 --- xsrc/external/mit/xorg-server/dist/dix/enterleave.c:1.6 Mon Dec 31 09:49:59 2018 +++ xsrc/external/mit/xorg-server/dist/dix/enterleave.c Sun Nov 3 15:52:49 2024 @@ -675,7 +675,8 @@ static void DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win) { int evcount = 1; - deviceStateNotify *ev, *sev; + deviceStateNotify sev[6 + (MAX_VALUATORS + 2)/3]; + deviceStateNotify *ev; deviceKeyStateNotify *kev; deviceButtonStateNotify *bev; @@ -714,7 +715,7 @@ DeliverStateNotifyEvent(DeviceIntPtr dev } } - sev = ev = xallocarray(evcount, sizeof(xEvent)); + ev = sev; FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first); if (b != NULL) { @@ -770,7 +771,6 @@ DeliverStateNotifyEvent(DeviceIntPtr dev DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount, DeviceStateNotifyMask, NullGrab); - free(sev); } void @@ -784,8 +784,9 @@ DeviceFocusEvent(DeviceIntPtr dev, int t mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER); - /* XI 2 event */ - btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0; + /* XI 2 event contains the logical button map - maps are CARD8 + * so we need 256 bits for the possibly maximum mapping */ + btlen = (mouse->button) ? bits_to_bytes(256) : 0; btlen = bytes_to_int32(btlen); len = sizeof(xXIFocusInEvent) + btlen * 4; Index: xsrc/external/mit/xorg-server/dist/glx/glxcmds.c diff -u xsrc/external/mit/xorg-server/dist/glx/glxcmds.c:1.12 xsrc/external/mit/xorg-server/dist/glx/glxcmds.c:1.12.2.1 --- xsrc/external/mit/xorg-server/dist/glx/glxcmds.c:1.12 Fri May 31 18:01:11 2019 +++ xsrc/external/mit/xorg-server/dist/glx/glxcmds.c Sun Nov 3 15:52:49 2024 @@ -48,6 +48,7 @@ #include "indirect_util.h" #include "protocol-versions.h" #include "glxvndabi.h" +#include "xace.h" static char GLXServerVendorName[] = "SGI"; @@ -1373,6 +1374,13 @@ DoCreatePbuffer(ClientPtr client, int sc if (!pPixmap) return BadAlloc; + err = XaceHook(XACE_RESOURCE_ACCESS, client, glxDrawableId, RT_PIXMAP, + pPixmap, RT_NONE, NULL, DixCreateAccess); + if (err != Success) { + (*pGlxScreen->pScreen->DestroyPixmap) (pPixmap); + return err; + } + /* Assign the pixmap the same id as the pbuffer and add it as a * resource so it and the DRI2 drawable will be reclaimed when the * pbuffer is destroyed. */ Index: xsrc/external/mit/xorg-server/dist/randr/rrproperty.c diff -u xsrc/external/mit/xorg-server/dist/randr/rrproperty.c:1.1.1.6.2.1 xsrc/external/mit/xorg-server/dist/randr/rrproperty.c:1.1.1.6.2.2 --- xsrc/external/mit/xorg-server/dist/randr/rrproperty.c:1.1.1.6.2.1 Sun Oct 29 16:45:23 2023 +++ xsrc/external/mit/xorg-server/dist/randr/rrproperty.c Sun Nov 3 15:52:49 2024 @@ -530,7 +530,7 @@ ProcRRChangeOutputProperty(ClientPtr cli char format, mode; unsigned long len; int sizeInBytes; - int totalSize; + uint64_t totalSize; int err; REQUEST_AT_LEAST_SIZE(xRRChangeOutputPropertyReq); Index: xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c diff -u xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c:1.1.1.1 xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c:1.1.1.1.4.1 --- xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c:1.1.1.1 Wed Aug 10 07:44:32 2016 +++ xsrc/external/mit/xorg-server/dist/randr/rrproviderproperty.c Sun Nov 3 15:52:49 2024 @@ -498,7 +498,7 @@ ProcRRChangeProviderProperty(ClientPtr c char format, mode; unsigned long len; int sizeInBytes; - int totalSize; + uint64_t totalSize; int err; REQUEST_AT_LEAST_SIZE(xRRChangeProviderPropertyReq); Index: xsrc/external/mit/xorg-server/dist/xkb/xkb.c diff -u xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.4.2.2 xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.4.2.3 --- xsrc/external/mit/xorg-server/dist/xkb/xkb.c:1.4.2.2 Fri Jul 15 17:17:02 2022 +++ xsrc/external/mit/xorg-server/dist/xkb/xkb.c Sun Nov 3 15:52:50 2024 @@ -2987,13 +2987,13 @@ _XkbSetCompatMap(ClientPtr client, Devic XkbSymInterpretPtr sym; unsigned int skipped = 0; - if ((unsigned) (req->firstSI + req->nSI) > compat->num_si) { - compat->num_si = req->firstSI + req->nSI; + if ((unsigned) (req->firstSI + req->nSI) > compat->size_si) { + compat->num_si = compat->size_si = req->firstSI + req->nSI; compat->sym_interpret = reallocarray(compat->sym_interpret, - compat->num_si, + compat->size_si, sizeof(XkbSymInterpretRec)); if (!compat->sym_interpret) { - compat->num_si = 0; + compat->num_si = compat->size_si = 0; return BadAlloc; } }