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;
             }
         }

Reply via email to