CVE fix for CVE-2025-26594, CVE-2025-26595, CVE-2025-26596, CVE-2025-26597, CVE-2025-26598, CVE-2025-26599, CVE-2025-26600, CVE-2025-26601
Resolves: https://issues.redhat.com/browse/RHEL-80201 Resolves: https://issues.redhat.com/browse/RHEL-80186 Resolves: https://issues.redhat.com/browse/RHEL-80188 Resolves: https://issues.redhat.com/browse/RHEL-80191 Resolves: https://issues.redhat.com/browse/RHEL-80192 Resolves: https://issues.redhat.com/browse/RHEL-80199 Resolves: https://issues.redhat.com/browse/RHEL-80198 Resolves: https://issues.redhat.com/browse/RHEL-80200
This commit is contained in:
parent
7e2489c02b
commit
820d90bbc5
55
0001-Cursor-Refuse-to-free-the-root-cursor.patch
Normal file
55
0001-Cursor-Refuse-to-free-the-root-cursor.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
From 42ec29c7fbf8dc797c369d5fe0e4f2e20725332b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Wed, 27 Nov 2024 11:27:05 +0100
|
||||||
|
Subject: [PATCH xserver 01/13] Cursor: Refuse to free the root cursor
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
If a cursor reference count drops to 0, the cursor is freed.
|
||||||
|
|
||||||
|
The root cursor however is referenced with a specific global variable,
|
||||||
|
and when the root cursor is freed, the global variable may still point
|
||||||
|
to freed memory.
|
||||||
|
|
||||||
|
Make sure to prevent the rootCursor from being explicitly freed by a
|
||||||
|
client.
|
||||||
|
|
||||||
|
CVE-2025-26594, ZDI-CAN-25544
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
v2: Explicitly forbid XFreeCursor() on the root cursor (Peter Hutterer
|
||||||
|
<peter.hutterer@who-t.net>)
|
||||||
|
v3: Return BadCursor instead of BadValue (Michel Dänzer
|
||||||
|
<michel@daenzer.net>)
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Suggested-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 01642f263f12becf803b19be4db95a4a83f94acc)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
dix/dispatch.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/dix/dispatch.c b/dix/dispatch.c
|
||||||
|
index a33bfaa9e..9654c207e 100644
|
||||||
|
--- a/dix/dispatch.c
|
||||||
|
+++ b/dix/dispatch.c
|
||||||
|
@@ -3039,6 +3039,10 @@ ProcFreeCursor(ClientPtr client)
|
||||||
|
rc = dixLookupResourceByType((void **) &pCursor, stuff->id, RT_CURSOR,
|
||||||
|
client, DixDestroyAccess);
|
||||||
|
if (rc == Success) {
|
||||||
|
+ if (pCursor == rootCursor) {
|
||||||
|
+ client->errorValue = stuff->id;
|
||||||
|
+ return BadCursor;
|
||||||
|
+ }
|
||||||
|
FreeResource(stuff->id, RT_NONE);
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
49
0002-dix-keep-a-ref-to-the-rootCursor.patch
Normal file
49
0002-dix-keep-a-ref-to-the-rootCursor.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From 9dc8beff846a127cc8754212fb654e5f66dacff4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
Date: Wed, 4 Dec 2024 15:49:43 +1000
|
||||||
|
Subject: [PATCH xserver 02/13] dix: keep a ref to the rootCursor
|
||||||
|
|
||||||
|
CreateCursor returns a cursor with refcount 1 - that refcount is used by
|
||||||
|
the resource system, any caller needs to call RefCursor to get their own
|
||||||
|
reference. That happens correctly for normal cursors but for our
|
||||||
|
rootCursor we keep a variable to the cursor despite not having a ref for
|
||||||
|
ourselves.
|
||||||
|
|
||||||
|
Fix this by reffing/unreffing the rootCursor to ensure our pointer is
|
||||||
|
valid.
|
||||||
|
|
||||||
|
Related to CVE-2025-26594, ZDI-CAN-25544
|
||||||
|
|
||||||
|
Reviewed-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
(cherry picked from commit b0a09ba6020147961acc62d9c73d807b4cccd9f7)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
dix/main.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/dix/main.c b/dix/main.c
|
||||||
|
index b228d9c28..f2606d3d6 100644
|
||||||
|
--- a/dix/main.c
|
||||||
|
+++ b/dix/main.c
|
||||||
|
@@ -235,6 +235,8 @@ dix_main(int argc, char *argv[], char *envp[])
|
||||||
|
defaultCursorFont);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ rootCursor = RefCursor(rootCursor);
|
||||||
|
+
|
||||||
|
#ifdef PANORAMIX
|
||||||
|
/*
|
||||||
|
* Consolidate window and colourmap information for each screen
|
||||||
|
@@ -275,6 +277,8 @@ dix_main(int argc, char *argv[], char *envp[])
|
||||||
|
|
||||||
|
Dispatch();
|
||||||
|
|
||||||
|
+ UnrefCursor(rootCursor);
|
||||||
|
+
|
||||||
|
UndisplayDevices();
|
||||||
|
DisableAllDevices();
|
||||||
|
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
63
0003-xkb-Fix-buffer-overflow-in-XkbVModMaskText.patch
Normal file
63
0003-xkb-Fix-buffer-overflow-in-XkbVModMaskText.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
From c0e295af1adca6a0258bb405c535fe04969cc178 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Wed, 27 Nov 2024 14:41:45 +0100
|
||||||
|
Subject: [PATCH xserver 03/13] xkb: Fix buffer overflow in XkbVModMaskText()
|
||||||
|
|
||||||
|
The code in XkbVModMaskText() allocates a fixed sized buffer on the
|
||||||
|
stack and copies the virtual mod name.
|
||||||
|
|
||||||
|
There's actually two issues in the code that can lead to a buffer
|
||||||
|
overflow.
|
||||||
|
|
||||||
|
First, the bound check mixes pointers and integers using misplaced
|
||||||
|
parenthesis, defeating the bound check.
|
||||||
|
|
||||||
|
But even though, if the check fails, the data is still copied, so the
|
||||||
|
stack overflow will occur regardless.
|
||||||
|
|
||||||
|
Change the logic to skip the copy entirely if the bound check fails.
|
||||||
|
|
||||||
|
CVE-2025-26595, ZDI-CAN-25545
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 11fcda8753e994e15eb915d28cf487660ec8e722)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
xkb/xkbtext.c | 16 ++++++++--------
|
||||||
|
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
|
||||||
|
index d2a2567fc..002626450 100644
|
||||||
|
--- a/xkb/xkbtext.c
|
||||||
|
+++ b/xkb/xkbtext.c
|
||||||
|
@@ -175,14 +175,14 @@ XkbVModMaskText(XkbDescPtr xkb,
|
||||||
|
len = strlen(tmp) + 1 + (str == buf ? 0 : 1);
|
||||||
|
if (format == XkbCFile)
|
||||||
|
len += 4;
|
||||||
|
- if ((str - (buf + len)) <= VMOD_BUFFER_SIZE) {
|
||||||
|
- if (str != buf) {
|
||||||
|
- if (format == XkbCFile)
|
||||||
|
- *str++ = '|';
|
||||||
|
- else
|
||||||
|
- *str++ = '+';
|
||||||
|
- len--;
|
||||||
|
- }
|
||||||
|
+ if ((str - buf) + len > VMOD_BUFFER_SIZE)
|
||||||
|
+ continue; /* Skip */
|
||||||
|
+ if (str != buf) {
|
||||||
|
+ if (format == XkbCFile)
|
||||||
|
+ *str++ = '|';
|
||||||
|
+ else
|
||||||
|
+ *str++ = '+';
|
||||||
|
+ len--;
|
||||||
|
}
|
||||||
|
if (format == XkbCFile)
|
||||||
|
sprintf(str, "%sMask", tmp);
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
47
0004-xkb-Fix-computation-of-XkbSizeKeySyms.patch
Normal file
47
0004-xkb-Fix-computation-of-XkbSizeKeySyms.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From ddf9500846982402250114803b28180036a54cac Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Thu, 28 Nov 2024 11:49:34 +0100
|
||||||
|
Subject: [PATCH xserver 04/13] xkb: Fix computation of XkbSizeKeySyms
|
||||||
|
|
||||||
|
The computation of the length in XkbSizeKeySyms() differs from what is
|
||||||
|
actually written in XkbWriteKeySyms(), leading to a heap overflow.
|
||||||
|
|
||||||
|
Fix the calculation in XkbSizeKeySyms() to match what kbWriteKeySyms()
|
||||||
|
does.
|
||||||
|
|
||||||
|
CVE-2025-26596, ZDI-CAN-25543
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 80d69f01423fc065c950e1ff4e8ddf9f675df773)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
xkb/xkb.c | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xkb/xkb.c b/xkb/xkb.c
|
||||||
|
index 68c59df02..175a81bf7 100644
|
||||||
|
--- a/xkb/xkb.c
|
||||||
|
+++ b/xkb/xkb.c
|
||||||
|
@@ -1093,10 +1093,10 @@ XkbSizeKeySyms(XkbDescPtr xkb, xkbGetMapReply * rep)
|
||||||
|
len = rep->nKeySyms * SIZEOF(xkbSymMapWireDesc);
|
||||||
|
symMap = &xkb->map->key_sym_map[rep->firstKeySym];
|
||||||
|
for (i = nSyms = 0; i < rep->nKeySyms; i++, symMap++) {
|
||||||
|
- if (symMap->offset != 0) {
|
||||||
|
- nSymsThisKey = XkbNumGroups(symMap->group_info) * symMap->width;
|
||||||
|
- nSyms += nSymsThisKey;
|
||||||
|
- }
|
||||||
|
+ nSymsThisKey = XkbNumGroups(symMap->group_info) * symMap->width;
|
||||||
|
+ if (nSymsThisKey == 0)
|
||||||
|
+ continue;
|
||||||
|
+ nSyms += nSymsThisKey;
|
||||||
|
}
|
||||||
|
len += nSyms * 4;
|
||||||
|
rep->totalSyms = nSyms;
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
45
0005-xkb-Fix-buffer-overflow-in-XkbChangeTypesOfKey.patch
Normal file
45
0005-xkb-Fix-buffer-overflow-in-XkbChangeTypesOfKey.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From 33dfc78a0f67f4db5558c2374f5a73d262e43671 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Thu, 28 Nov 2024 14:09:04 +0100
|
||||||
|
Subject: [PATCH xserver 05/13] xkb: Fix buffer overflow in
|
||||||
|
XkbChangeTypesOfKey()
|
||||||
|
|
||||||
|
If XkbChangeTypesOfKey() is called with nGroups == 0, it will resize the
|
||||||
|
key syms to 0 but leave the key actions unchanged.
|
||||||
|
|
||||||
|
If later, the same function is called with a non-zero value for nGroups,
|
||||||
|
this will cause a buffer overflow because the key actions are of the wrong
|
||||||
|
size.
|
||||||
|
|
||||||
|
To avoid the issue, make sure to resize both the key syms and key actions
|
||||||
|
when nGroups is 0.
|
||||||
|
|
||||||
|
CVE-2025-26597, ZDI-CAN-25683
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 0e4ed94952b255c04fe910f6a1d9c852878dcd64)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
xkb/XKBMisc.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c
|
||||||
|
index f17194528..c45471686 100644
|
||||||
|
--- a/xkb/XKBMisc.c
|
||||||
|
+++ b/xkb/XKBMisc.c
|
||||||
|
@@ -553,6 +553,7 @@ XkbChangeTypesOfKey(XkbDescPtr xkb,
|
||||||
|
i = XkbSetNumGroups(i, 0);
|
||||||
|
xkb->map->key_sym_map[key].group_info = i;
|
||||||
|
XkbResizeKeySyms(xkb, key, 0);
|
||||||
|
+ XkbResizeKeyActions(xkb, key, 0);
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
118
0006-Xi-Fix-barrier-device-search.patch
Normal file
118
0006-Xi-Fix-barrier-device-search.patch
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
From 475a856c919c8648aaefac9388a7788eed5725fa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 16 Dec 2024 11:25:11 +0100
|
||||||
|
Subject: [PATCH xserver 06/13] Xi: Fix barrier device search
|
||||||
|
|
||||||
|
The function GetBarrierDevice() would search for the pointer device
|
||||||
|
based on its device id and return the matching value, or supposedly NULL
|
||||||
|
if no match was found.
|
||||||
|
|
||||||
|
Unfortunately, as written, it would return the last element of the list
|
||||||
|
if no matching device id was found which can lead to out of bounds
|
||||||
|
memory access.
|
||||||
|
|
||||||
|
Fix the search function to return NULL if not matching device is found,
|
||||||
|
and adjust the callers to handle the case where the device cannot be
|
||||||
|
found.
|
||||||
|
|
||||||
|
CVE-2025-26598, ZDI-CAN-25740
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit bba9df1a9d57234c76c0b93f88dacb143d01bca2)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
Xi/xibarriers.c | 27 +++++++++++++++++++++++----
|
||||||
|
1 file changed, 23 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Xi/xibarriers.c b/Xi/xibarriers.c
|
||||||
|
index 1926762ad..cb336f22b 100644
|
||||||
|
--- a/Xi/xibarriers.c
|
||||||
|
+++ b/Xi/xibarriers.c
|
||||||
|
@@ -129,14 +129,15 @@ static void FreePointerBarrierClient(struct PointerBarrierClient *c)
|
||||||
|
|
||||||
|
static struct PointerBarrierDevice *GetBarrierDevice(struct PointerBarrierClient *c, int deviceid)
|
||||||
|
{
|
||||||
|
- struct PointerBarrierDevice *pbd = NULL;
|
||||||
|
+ struct PointerBarrierDevice *p, *pbd = NULL;
|
||||||
|
|
||||||
|
- xorg_list_for_each_entry(pbd, &c->per_device, entry) {
|
||||||
|
- if (pbd->deviceid == deviceid)
|
||||||
|
+ xorg_list_for_each_entry(p, &c->per_device, entry) {
|
||||||
|
+ if (p->deviceid == deviceid) {
|
||||||
|
+ pbd = p;
|
||||||
|
break;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- BUG_WARN(!pbd);
|
||||||
|
return pbd;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -337,6 +338,9 @@ barrier_find_nearest(BarrierScreenPtr cs, DeviceIntPtr dev,
|
||||||
|
double distance;
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(c, dev->id);
|
||||||
|
+ if (!pbd)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
if (pbd->seen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
@@ -445,6 +449,9 @@ input_constrain_cursor(DeviceIntPtr dev, ScreenPtr screen,
|
||||||
|
nearest = &c->barrier;
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(c, master->id);
|
||||||
|
+ if (!pbd)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
new_sequence = !pbd->hit;
|
||||||
|
|
||||||
|
pbd->seen = TRUE;
|
||||||
|
@@ -485,6 +492,9 @@ input_constrain_cursor(DeviceIntPtr dev, ScreenPtr screen,
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(c, master->id);
|
||||||
|
+ if (!pbd)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
pbd->seen = FALSE;
|
||||||
|
if (!pbd->hit)
|
||||||
|
continue;
|
||||||
|
@@ -679,6 +689,9 @@ BarrierFreeBarrier(void *data, XID id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(c, dev->id);
|
||||||
|
+ if (!pbd)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
if (!pbd->hit)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
@@ -738,6 +751,8 @@ static void remove_master_func(void *res, XID id, void *devid)
|
||||||
|
barrier = container_of(b, struct PointerBarrierClient, barrier);
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(barrier, *deviceid);
|
||||||
|
+ if (!pbd)
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
if (pbd->hit) {
|
||||||
|
BarrierEvent ev = {
|
||||||
|
@@ -903,6 +918,10 @@ ProcXIBarrierReleasePointer(ClientPtr client)
|
||||||
|
barrier = container_of(b, struct PointerBarrierClient, barrier);
|
||||||
|
|
||||||
|
pbd = GetBarrierDevice(barrier, dev->id);
|
||||||
|
+ if (!pbd) {
|
||||||
|
+ client->errorValue = dev->id;
|
||||||
|
+ return BadDevice;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (pbd->barrier_event_id == event_id)
|
||||||
|
pbd->release_event_id = event_id;
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
@ -0,0 +1,65 @@
|
|||||||
|
From 04d8041534d40e975d11a8a58ea7e8b1f09b519d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Tue, 17 Dec 2024 15:19:45 +0100
|
||||||
|
Subject: [PATCH xserver 07/13] composite: Handle failure to redirect in
|
||||||
|
compRedirectWindow()
|
||||||
|
|
||||||
|
The function compCheckRedirect() may fail if it cannot allocate the
|
||||||
|
backing pixmap.
|
||||||
|
|
||||||
|
In that case, compRedirectWindow() will return a BadAlloc error.
|
||||||
|
|
||||||
|
However that failure code path will shortcut the validation of the
|
||||||
|
window tree marked just before, which leaves the validate data partly
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
That causes a use of uninitialized pointer later.
|
||||||
|
|
||||||
|
The fix is to not shortcut the call to compHandleMarkedWindows() even in
|
||||||
|
the case of compCheckRedirect() returning an error.
|
||||||
|
|
||||||
|
CVE-2025-26599, ZDI-CAN-25851
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit c1ff84bef2569b4ba4be59323cf575d1798ba9be)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
composite/compalloc.c | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/composite/compalloc.c b/composite/compalloc.c
|
||||||
|
index 3e2f14fb0..55a1b725a 100644
|
||||||
|
--- a/composite/compalloc.c
|
||||||
|
+++ b/composite/compalloc.c
|
||||||
|
@@ -138,6 +138,7 @@ compRedirectWindow(ClientPtr pClient, WindowPtr pWin, int update)
|
||||||
|
CompScreenPtr cs = GetCompScreen(pWin->drawable.pScreen);
|
||||||
|
WindowPtr pLayerWin;
|
||||||
|
Bool anyMarked = FALSE;
|
||||||
|
+ int status = Success;
|
||||||
|
|
||||||
|
if (pWin == cs->pOverlayWin) {
|
||||||
|
return Success;
|
||||||
|
@@ -216,13 +217,13 @@ compRedirectWindow(ClientPtr pClient, WindowPtr pWin, int update)
|
||||||
|
|
||||||
|
if (!compCheckRedirect(pWin)) {
|
||||||
|
FreeResource(ccw->id, RT_NONE);
|
||||||
|
- return BadAlloc;
|
||||||
|
+ status = BadAlloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anyMarked)
|
||||||
|
compHandleMarkedWindows(pWin, pLayerWin);
|
||||||
|
|
||||||
|
- return Success;
|
||||||
|
+ return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
127
0008-composite-initialize-border-clip-even-when-pixmap-al.patch
Normal file
127
0008-composite-initialize-border-clip-even-when-pixmap-al.patch
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
From 9a5a5b2972539ba5ef16dbc802c4eb87c9226d4e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 13 Jan 2025 16:09:43 +0100
|
||||||
|
Subject: [PATCH xserver 08/13] composite: initialize border clip even when
|
||||||
|
pixmap alloc fails
|
||||||
|
|
||||||
|
If it fails to allocate the pixmap, the function compAllocPixmap() would
|
||||||
|
return early and leave the borderClip region uninitialized, which may
|
||||||
|
lead to the use of uninitialized value as reported by valgrind:
|
||||||
|
|
||||||
|
Conditional jump or move depends on uninitialised value(s)
|
||||||
|
at 0x4F9B33: compClipNotify (compwindow.c:317)
|
||||||
|
by 0x484FC9: miComputeClips (mivaltree.c:476)
|
||||||
|
by 0x48559A: miValidateTree (mivaltree.c:679)
|
||||||
|
by 0x4F0685: MapWindow (window.c:2693)
|
||||||
|
by 0x4A344A: ProcMapWindow (dispatch.c:922)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
Uninitialised value was created by a heap allocation
|
||||||
|
at 0x4841866: malloc (vg_replace_malloc.c:446)
|
||||||
|
by 0x4F47BC: compRedirectWindow (compalloc.c:171)
|
||||||
|
by 0x4FA8AD: compCreateWindow (compwindow.c:592)
|
||||||
|
by 0x4EBB89: CreateWindow (window.c:925)
|
||||||
|
by 0x4A2E6E: ProcCreateWindow (dispatch.c:768)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
|
||||||
|
Conditional jump or move depends on uninitialised value(s)
|
||||||
|
at 0x48EEDBC: pixman_region_translate (pixman-region.c:2233)
|
||||||
|
by 0x4F9255: RegionTranslate (regionstr.h:312)
|
||||||
|
by 0x4F9B7E: compClipNotify (compwindow.c:319)
|
||||||
|
by 0x484FC9: miComputeClips (mivaltree.c:476)
|
||||||
|
by 0x48559A: miValidateTree (mivaltree.c:679)
|
||||||
|
by 0x4F0685: MapWindow (window.c:2693)
|
||||||
|
by 0x4A344A: ProcMapWindow (dispatch.c:922)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
Uninitialised value was created by a heap allocation
|
||||||
|
at 0x4841866: malloc (vg_replace_malloc.c:446)
|
||||||
|
by 0x4F47BC: compRedirectWindow (compalloc.c:171)
|
||||||
|
by 0x4FA8AD: compCreateWindow (compwindow.c:592)
|
||||||
|
by 0x4EBB89: CreateWindow (window.c:925)
|
||||||
|
by 0x4A2E6E: ProcCreateWindow (dispatch.c:768)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
|
||||||
|
Conditional jump or move depends on uninitialised value(s)
|
||||||
|
at 0x48EEE33: UnknownInlinedFun (pixman-region.c:2241)
|
||||||
|
by 0x48EEE33: pixman_region_translate (pixman-region.c:2225)
|
||||||
|
by 0x4F9255: RegionTranslate (regionstr.h:312)
|
||||||
|
by 0x4F9B7E: compClipNotify (compwindow.c:319)
|
||||||
|
by 0x484FC9: miComputeClips (mivaltree.c:476)
|
||||||
|
by 0x48559A: miValidateTree (mivaltree.c:679)
|
||||||
|
by 0x4F0685: MapWindow (window.c:2693)
|
||||||
|
by 0x4A344A: ProcMapWindow (dispatch.c:922)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
Uninitialised value was created by a heap allocation
|
||||||
|
at 0x4841866: malloc (vg_replace_malloc.c:446)
|
||||||
|
by 0x4F47BC: compRedirectWindow (compalloc.c:171)
|
||||||
|
by 0x4FA8AD: compCreateWindow (compwindow.c:592)
|
||||||
|
by 0x4EBB89: CreateWindow (window.c:925)
|
||||||
|
by 0x4A2E6E: ProcCreateWindow (dispatch.c:768)
|
||||||
|
by 0x4A25B5: Dispatch (dispatch.c:560)
|
||||||
|
by 0x4B082A: dix_main (main.c:282)
|
||||||
|
by 0x429233: main (stubmain.c:34)
|
||||||
|
|
||||||
|
Fix compAllocPixmap() to initialize the border clip even if the creation
|
||||||
|
of the backing pixmap has failed, to avoid depending later on
|
||||||
|
uninitialized border clip values.
|
||||||
|
|
||||||
|
Related to CVE-2025-26599, ZDI-CAN-25851
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit b07192a8bedb90b039dc0f70ae69daf047ff9598)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
composite/compalloc.c | 11 ++++++++---
|
||||||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/composite/compalloc.c b/composite/compalloc.c
|
||||||
|
index 55a1b725a..d1c205ca0 100644
|
||||||
|
--- a/composite/compalloc.c
|
||||||
|
+++ b/composite/compalloc.c
|
||||||
|
@@ -604,9 +604,12 @@ compAllocPixmap(WindowPtr pWin)
|
||||||
|
int h = pWin->drawable.height + (bw << 1);
|
||||||
|
PixmapPtr pPixmap = compNewPixmap(pWin, x, y, w, h);
|
||||||
|
CompWindowPtr cw = GetCompWindow(pWin);
|
||||||
|
+ Bool status;
|
||||||
|
|
||||||
|
- if (!pPixmap)
|
||||||
|
- return FALSE;
|
||||||
|
+ if (!pPixmap) {
|
||||||
|
+ status = FALSE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
if (cw->update == CompositeRedirectAutomatic)
|
||||||
|
pWin->redirectDraw = RedirectDrawAutomatic;
|
||||||
|
else
|
||||||
|
@@ -620,14 +623,16 @@ compAllocPixmap(WindowPtr pWin)
|
||||||
|
DamageRegister(&pWin->drawable, cw->damage);
|
||||||
|
cw->damageRegistered = TRUE;
|
||||||
|
}
|
||||||
|
+ status = TRUE;
|
||||||
|
|
||||||
|
+out:
|
||||||
|
/* Make sure our borderClip is up to date */
|
||||||
|
RegionUninit(&cw->borderClip);
|
||||||
|
RegionCopy(&cw->borderClip, &pWin->borderClip);
|
||||||
|
cw->borderClipX = pWin->drawable.x;
|
||||||
|
cw->borderClipY = pWin->drawable.y;
|
||||||
|
|
||||||
|
- return TRUE;
|
||||||
|
+ return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
@ -0,0 +1,67 @@
|
|||||||
|
From 470c77ae761a36c71494285009bc37b2abbefe97 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 16 Dec 2024 16:18:04 +0100
|
||||||
|
Subject: [PATCH xserver 09/13] dix: Dequeue pending events on frozen device on
|
||||||
|
removal
|
||||||
|
|
||||||
|
When a device is removed while still frozen, the events queued for that
|
||||||
|
device remain while the device itself is freed.
|
||||||
|
|
||||||
|
As a result, replaying the events will cause a use after free.
|
||||||
|
|
||||||
|
To avoid the issue, make sure to dequeue and free any pending events on
|
||||||
|
a frozen device when removed.
|
||||||
|
|
||||||
|
CVE-2025-26600, ZDI-CAN-25871
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 6e0f332ba4c8b8c9a9945dc9d7989bfe06f80e14)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
dix/devices.c | 18 ++++++++++++++++++
|
||||||
|
1 file changed, 18 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/dix/devices.c b/dix/devices.c
|
||||||
|
index e7c74d7b7..11120b70b 100644
|
||||||
|
--- a/dix/devices.c
|
||||||
|
+++ b/dix/devices.c
|
||||||
|
@@ -949,6 +949,23 @@ FreeAllDeviceClasses(ClassesPtr classes)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+FreePendingFrozenDeviceEvents(DeviceIntPtr dev)
|
||||||
|
+{
|
||||||
|
+ QdEventPtr qe, tmp;
|
||||||
|
+
|
||||||
|
+ if (!dev->deviceGrab.sync.frozen)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* Dequeue any frozen pending events */
|
||||||
|
+ xorg_list_for_each_entry_safe(qe, tmp, &syncEvents.pending, next) {
|
||||||
|
+ if (qe->device == dev) {
|
||||||
|
+ xorg_list_del(&qe->next);
|
||||||
|
+ free(qe);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* Close down a device and free all resources.
|
||||||
|
* Once closed down, the driver will probably not expect you that you'll ever
|
||||||
|
@@ -1013,6 +1030,7 @@ CloseDevice(DeviceIntPtr dev)
|
||||||
|
free(dev->last.touches[j].valuators);
|
||||||
|
free(dev->last.touches);
|
||||||
|
dev->config_info = NULL;
|
||||||
|
+ FreePendingFrozenDeviceEvents(dev);
|
||||||
|
dixFreePrivates(dev->devPrivates, PRIVATE_DEVICE);
|
||||||
|
free(dev);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
69
0010-sync-Do-not-let-sync-objects-uninitialized.patch
Normal file
69
0010-sync-Do-not-let-sync-objects-uninitialized.patch
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
From 7f7f51e8907b14c6654944e0e321f15e256b34e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 20 Jan 2025 16:52:01 +0100
|
||||||
|
Subject: [PATCH xserver 10/13] sync: Do not let sync objects uninitialized
|
||||||
|
|
||||||
|
When changing an alarm, the change mask values are evaluated one after
|
||||||
|
the other, changing the trigger values as requested and eventually,
|
||||||
|
SyncInitTrigger() is called.
|
||||||
|
|
||||||
|
SyncInitTrigger() will evaluate the XSyncCACounter first and may free
|
||||||
|
the existing sync object.
|
||||||
|
|
||||||
|
Other changes are then evaluated and may trigger an error and an early
|
||||||
|
return, not adding the new sync object.
|
||||||
|
|
||||||
|
This can be used to cause a use after free when the alarm eventually
|
||||||
|
triggers.
|
||||||
|
|
||||||
|
To avoid the issue, delete the existing sync object as late as possible
|
||||||
|
only once we are sure that no further error will cause an early exit.
|
||||||
|
|
||||||
|
CVE-2025-26601, ZDI-CAN-25870
|
||||||
|
|
||||||
|
This vulnerability was discovered by:
|
||||||
|
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 16a1242d0ffc7f45ed3c595ee7564b5c04287e0b)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
Xext/sync.c | 13 ++++++++-----
|
||||||
|
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Xext/sync.c b/Xext/sync.c
|
||||||
|
index fd2ceb042..e55295904 100644
|
||||||
|
--- a/Xext/sync.c
|
||||||
|
+++ b/Xext/sync.c
|
||||||
|
@@ -329,11 +329,6 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, XID syncObject,
|
||||||
|
client->errorValue = syncObject;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
- if (pSync != pTrigger->pSync) { /* new counter for trigger */
|
||||||
|
- SyncDeleteTriggerFromSyncObject(pTrigger);
|
||||||
|
- pTrigger->pSync = pSync;
|
||||||
|
- newSyncObject = TRUE;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if system counter, ask it what the current value is */
|
||||||
|
@@ -401,6 +396,14 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, XID syncObject,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (changes & XSyncCACounter) {
|
||||||
|
+ if (pSync != pTrigger->pSync) { /* new counter for trigger */
|
||||||
|
+ SyncDeleteTriggerFromSyncObject(pTrigger);
|
||||||
|
+ pTrigger->pSync = pSync;
|
||||||
|
+ newSyncObject = TRUE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* we wait until we're sure there are no errors before registering
|
||||||
|
* a new counter on a trigger
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
83
0011-sync-Check-values-before-applying-changes.patch
Normal file
83
0011-sync-Check-values-before-applying-changes.patch
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
From a4c19259fca5af558fb27d8fa98f2ad4a3689d56 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 20 Jan 2025 16:54:30 +0100
|
||||||
|
Subject: [PATCH xserver 11/13] sync: Check values before applying changes
|
||||||
|
|
||||||
|
In SyncInitTrigger(), we would set the CheckTrigger function before
|
||||||
|
validating the counter value.
|
||||||
|
|
||||||
|
As a result, if the counter value overflowed, we would leave the
|
||||||
|
function SyncInitTrigger() with the CheckTrigger applied but without
|
||||||
|
updating the trigger object.
|
||||||
|
|
||||||
|
To avoid that issue, move the portion of code checking for the trigger
|
||||||
|
check value before updating the CheckTrigger function.
|
||||||
|
|
||||||
|
Related to CVE-2025-26601, ZDI-CAN-25870
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit f52cea2f93a0c891494eb3334894442a92368030)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
Xext/sync.c | 36 ++++++++++++++++++------------------
|
||||||
|
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Xext/sync.c b/Xext/sync.c
|
||||||
|
index e55295904..66a52283d 100644
|
||||||
|
--- a/Xext/sync.c
|
||||||
|
+++ b/Xext/sync.c
|
||||||
|
@@ -350,6 +350,24 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, XID syncObject,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (changes & (XSyncCAValueType | XSyncCAValue)) {
|
||||||
|
+ if (pTrigger->value_type == XSyncAbsolute)
|
||||||
|
+ pTrigger->test_value = pTrigger->wait_value;
|
||||||
|
+ else { /* relative */
|
||||||
|
+ Bool overflow;
|
||||||
|
+
|
||||||
|
+ if (pCounter == NULL)
|
||||||
|
+ return BadMatch;
|
||||||
|
+
|
||||||
|
+ overflow = checked_int64_add(&pTrigger->test_value,
|
||||||
|
+ pCounter->value, pTrigger->wait_value);
|
||||||
|
+ if (overflow) {
|
||||||
|
+ client->errorValue = pTrigger->wait_value >> 32;
|
||||||
|
+ return BadValue;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (changes & XSyncCATestType) {
|
||||||
|
|
||||||
|
if (pSync && SYNC_FENCE == pSync->type) {
|
||||||
|
@@ -378,24 +396,6 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, XID syncObject,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (changes & (XSyncCAValueType | XSyncCAValue)) {
|
||||||
|
- if (pTrigger->value_type == XSyncAbsolute)
|
||||||
|
- pTrigger->test_value = pTrigger->wait_value;
|
||||||
|
- else { /* relative */
|
||||||
|
- Bool overflow;
|
||||||
|
-
|
||||||
|
- if (pCounter == NULL)
|
||||||
|
- return BadMatch;
|
||||||
|
-
|
||||||
|
- overflow = checked_int64_add(&pTrigger->test_value,
|
||||||
|
- pCounter->value, pTrigger->wait_value);
|
||||||
|
- if (overflow) {
|
||||||
|
- client->errorValue = pTrigger->wait_value >> 32;
|
||||||
|
- return BadValue;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (changes & XSyncCACounter) {
|
||||||
|
if (pSync != pTrigger->pSync) { /* new counter for trigger */
|
||||||
|
SyncDeleteTriggerFromSyncObject(pTrigger);
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
50
0012-sync-Do-not-fail-SyncAddTriggerToSyncObject.patch
Normal file
50
0012-sync-Do-not-fail-SyncAddTriggerToSyncObject.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From 7537745b5fe63d7e43d692bfa86f93259d522c80 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 20 Jan 2025 17:06:07 +0100
|
||||||
|
Subject: [PATCH xserver 12/13] sync: Do not fail SyncAddTriggerToSyncObject()
|
||||||
|
|
||||||
|
We do not want to return a failure at the very last step in
|
||||||
|
SyncInitTrigger() after having all changes applied.
|
||||||
|
|
||||||
|
SyncAddTriggerToSyncObject() must not fail on memory allocation, if the
|
||||||
|
allocation of the SyncTriggerList fails, trigger a FatalError() instead.
|
||||||
|
|
||||||
|
Related to CVE-2025-26601, ZDI-CAN-25870
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit 8cbc90c8817306af75a60f494ec9dbb1061e50db)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
Xext/sync.c | 7 +++----
|
||||||
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Xext/sync.c b/Xext/sync.c
|
||||||
|
index 66a52283d..8def4adbf 100644
|
||||||
|
--- a/Xext/sync.c
|
||||||
|
+++ b/Xext/sync.c
|
||||||
|
@@ -199,8 +199,8 @@ SyncAddTriggerToSyncObject(SyncTrigger * pTrigger)
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(pCur = malloc(sizeof(SyncTriggerList))))
|
||||||
|
- return BadAlloc;
|
||||||
|
+ /* Failure is not an option, it's succeed or burst! */
|
||||||
|
+ pCur = XNFalloc(sizeof(SyncTriggerList));
|
||||||
|
|
||||||
|
pCur->pTrigger = pTrigger;
|
||||||
|
pCur->next = pTrigger->pSync->pTriglist;
|
||||||
|
@@ -408,8 +408,7 @@ SyncInitTrigger(ClientPtr client, SyncTrigger * pTrigger, XID syncObject,
|
||||||
|
* a new counter on a trigger
|
||||||
|
*/
|
||||||
|
if (newSyncObject) {
|
||||||
|
- if ((rc = SyncAddTriggerToSyncObject(pTrigger)) != Success)
|
||||||
|
- return rc;
|
||||||
|
+ SyncAddTriggerToSyncObject(pTrigger);
|
||||||
|
}
|
||||||
|
else if (pCounter && IsSystemCounter(pCounter)) {
|
||||||
|
SyncComputeBracketValues(pCounter);
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
131
0013-sync-Apply-changes-last-in-SyncChangeAlarmAttributes.patch
Normal file
131
0013-sync-Apply-changes-last-in-SyncChangeAlarmAttributes.patch
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
From e7bca6a0933b6f0c1568cbe770740c48626f30be Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Date: Mon, 20 Jan 2025 17:10:31 +0100
|
||||||
|
Subject: [PATCH xserver 13/13] sync: Apply changes last in
|
||||||
|
SyncChangeAlarmAttributes()
|
||||||
|
|
||||||
|
SyncChangeAlarmAttributes() would apply the various changes while
|
||||||
|
checking for errors.
|
||||||
|
|
||||||
|
If one of the changes triggers an error, the changes for the trigger,
|
||||||
|
counter or delta value would remain, possibly leading to inconsistent
|
||||||
|
changes.
|
||||||
|
|
||||||
|
Postpone the actual changes until we're sure nothing else can go wrong.
|
||||||
|
|
||||||
|
Related to CVE-2025-26601, ZDI-CAN-25870
|
||||||
|
|
||||||
|
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||||
|
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
(cherry picked from commit c285798984c6bb99e454a33772cde23d394d3dcd)
|
||||||
|
|
||||||
|
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1831>
|
||||||
|
---
|
||||||
|
Xext/sync.c | 42 +++++++++++++++++++++++++++---------------
|
||||||
|
1 file changed, 27 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Xext/sync.c b/Xext/sync.c
|
||||||
|
index 8def4adbf..e2f2c2774 100644
|
||||||
|
--- a/Xext/sync.c
|
||||||
|
+++ b/Xext/sync.c
|
||||||
|
@@ -799,8 +799,14 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm * pAlarm, Mask mask,
|
||||||
|
int status;
|
||||||
|
XSyncCounter counter;
|
||||||
|
Mask origmask = mask;
|
||||||
|
+ SyncTrigger trigger;
|
||||||
|
+ Bool select_events_changed = FALSE;
|
||||||
|
+ Bool select_events_value = FALSE;
|
||||||
|
+ int64_t delta;
|
||||||
|
|
||||||
|
- counter = pAlarm->trigger.pSync ? pAlarm->trigger.pSync->id : None;
|
||||||
|
+ trigger = pAlarm->trigger;
|
||||||
|
+ delta = pAlarm->delta;
|
||||||
|
+ counter = trigger.pSync ? trigger.pSync->id : None;
|
||||||
|
|
||||||
|
while (mask) {
|
||||||
|
int index2 = lowbit(mask);
|
||||||
|
@@ -816,24 +822,24 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm * pAlarm, Mask mask,
|
||||||
|
case XSyncCAValueType:
|
||||||
|
mask &= ~XSyncCAValueType;
|
||||||
|
/* sanity check in SyncInitTrigger */
|
||||||
|
- pAlarm->trigger.value_type = *values++;
|
||||||
|
+ trigger.value_type = *values++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XSyncCAValue:
|
||||||
|
mask &= ~XSyncCAValue;
|
||||||
|
- pAlarm->trigger.wait_value = ((int64_t)values[0] << 32) | values[1];
|
||||||
|
+ trigger.wait_value = ((int64_t)values[0] << 32) | values[1];
|
||||||
|
values += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XSyncCATestType:
|
||||||
|
mask &= ~XSyncCATestType;
|
||||||
|
/* sanity check in SyncInitTrigger */
|
||||||
|
- pAlarm->trigger.test_type = *values++;
|
||||||
|
+ trigger.test_type = *values++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XSyncCADelta:
|
||||||
|
mask &= ~XSyncCADelta;
|
||||||
|
- pAlarm->delta = ((int64_t)values[0] << 32) | values[1];
|
||||||
|
+ delta = ((int64_t)values[0] << 32) | values[1];
|
||||||
|
values += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -843,10 +849,8 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm * pAlarm, Mask mask,
|
||||||
|
client->errorValue = *values;
|
||||||
|
return BadValue;
|
||||||
|
}
|
||||||
|
- status = SyncEventSelectForAlarm(pAlarm, client,
|
||||||
|
- (Bool) (*values++));
|
||||||
|
- if (status != Success)
|
||||||
|
- return status;
|
||||||
|
+ select_events_value = (Bool) (*values++);
|
||||||
|
+ select_events_changed = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
@@ -855,25 +859,33 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm * pAlarm, Mask mask,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (select_events_changed) {
|
||||||
|
+ status = SyncEventSelectForAlarm(pAlarm, client, select_events_value);
|
||||||
|
+ if (status != Success)
|
||||||
|
+ return status;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* "If the test-type is PositiveComparison or PositiveTransition
|
||||||
|
* and delta is less than zero, or if the test-type is
|
||||||
|
* NegativeComparison or NegativeTransition and delta is
|
||||||
|
* greater than zero, a Match error is generated."
|
||||||
|
*/
|
||||||
|
if (origmask & (XSyncCADelta | XSyncCATestType)) {
|
||||||
|
- if ((((pAlarm->trigger.test_type == XSyncPositiveComparison) ||
|
||||||
|
- (pAlarm->trigger.test_type == XSyncPositiveTransition))
|
||||||
|
- && pAlarm->delta < 0)
|
||||||
|
+ if ((((trigger.test_type == XSyncPositiveComparison) ||
|
||||||
|
+ (trigger.test_type == XSyncPositiveTransition))
|
||||||
|
+ && delta < 0)
|
||||||
|
||
|
||||||
|
- (((pAlarm->trigger.test_type == XSyncNegativeComparison) ||
|
||||||
|
- (pAlarm->trigger.test_type == XSyncNegativeTransition))
|
||||||
|
- && pAlarm->delta > 0)
|
||||||
|
+ (((trigger.test_type == XSyncNegativeComparison) ||
|
||||||
|
+ (trigger.test_type == XSyncNegativeTransition))
|
||||||
|
+ && delta > 0)
|
||||||
|
) {
|
||||||
|
return BadMatch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* postpone this until now, when we're sure nothing else can go wrong */
|
||||||
|
+ pAlarm->delta = delta;
|
||||||
|
+ pAlarm->trigger = trigger;
|
||||||
|
if ((status = SyncInitTrigger(client, &pAlarm->trigger, counter, RTCounter,
|
||||||
|
origmask & XSyncCAAllTrigger)) != Success)
|
||||||
|
return status;
|
||||||
|
--
|
||||||
|
2.48.1
|
||||||
|
|
@ -42,7 +42,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.20.11
|
Version: 1.20.11
|
||||||
Release: 27%{?gitdate:.%{gitdate}}%{?dist}
|
Release: 28%{?gitdate:.%{gitdate}}%{?dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
@ -200,6 +200,27 @@ Patch10048: 0004-render-fix-refcounting-of-glyphs-during-ProcRenderAd.patch
|
|||||||
Patch10049: 0001-render-Avoid-possible-double-free-in-ProcRenderAddGl.patch
|
Patch10049: 0001-render-Avoid-possible-double-free-in-ProcRenderAddGl.patch
|
||||||
# CVE-2024-9632
|
# CVE-2024-9632
|
||||||
Patch10050: 0001-xkb-Fix-buffer-overflow-in-_XkbSetCompatMap.patch
|
Patch10050: 0001-xkb-Fix-buffer-overflow-in-_XkbSetCompatMap.patch
|
||||||
|
# CVE-2025-26594: Use-after-free of the root cursor
|
||||||
|
Patch10051: 0001-Cursor-Refuse-to-free-the-root-cursor.patch
|
||||||
|
Patch10052: 0002-dix-keep-a-ref-to-the-rootCursor.patch
|
||||||
|
# CVE-2025-26595: Buffer overflow in XkbVModMaskText()
|
||||||
|
Patch10053: 0003-xkb-Fix-buffer-overflow-in-XkbVModMaskText.patch
|
||||||
|
# CVE-2025-26596: Heap overflow in XkbWriteKeySyms()
|
||||||
|
Patch10054: 0004-xkb-Fix-computation-of-XkbSizeKeySyms.patch
|
||||||
|
# CVE-2025-26597: Buffer overflow in XkbChangeTypesOfKey()
|
||||||
|
Patch10055: 0005-xkb-Fix-buffer-overflow-in-XkbChangeTypesOfKey.patch
|
||||||
|
# CVE-2025-26598: Out-of-bounds write in CreatePointerBarrierClient()
|
||||||
|
Patch10056: 0006-Xi-Fix-barrier-device-search.patch
|
||||||
|
# CVE-2025-26599: Use of uninitialized pointer in compRedirectWindow()
|
||||||
|
Patch10057: 0007-composite-Handle-failure-to-redirect-in-compRedirect.patch
|
||||||
|
Patch10058: 0008-composite-initialize-border-clip-even-when-pixmap-al.patch
|
||||||
|
# CVE-2025-26600: Use-after-free in PlayReleasedEvents()
|
||||||
|
Patch10059: 0009-dix-Dequeue-pending-events-on-frozen-device-on-remov.patch
|
||||||
|
# CVE-2025-26601: Use-after-free in SyncInitTrigger()
|
||||||
|
Patch10060: 0010-sync-Do-not-let-sync-objects-uninitialized.patch
|
||||||
|
Patch10061: 0011-sync-Check-values-before-applying-changes.patch
|
||||||
|
Patch10062: 0012-sync-Do-not-fail-SyncAddTriggerToSyncObject.patch
|
||||||
|
Patch10063: 0013-sync-Apply-changes-last-in-SyncChangeAlarmAttributes.patch
|
||||||
|
|
||||||
BuildRequires: make
|
BuildRequires: make
|
||||||
BuildRequires: systemtap-sdt-devel
|
BuildRequires: systemtap-sdt-devel
|
||||||
@ -610,6 +631,12 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Feb 26 2025 Olivier Fourdan <ofourdan@redhat.com> - 1.20.11-28
|
||||||
|
- CVE fix for: CVE-2025-26594 (RHEL-80201), CVE-2025-26595 (RHEL-80186),
|
||||||
|
CVE-2025-26596 (RHEL-80188), CVE-2025-26597 (RHEL-80191),
|
||||||
|
CVE-2025-26598 (RHEL-80192), CVE-2025-26599 (RHEL-80199),
|
||||||
|
CVE-2025-26600 (RHEL-80198), CVE-2025-26601 (RHEL-80200)
|
||||||
|
|
||||||
* Tue Oct 29 2024 José Expósito <jexposit@redhat.com> - 1.20.11-27
|
* Tue Oct 29 2024 José Expósito <jexposit@redhat.com> - 1.20.11-27
|
||||||
- CVE fix for CVE-2024-9632
|
- CVE fix for CVE-2024-9632
|
||||||
- Backport fix for invalid Unicode sequence
|
- Backport fix for invalid Unicode sequence
|
||||||
|
Loading…
Reference in New Issue
Block a user