untrusted comment: verify with openbsd-75-base.pub
RWRGj1pRpprAfuVJSqbSOOuQnqycij2YoIlRJhPOtdnrn15xEg/G3MqEkJNshcGe4NVHMFfxeHGanpQu6xBRMm2iypfU98ddCAE=

OpenBSD 7.5 errata 001, April 8, 2024:

Fix multiple heap buffer overread and data leakage in the X11 server
Xi extension and use after free in the Render extention.
CVE-2024-31080 CVE-2024-31081 CVE-2024-31083

Apply by doing:
   signify -Vep /etc/signify/openbsd-75-base.pub -x 001_xserver.patch.sig \
       -m - | (cd /usr/xenocara && patch -p0)

And then rebuild and install the X server:
   cd /usr/xenocara/xserver
   make -f Makefile.bsd-wrapper obj
   make -f Makefile.bsd-wrapper build

Index: xserver/Xi/xipassivegrab.c
===================================================================
RCS file: /cvs/xenocara/xserver/Xi/xipassivegrab.c,v
diff -u -p -r1.13 xipassivegrab.c
--- xserver/Xi/xipassivegrab.c  14 Dec 2022 10:29:00 -0000      1.13
+++ xserver/Xi/xipassivegrab.c  29 Mar 2024 22:52:09 -0000
@@ -247,9 +247,18 @@ ProcXIPassiveGrabDevice(ClientPtr client
        }
    }

-    WriteReplyToClient(client, sizeof(rep), &rep);
-    if (rep.num_modifiers)
-        WriteToClient(client, rep.length * 4, modifiers_failed);
+    if (client->swapped) {
+        /* save the value before SRepXIPassiveGrabDevice swaps it */
+        uint32_t length = rep.length;
+        WriteReplyToClient(client, sizeof(rep), &rep);
+        if (length)
+            WriteToClient(client, length * 4, modifiers_failed);
+    }
+    else {
+        WriteReplyToClient(client, sizeof(rep), &rep);
+        if (rep.num_modifiers)
+            WriteToClient(client, rep.length * 4, modifiers_failed);
+    }

 out:
    free(modifiers_failed);
Index: xserver/Xi/xiselectev.c
===================================================================
RCS file: /cvs/xenocara/xserver/Xi/xiselectev.c,v
diff -u -p -r1.9 xiselectev.c
--- xserver/Xi/xiselectev.c     11 Nov 2021 09:03:02 -0000      1.9
+++ xserver/Xi/xiselectev.c     29 Mar 2024 22:52:09 -0000
@@ -418,10 +418,21 @@ ProcXIGetSelectedEvents(ClientPtr client
        }
    }

-    WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
+    if (client->swapped) {
+        /* save the value before SRepXIGetSelectedEvents swaps it */
+        uint32_t length = reply.length;

-    if (reply.num_masks)
-        WriteToClient(client, reply.length * 4, buffer);
+        WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
+
+        if (length)
+            WriteToClient(client, length * 4, buffer);
+    }
+    else {
+        WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
+
+        if (reply.num_masks)
+            WriteToClient(client, reply.length * 4, buffer);
+    }

    free(buffer);
    return Success;
Index: xserver/render/glyph.c
===================================================================
RCS file: /cvs/xenocara/xserver/render/glyph.c,v
diff -u -p -r1.12 glyph.c
--- xserver/render/glyph.c      27 Jul 2019 07:57:25 -0000      1.12
+++ xserver/render/glyph.c      29 Mar 2024 22:52:09 -0000
@@ -245,10 +245,11 @@ FreeGlyphPicture(GlyphPtr glyph)
    }
}

-static void
+void
FreeGlyph(GlyphPtr glyph, int format)
{
    CheckDuplicates(&globalGlyphs[format], "FreeGlyph");
+    BUG_RETURN(glyph->refcnt == 0);
    if (--glyph->refcnt == 0) {
        GlyphRefPtr gr;
        int i;
@@ -354,7 +355,7 @@ AllocateGlyph(xGlyphInfo * gi, int fdept
    glyph = (GlyphPtr) malloc(size);
    if (!glyph)
        return 0;
-    glyph->refcnt = 0;
+    glyph->refcnt = 1;
    glyph->size = size + sizeof(xGlyphInfo);
    glyph->info = *gi;
    dixInitPrivates(glyph, (char *) glyph + head_size, PRIVATE_GLYPH);
Index: xserver/render/glyphstr.h
===================================================================
RCS file: /cvs/xenocara/xserver/render/glyphstr.h,v
diff -u -p -r1.9 glyphstr.h
--- xserver/render/glyphstr.h   29 May 2016 12:02:40 -0000      1.9
+++ xserver/render/glyphstr.h   29 Mar 2024 22:52:09 -0000
@@ -109,6 +109,8 @@ extern GlyphPtr FindGlyph(GlyphSetPtr gl

extern GlyphPtr AllocateGlyph(xGlyphInfo * gi, int format);

+extern void FreeGlyph(GlyphPtr glyph, int format);
+
extern Bool
 ResizeGlyphSet(GlyphSetPtr glyphSet, CARD32 change);

Index: xserver/render/render.c
===================================================================
RCS file: /cvs/xenocara/xserver/render/render.c,v
diff -u -p -r1.26 render.c
--- xserver/render/render.c     20 Feb 2022 17:41:35 -0000      1.26
+++ xserver/render/render.c     29 Mar 2024 22:52:10 -0000
@@ -1076,6 +1076,7 @@ ProcRenderAddGlyphs(ClientPtr client)

        if (glyph_new->glyph && glyph_new->glyph != DeletedGlyph) {
            glyph_new->found = TRUE;
+            ++glyph_new->glyph->refcnt;
        }
        else {
            GlyphPtr glyph;
@@ -1168,8 +1169,10 @@ ProcRenderAddGlyphs(ClientPtr client)
        err = BadAlloc;
        goto bail;
    }
-    for (i = 0; i < nglyphs; i++)
+    for (i = 0; i < nglyphs; i++) {
        AddGlyph(glyphSet, glyphs[i].glyph, glyphs[i].id);
+        FreeGlyph(glyphs[i].glyph, glyphSet->fdepth);
+    }

    if (glyphsBase != glyphsLocal)
        free(glyphsBase);
@@ -1179,9 +1182,13 @@ ProcRenderAddGlyphs(ClientPtr client)
        FreePicture((void *) pSrc, 0);
    if (pSrcPix)
        FreeScratchPixmapHeader(pSrcPix);
-    for (i = 0; i < nglyphs; i++)
-        if (glyphs[i].glyph && !glyphs[i].found)
-            free(glyphs[i].glyph);
+    for (i = 0; i < nglyphs; i++) {
+        if (glyphs[i].glyph) {
+            --glyphs[i].glyph->refcnt;
+            if (!glyphs[i].found)
+                free(glyphs[i].glyph);
+        }
+    }
    if (glyphsBase != glyphsLocal)
        free(glyphsBase);
    return err;