Fix LEDs state after suspend/resume

Resolves: https://issues.redhat.com/browse/RHEL-82085
This commit is contained in:
Olivier Fourdan 2025-03-21 10:26:36 +01:00
parent 820d90bbc5
commit 66596a1859
2 changed files with 109 additions and 1 deletions

View File

@ -0,0 +1,101 @@
From 9c27c756438a62fdd768147d753b4c5fc731247b Mon Sep 17 00:00:00 2001
From: Yao Wei <mwei@lxde.org>
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 (魏銘廷) <yao.wei@canonical.com>
(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

View File

@ -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 <ofourdan@redhat.com> - 1.20.11-29
- Fix LEDs state after suspend/resume
Resolves: https://issues.redhat.com/browse/RHEL-82085
* 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),