From 66596a18598e1c4aae6ddc0e11a73e1a5b225c8e Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Fri, 21 Mar 2025 10:26:36 +0100 Subject: [PATCH] Fix LEDs state after suspend/resume Resolves: https://issues.redhat.com/browse/RHEL-82085 --- ...-LEDs-after-device-state-update-in-E.patch | 101 ++++++++++++++++++ xorg-x11-server.spec | 9 +- 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 0001-dix-Force-update-LEDs-after-device-state-update-in-E.patch diff --git a/0001-dix-Force-update-LEDs-after-device-state-update-in-E.patch b/0001-dix-Force-update-LEDs-after-device-state-update-in-E.patch new file mode 100644 index 0000000..a315373 --- /dev/null +++ b/0001-dix-Force-update-LEDs-after-device-state-update-in-E.patch @@ -0,0 +1,101 @@ +From 9c27c756438a62fdd768147d753b4c5fc731247b Mon Sep 17 00:00:00 2001 +From: Yao Wei +Date: Tue, 21 Feb 2023 03:43:05 +0000 +Subject: [PATCH xserver] dix: Force update LEDs after device state update in + EnableDevice +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is to make sure the hardware gets the device states regardless +whether the internal state has changed or not, to overcome situations +that device LEDs are out of sync e.g. switching between VTs. + +Signed-off-by: Yao Wei (魏銘廷) +(cherry picked from commit 7ce57e179b257f35e447971f4fb6614e3360762a) +--- + dix/devices.c | 4 ++++ + include/xkbsrv.h | 2 ++ + xkb/xkbLEDs.c | 38 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 44 insertions(+) + +diff --git a/dix/devices.c b/dix/devices.c +index 00c453980..5629d9cf1 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -426,6 +426,10 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent) + + if (!IsMaster(dev) && !IsFloating(dev)) + XkbPushLockedStateToSlaves(GetMaster(dev, MASTER_KEYBOARD), 0, 0); ++ ++ /* Now make sure our LEDs are in sync with the locked state */ ++ XkbForceUpdateDeviceLEDs(dev); ++ + RecalculateMasterButtons(dev); + + /* initialise an idle timer for this device*/ +diff --git a/include/xkbsrv.h b/include/xkbsrv.h +index fbb5427e1..90a5e5327 100644 +--- a/include/xkbsrv.h ++++ b/include/xkbsrv.h +@@ -505,6 +505,8 @@ extern _X_EXPORT void XkbUpdateIndicators(DeviceIntPtr /* keybd */ , + XkbEventCausePtr /* cause */ + ); + ++extern void XkbForceUpdateDeviceLEDs(DeviceIntPtr /* keybd */); ++ + extern _X_EXPORT void XkbUpdateAllDeviceIndicators(XkbChangesPtr /* changes */, + XkbEventCausePtr /* cause */ + ); +diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c +index 5792d9fb7..3fb8fc526 100644 +--- a/xkb/xkbLEDs.c ++++ b/xkb/xkbLEDs.c +@@ -435,6 +435,44 @@ XkbUpdateIndicators(DeviceIntPtr dev, + + /***====================================================================***/ + ++ /* ++ * void ++ * XkbForceUpdateDeviceLEDs(DeviceIntPtr dev) ++ * ++ * Force update LED states to the hardware from the device state ++ * specified by 'dev'. ++ * ++ * If 'dev' is a master device, this function will also force update ++ * its slave devices. ++ * ++ * Used if the actual LED state was externally set and need to push ++ * current state to the hardware e.g. switching between VTs. ++ */ ++ ++void ++XkbForceUpdateDeviceLEDs(DeviceIntPtr dev) ++{ ++ DeviceIntPtr master; ++ XkbSrvLedInfoPtr sli; ++ ++ if (!dev->key) ++ return; ++ ++ sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0); ++ XkbDDXUpdateDeviceIndicators(dev, sli, sli->effectiveState); ++ ++ if (IsMaster(dev)) { ++ master = dev; ++ nt_list_for_each_entry(dev, inputInfo.devices, next) { ++ if (!dev->key || GetMaster(dev, MASTER_KEYBOARD) != master) ++ continue; ++ ++ sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0); ++ XkbDDXUpdateDeviceIndicators(dev, sli, sli->effectiveState); ++ } ++ } ++} ++ + /***====================================================================***/ + + /* +-- +2.48.1 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 7e8f132..60a8c03 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -42,7 +42,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.20.11 -Release: 28%{?gitdate:.%{gitdate}}%{?dist} +Release: 29%{?gitdate:.%{gitdate}}%{?dist} URL: http://www.x.org License: MIT @@ -121,6 +121,9 @@ Patch112: 0001-present-Check-for-NULL-to-prevent-crash.patch Patch113: 0001-modesetting-Fix-msSharePixmapBacking-Segfault-Regres.patch Patch114: 0001-present-Send-a-PresentConfigureNotify-event-for-dest.patch Patch115: 0001-xquartz-Remove-invalid-Unicode-sequence.patch +# https://issues.redhat.com/browse/RHEL-82085 +# https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1070 +Patch116: 0001-dix-Force-update-LEDs-after-device-state-update-in-E.patch # CVE-2021-4011 Patch10009: 0001-record-Fix-out-of-bounds-access-in-SwapCreateRegiste.patch @@ -631,6 +634,10 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete %changelog +* Fri Mar 21 2025 Olivier Fourdan - 1.20.11-29 +- Fix LEDs state after suspend/resume + Resolves: https://issues.redhat.com/browse/RHEL-82085 + * Wed Feb 26 2025 Olivier Fourdan - 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),