!317 [sync] PR-306: fix CVE-2025-26594, CVE-2025-26595, CVE-2025-26596, CVE-2025-26597, CVE-2025-26598, CVE-2025-26599, CVE-2025-26600, CVE-2025-26601
From: @openeuler-sync-bot Reviewed-by: @weidongkl Signed-off-by: @weidongkl
This commit is contained in:
commit
874b651e87
49
backport-CVE-2025-26594.patch
Normal file
49
backport-CVE-2025-26594.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
backport-CVE-2025-26595.patch
Normal file
63
backport-CVE-2025-26595.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
backport-CVE-2025-26596.patch
Normal file
47
backport-CVE-2025-26596.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
backport-CVE-2025-26597.patch
Normal file
45
backport-CVE-2025-26597.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
backport-CVE-2025-26598.patch
Normal file
118
backport-CVE-2025-26598.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
|
||||||
|
|
||||||
127
backport-CVE-2025-26599.patch
Normal file
127
backport-CVE-2025-26599.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
|
||||||
|
|
||||||
67
backport-CVE-2025-26600.patch
Normal file
67
backport-CVE-2025-26600.patch
Normal file
@ -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
|
||||||
|
|
||||||
131
backport-CVE-2025-26601.patch
Normal file
131
backport-CVE-2025-26601.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
|
||||||
|
|
||||||
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.20.11
|
Version: 1.20.11
|
||||||
Release: 36
|
Release: 37
|
||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
License: MIT and GPLv2
|
License: MIT and GPLv2
|
||||||
URL: https://www.x.org
|
URL: https://www.x.org
|
||||||
@ -132,6 +132,14 @@ Patch6045: backport-0002-CVE-2023-5574.patch
|
|||||||
Patch6046: backport-0003-CVE-2023-5574.patch
|
Patch6046: backport-0003-CVE-2023-5574.patch
|
||||||
Patch6047: backport-CVE-2024-9632.patch
|
Patch6047: backport-CVE-2024-9632.patch
|
||||||
Patch6048: backport-xfree86-fbdevhw-fix-pci-detection-on-recent-Linux.patch
|
Patch6048: backport-xfree86-fbdevhw-fix-pci-detection-on-recent-Linux.patch
|
||||||
|
Patch6049: backport-CVE-2025-26594.patch
|
||||||
|
Patch6050: backport-CVE-2025-26595.patch
|
||||||
|
Patch6051: backport-CVE-2025-26596.patch
|
||||||
|
Patch6052: backport-CVE-2025-26597.patch
|
||||||
|
Patch6053: backport-CVE-2025-26598.patch
|
||||||
|
Patch6054: backport-CVE-2025-26599.patch
|
||||||
|
Patch6055: backport-CVE-2025-26600.patch
|
||||||
|
Patch6056: backport-CVE-2025-26601.patch
|
||||||
|
|
||||||
BuildRequires: audit-libs-devel autoconf automake bison dbus-devel flex git gcc
|
BuildRequires: audit-libs-devel autoconf automake bison dbus-devel flex git gcc
|
||||||
BuildRequires: systemtap-sdt-devel libtool pkgconfig
|
BuildRequires: systemtap-sdt-devel libtool pkgconfig
|
||||||
@ -473,6 +481,11 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
|
|||||||
%{_mandir}/man*/*
|
%{_mandir}/man*/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sun Mar 09 2025 Funda Wang <fundawang@yeah.net> - 1.20.11-37
|
||||||
|
- fix CVE-2025-26594, CVE-2025-26595, CVE-2025-26596,
|
||||||
|
CVE-2025-26597, CVE-2025-26598, CVE-2025-26599
|
||||||
|
CVE-2025-26600, CVE-2025-26601
|
||||||
|
|
||||||
* Fri Mar 07 2025 mahailiang <mahailiang@uniontech.com> - 1.20.11-36
|
* Fri Mar 07 2025 mahailiang <mahailiang@uniontech.com> - 1.20.11-36
|
||||||
- fix sw_64 build error
|
- fix sw_64 build error
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user