import CS git libinput-1.30.1-2.el10_2
This commit is contained in:
parent
d89ed8d31a
commit
11893a6962
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
libinput-1.26.1.tar.bz2
|
||||
libinput-1.30.1.tar.bz2
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
From 6b3b71d0ddd27207ef4c52c72080ba10b672fa5a Mon Sep 17 00:00:00 2001
|
||||
From b4b2918b2ac67ba6553d79dbf1366cfc9b669080 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Tue, 22 Jul 2025 14:22:34 +1000
|
||||
Date: Wed, 17 Dec 2025 14:35:37 +1000
|
||||
Subject: [PATCH] RHEL: map dials to rings on the Intuos Pro 3rd Gen devices
|
||||
|
||||
These devices have relative dials but our userspace stack
|
||||
@ -16,21 +16,21 @@ Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
---
|
||||
meson.build | 1 +
|
||||
quirks/30-vendor-wacom.quirks | 42 +++++++++
|
||||
src/evdev-tablet-pad.c | 89 ++++++++++++++++---
|
||||
src/evdev-tablet-pad.h | 5 ++
|
||||
src/quirks.c | 1 +
|
||||
src/evdev-tablet-pad.c | 92 +++++++++++++++++--
|
||||
src/evdev-tablet-pad.h | 5 +
|
||||
src/quirks.c | 3 +-
|
||||
src/quirks.h | 1 +
|
||||
test/litest-device-wacom-intuos-pro-3rd-pad.c | 87 ++++++++++++++++++
|
||||
test/litest-device-wacom-intuos-pro-3rd-pad.c | 86 +++++++++++++++++
|
||||
test/litest.h | 1 +
|
||||
test/test-tablet.c | 59 ++++++++++++
|
||||
9 files changed, 276 insertions(+), 10 deletions(-)
|
||||
test/test-pad.c | 72 +++++++++++++++
|
||||
9 files changed, 292 insertions(+), 11 deletions(-)
|
||||
create mode 100644 test/litest-device-wacom-intuos-pro-3rd-pad.c
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 3f0583e5879f..f7fbe8222eea 100644
|
||||
index 0db0d1da3aba..ac58c7a1d734 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -822,6 +822,7 @@ if get_option('tests')
|
||||
@@ -948,6 +948,7 @@ if get_option('tests')
|
||||
'test/litest-device-wacom-cintiq-pro-16-pen.c',
|
||||
'test/litest-device-wacom-ekr.c',
|
||||
'test/litest-device-wacom-hid4800-pen.c',
|
||||
@ -39,10 +39,10 @@ index 3f0583e5879f..f7fbe8222eea 100644
|
||||
'test/litest-device-wacom-intuos5-finger.c',
|
||||
'test/litest-device-wacom-intuos5-pad.c',
|
||||
diff --git a/quirks/30-vendor-wacom.quirks b/quirks/30-vendor-wacom.quirks
|
||||
index 51211684c821..79c860efca39 100644
|
||||
index a7898b65ca1c..38fbc65e08ba 100644
|
||||
--- a/quirks/30-vendor-wacom.quirks
|
||||
+++ b/quirks/30-vendor-wacom.quirks
|
||||
@@ -33,3 +33,45 @@ MatchBus=usb
|
||||
@@ -40,3 +40,45 @@ MatchBus=usb
|
||||
MatchVendor=0x2D1F
|
||||
MatchProduct=0x524C
|
||||
AttrEventCode=-ABS_TILT_X;-ABS_TILT_Y;
|
||||
@ -89,10 +89,10 @@ index 51211684c821..79c860efca39 100644
|
||||
+MatchProduct=0x03F5
|
||||
+ModelWacomIntuosPro3rd=1
|
||||
diff --git a/src/evdev-tablet-pad.c b/src/evdev-tablet-pad.c
|
||||
index 90614c5dae91..64d0eae2b603 100644
|
||||
index 186def190a71..40552603f80d 100644
|
||||
--- a/src/evdev-tablet-pad.c
|
||||
+++ b/src/evdev-tablet-pad.c
|
||||
@@ -317,6 +317,30 @@ pad_strip_get_mode_group(struct pad_dispatch *pad,
|
||||
@@ -354,6 +354,30 @@ pad_strip_get_mode_group(struct pad_dispatch *pad, unsigned int strip)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -123,30 +123,27 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
static void
|
||||
pad_check_notify_axes(struct pad_dispatch *pad,
|
||||
struct evdev_device *device,
|
||||
@@ -335,7 +359,7 @@ pad_check_notify_axes(struct pad_dispatch *pad,
|
||||
@@ -372,18 +396,48 @@ pad_check_notify_axes(struct pad_dispatch *pad,
|
||||
|
||||
/* Unlike the ring axis we don't get an event when we release
|
||||
* so we can't set a source */
|
||||
- if (pad->changed_axes & PAD_AXIS_DIAL1) {
|
||||
+ if (pad->changed_axes & PAD_AXIS_DIAL1 && !pad->dials.map_to_ring) {
|
||||
group = pad_dial_get_mode_group(pad, 0);
|
||||
tablet_pad_notify_dial(base,
|
||||
time,
|
||||
@@ -344,7 +368,7 @@ pad_check_notify_axes(struct pad_dispatch *pad,
|
||||
group);
|
||||
if (group)
|
||||
tablet_pad_notify_dial(base, time, 0, pad->dials.dial1, group);
|
||||
}
|
||||
|
||||
- if (pad->changed_axes & PAD_AXIS_DIAL2) {
|
||||
+ if (pad->changed_axes & PAD_AXIS_DIAL2 && !pad->dials.map_to_ring) {
|
||||
group = pad_dial_get_mode_group(pad, 1);
|
||||
tablet_pad_notify_dial(base,
|
||||
time,
|
||||
@@ -353,6 +377,34 @@ pad_check_notify_axes(struct pad_dispatch *pad,
|
||||
group);
|
||||
if (group)
|
||||
tablet_pad_notify_dial(base, time, 1, pad->dials.dial2, group);
|
||||
}
|
||||
|
||||
+ if (pad->changed_axes & PAD_AXIS_DIAL1 && pad->dials.map_to_ring) {
|
||||
+ double degrees = pad_ring_to_dial(&pad->dials.abs_dial1_value, pad->dials.dial1);
|
||||
+ double degrees =
|
||||
+ pad_ring_to_dial(&pad->dials.abs_dial1_value, pad->dials.dial1);
|
||||
+ if (device->left_handed.enabled)
|
||||
+ degrees = fmod(degrees + 180, 360);
|
||||
+
|
||||
@ -160,7 +157,8 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
+ }
|
||||
+
|
||||
+ if (pad->changed_axes & PAD_AXIS_DIAL2 && pad->dials.map_to_ring) {
|
||||
+ double degrees = pad_ring_to_dial(&pad->dials.abs_dial2_value, pad->dials.dial2);
|
||||
+ double degrees =
|
||||
+ pad_ring_to_dial(&pad->dials.abs_dial2_value, pad->dials.dial2);
|
||||
+ if (device->left_handed.enabled)
|
||||
+ degrees = fmod(degrees + 180, 360);
|
||||
+
|
||||
@ -176,17 +174,18 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
if (pad->changed_axes & PAD_AXIS_RING1) {
|
||||
value = pad_handle_ring(pad, device, ABS_WHEEL);
|
||||
if (send_finger_up)
|
||||
@@ -780,6 +832,9 @@ pad_init(struct pad_dispatch *pad, struct evdev_device *device)
|
||||
pad->status = PAD_NONE;
|
||||
@@ -824,6 +878,10 @@ pad_init(struct pad_dispatch *pad, struct evdev_device *device)
|
||||
pad->changed_axes = PAD_AXIS_NONE;
|
||||
ratelimit_init(&pad->modes.group_not_found, h2us(1), 3);
|
||||
|
||||
+ /* RHEL dial-to-ring special */
|
||||
+ pad->dials.map_to_ring = evdev_device_has_model_quirk(device, QUIRK_MODEL_WACOM_INTUOS_PRO_3RD);
|
||||
+ pad->dials.map_to_ring =
|
||||
+ evdev_device_has_model_quirk(device, QUIRK_MODEL_WACOM_INTUOS_PRO_3RD);
|
||||
+
|
||||
/* We expect the kernel to either give us both axes as hires or neither.
|
||||
/* We expect the kernel to either give us both axes as hires or neither.
|
||||
* Getting one is a kernel bug we don't need to care about */
|
||||
pad->dials.has_hires_dial = libevdev_has_event_code(device->evdev, EV_REL, REL_WHEEL_HI_RES) ||
|
||||
@@ -886,18 +941,15 @@ evdev_device_tablet_pad_get_num_buttons(struct evdev_device *device)
|
||||
pad->dials.has_hires_dial =
|
||||
@@ -890,24 +948,34 @@ evdev_device_tablet_pad_get_num_buttons(struct evdev_device *device)
|
||||
return pad->nbuttons;
|
||||
}
|
||||
|
||||
@ -205,12 +204,11 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
+ if (libevdev_has_event_code(evdev, EV_REL, REL_WHEEL) ||
|
||||
+ libevdev_has_event_code(evdev, EV_REL, REL_DIAL)) {
|
||||
ndials++;
|
||||
- if (libevdev_has_event_code(device->evdev,
|
||||
+ if (libevdev_has_event_code(evdev,
|
||||
EV_REL,
|
||||
REL_HWHEEL))
|
||||
- if (libevdev_has_event_code(device->evdev, EV_REL, REL_HWHEEL))
|
||||
+ if (libevdev_has_event_code(evdev, EV_REL, REL_HWHEEL))
|
||||
ndials++;
|
||||
@@ -906,6 +958,19 @@ evdev_device_tablet_pad_get_num_dials(struct evdev_device *device)
|
||||
}
|
||||
|
||||
return ndials;
|
||||
}
|
||||
|
||||
@ -230,7 +228,7 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
int
|
||||
evdev_device_tablet_pad_get_num_rings(struct evdev_device *device)
|
||||
{
|
||||
@@ -914,6 +979,10 @@ evdev_device_tablet_pad_get_num_rings(struct evdev_device *device)
|
||||
@@ -916,6 +984,10 @@ evdev_device_tablet_pad_get_num_rings(struct evdev_device *device)
|
||||
if (!(device->seat_caps & EVDEV_DEVICE_TABLET_PAD))
|
||||
return -1;
|
||||
|
||||
@ -240,12 +238,12 @@ index 90614c5dae91..64d0eae2b603 100644
|
||||
+
|
||||
if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_WHEEL)) {
|
||||
nrings++;
|
||||
if (libevdev_has_event_code(device->evdev,
|
||||
if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_THROTTLE))
|
||||
diff --git a/src/evdev-tablet-pad.h b/src/evdev-tablet-pad.h
|
||||
index fe7aa8b79ff0..c9c23583c714 100644
|
||||
index 27e9fbed47c3..4c9fef3200f5 100644
|
||||
--- a/src/evdev-tablet-pad.h
|
||||
+++ b/src/evdev-tablet-pad.h
|
||||
@@ -79,6 +79,11 @@ struct pad_dispatch {
|
||||
@@ -83,6 +83,11 @@ struct pad_dispatch {
|
||||
bool has_hires_dial;
|
||||
double dial1;
|
||||
double dial2;
|
||||
@ -258,35 +256,37 @@ index fe7aa8b79ff0..c9c23583c714 100644
|
||||
|
||||
struct {
|
||||
diff --git a/src/quirks.c b/src/quirks.c
|
||||
index 01065d5eaa21..1151caac1d9d 100644
|
||||
index 6364549c8708..c726e03eb131 100644
|
||||
--- a/src/quirks.c
|
||||
+++ b/src/quirks.c
|
||||
@@ -272,6 +272,7 @@ quirk_get_name(enum quirk q)
|
||||
case QUIRK_MODEL_TOUCHPAD_PHANTOM_CLICKS: return "ModelTouchpadPhantomClicks";
|
||||
case QUIRK_MODEL_TRACKBALL: return "ModelTrackball";
|
||||
case QUIRK_MODEL_WACOM_TOUCHPAD: return "ModelWacomTouchpad";
|
||||
+ case QUIRK_MODEL_WACOM_INTUOS_PRO_3RD: return "ModelWacomIntuosPro3rd";
|
||||
case QUIRK_MODEL_PRESSURE_PAD: return "ModelPressurePad";
|
||||
|
||||
case QUIRK_ATTR_SIZE_HINT: return "AttrSizeHint";
|
||||
@@ -298,7 +298,8 @@ quirk_get_name(enum quirk q)
|
||||
return "ModelWacomTouchpad";
|
||||
case QUIRK_MODEL_PRESSURE_PAD:
|
||||
return "ModelPressurePad";
|
||||
-
|
||||
+ case QUIRK_MODEL_WACOM_INTUOS_PRO_3RD:
|
||||
+ return "ModelWacomIntuosPro3rd";
|
||||
case QUIRK_ATTR_SIZE_HINT:
|
||||
return "AttrSizeHint";
|
||||
case QUIRK_ATTR_TOUCH_SIZE_RANGE:
|
||||
diff --git a/src/quirks.h b/src/quirks.h
|
||||
index 340d04635b9f..ff0ac94e424f 100644
|
||||
index b6ea220a991c..22321d644f12 100644
|
||||
--- a/src/quirks.h
|
||||
+++ b/src/quirks.h
|
||||
@@ -86,6 +86,7 @@ enum quirk {
|
||||
@@ -95,6 +95,7 @@ enum quirk {
|
||||
QUIRK_MODEL_TOUCHPAD_VISIBLE_MARKER,
|
||||
QUIRK_MODEL_TRACKBALL,
|
||||
QUIRK_MODEL_WACOM_TOUCHPAD,
|
||||
+ QUIRK_MODEL_WACOM_INTUOS_PRO_3RD,
|
||||
QUIRK_MODEL_PRESSURE_PAD,
|
||||
QUIRK_MODEL_TOUCHPAD_PHANTOM_CLICKS,
|
||||
|
||||
_QUIRK_LAST_MODEL_QUIRK_, /* Guard: do not modify */
|
||||
|
||||
diff --git a/test/litest-device-wacom-intuos-pro-3rd-pad.c b/test/litest-device-wacom-intuos-pro-3rd-pad.c
|
||||
new file mode 100644
|
||||
index 000000000000..d5e54d46db6b
|
||||
index 000000000000..8efdcb16740b
|
||||
--- /dev/null
|
||||
+++ b/test/litest-device-wacom-intuos-pro-3rd-pad.c
|
||||
@@ -0,0 +1,87 @@
|
||||
@@ -0,0 +1,86 @@
|
||||
+/*
|
||||
+ * Copyright © 2016 Red Hat, Inc.
|
||||
+ *
|
||||
@ -312,8 +312,8 @@ index 000000000000..d5e54d46db6b
|
||||
+
|
||||
+#include "config.h"
|
||||
+
|
||||
+#include "litest.h"
|
||||
+#include "litest-int.h"
|
||||
+#include "litest.h"
|
||||
+
|
||||
+static struct input_event down[] = {
|
||||
+ { .type = -1, .code = -1 },
|
||||
@ -357,11 +357,11 @@ index 000000000000..d5e54d46db6b
|
||||
+ EV_REL, REL_HWHEEL,
|
||||
+ EV_REL, REL_WHEEL_HI_RES,
|
||||
+ EV_REL, REL_HWHEEL_HI_RES,
|
||||
+ -1, -1,
|
||||
+ -1, -1,
|
||||
+};
|
||||
+
|
||||
+TEST_DEVICE("wacom-intuos3-pad",
|
||||
+ .type = LITEST_WACOM_INTUOS_PRO_3RD_PAD,
|
||||
+TEST_DEVICE(
|
||||
+ LITEST_WACOM_INTUOS_PRO_3RD_PAD,
|
||||
+ .features = LITEST_TABLET_PAD, /* RHEL: not LITEST_DIAL because it's special */
|
||||
+ .interface = &interface,
|
||||
+
|
||||
@ -372,59 +372,61 @@ index 000000000000..d5e54d46db6b
|
||||
+ .udev_properties = {
|
||||
+ { "ID_INPUT_TABLET_PAD", "1" },
|
||||
+ { NULL },
|
||||
+ },
|
||||
+)
|
||||
+ }, )
|
||||
diff --git a/test/litest.h b/test/litest.h
|
||||
index 6108be50a4c1..93bea19dcd3e 100644
|
||||
index 9aa76f3c27ca..fe88be22e984 100644
|
||||
--- a/test/litest.h
|
||||
+++ b/test/litest.h
|
||||
@@ -352,6 +352,7 @@ enum litest_device_type {
|
||||
@@ -532,6 +532,7 @@ enum litest_device_type {
|
||||
LITEST_WACOM_CINTIQ_PRO16_PEN,
|
||||
LITEST_WACOM_EKR,
|
||||
LITEST_WACOM_HID4800_PEN,
|
||||
LITEST_WACOM_INTUOS,
|
||||
+ LITEST_WACOM_INTUOS_PRO_3RD_PAD,
|
||||
LITEST_WACOM_INTUOS3_PAD,
|
||||
LITEST_WACOM_INTUOS5_PAD,
|
||||
LITEST_WACOM_ISDV4,
|
||||
diff --git a/test/test-tablet.c b/test/test-tablet.c
|
||||
index b652dcfd5345..ae88c844be91 100644
|
||||
--- a/test/test-tablet.c
|
||||
+++ b/test/test-tablet.c
|
||||
@@ -6560,6 +6560,62 @@ START_TEST(tablet_smoothing)
|
||||
LITEST_WACOM_INTUOS5_PEN,
|
||||
diff --git a/test/test-pad.c b/test/test-pad.c
|
||||
index 6c3560d6bd38..2bac2f7866f1 100644
|
||||
--- a/test/test-pad.c
|
||||
+++ b/test/test-pad.c
|
||||
@@ -1147,6 +1147,67 @@ START_TEST(pad_send_events_disabled)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
+START_TEST(tablet_dial_to_ring)
|
||||
+START_TEST(pad_dial_to_ring)
|
||||
+{
|
||||
+ struct litest_device *dev = litest_current_device();
|
||||
+ struct libinput *li = dev->libinput;
|
||||
+ struct libinput_event *event;
|
||||
+ struct libinput_event_tablet_pad *pev;
|
||||
+
|
||||
+ /* The range is a bitmask of ring, direction, left-handed */
|
||||
+ int testcase = _i; /* ranged test */
|
||||
+ unsigned int ring = testcase & 0x1;
|
||||
+ int direction = testcase & 0x2 ? -1 : 1;
|
||||
+ bool left_handed = !!(testcase & 0x4);
|
||||
+
|
||||
+ litest_assert_int_lt(testcase, 8);
|
||||
+ unsigned int ring = litest_test_param_get_u32(test_env->params, "ring");
|
||||
+ int direction = litest_test_param_get_i32(test_env->params, "direction");
|
||||
+ bool left_handed = litest_test_param_get_bool(test_env->params, "left-handed");
|
||||
+
|
||||
+ const int degrees_per_detent = 15;
|
||||
+
|
||||
+ litest_assert_int_eq(libinput_device_tablet_pad_get_num_dials(dev->libinput_device), 0);
|
||||
+ litest_assert_int_eq(libinput_device_tablet_pad_get_num_rings(dev->libinput_device), 2);
|
||||
+ litest_assert_int_eq(
|
||||
+ libinput_device_tablet_pad_get_num_dials(dev->libinput_device),
|
||||
+ 0);
|
||||
+ litest_assert_int_eq(
|
||||
+ libinput_device_tablet_pad_get_num_rings(dev->libinput_device),
|
||||
+ 2);
|
||||
+
|
||||
+ /* The dial-to-ring affected devices do not support left-handed so let's
|
||||
+ * make sure setting left-handed a) doesn't work and b) the setting
|
||||
+ * doesn't affect anything.
|
||||
+ */
|
||||
+ enum libinput_config_status rc = libinput_device_config_left_handed_set(dev->libinput_device, left_handed);
|
||||
+ enum libinput_config_status rc =
|
||||
+ libinput_device_config_left_handed_set(dev->libinput_device,
|
||||
+ left_handed);
|
||||
+ litest_assert_int_eq(rc, (unsigned)LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
|
||||
+
|
||||
+ litest_drain_events(li);
|
||||
+
|
||||
+ double expected = 0.0;
|
||||
+ for (size_t count = 0; count < 36; count++) { /* 24 per 360 so let's do 1.5 rotations */
|
||||
+ for (size_t count = 0; count < 36;
|
||||
+ count++) { /* 24 per 360 so let's do 1.5 rotations */
|
||||
+ if (ring == 0) {
|
||||
+ /* REL_WHEEL is inverted to expectations */
|
||||
+ litest_event(dev, EV_REL, REL_WHEEL, 1 * -direction);
|
||||
@ -442,7 +444,9 @@ index b652dcfd5345..ae88c844be91 100644
|
||||
+ expected = fmod(expected, 360);
|
||||
+
|
||||
+ event = libinput_get_event(li);
|
||||
+ pev = litest_is_pad_ring_event(event, ring, LIBINPUT_TABLET_PAD_RING_SOURCE_UNKNOWN);
|
||||
+ pev = litest_is_pad_ring_event(event,
|
||||
+ ring,
|
||||
+ LIBINPUT_TABLET_PAD_RING_SOURCE_UNKNOWN);
|
||||
+ double value = libinput_event_tablet_pad_get_ring_position(pev);
|
||||
+ litest_assert_double_eq(value, expected);
|
||||
+ libinput_event_destroy(event);
|
||||
@ -450,17 +454,26 @@ index b652dcfd5345..ae88c844be91 100644
|
||||
+}
|
||||
+END_TEST
|
||||
+
|
||||
TEST_COLLECTION(tablet)
|
||||
TEST_COLLECTION(pad)
|
||||
{
|
||||
struct range with_timeout = { 0, 2 };
|
||||
@@ -6704,4 +6760,7 @@ TEST_COLLECTION(tablet)
|
||||
litest_add_ranged_for_device(huion_static_btn_tool_pen_disable_quirk_on_prox_out, LITEST_HUION_TABLET, &with_timeout);
|
||||
/* clang-format off */
|
||||
@@ -1192,5 +1253,16 @@ TEST_COLLECTION(pad)
|
||||
litest_add(pad_keys, LITEST_TABLET_PAD, LITEST_ANY);
|
||||
|
||||
litest_add_for_device(tablet_smoothing, LITEST_WACOM_HID4800_PEN);
|
||||
litest_add(pad_send_events_disabled, LITEST_TABLET_PAD, LITEST_ANY);
|
||||
+
|
||||
+ struct range dial_ring_cases = { 0, 8 };
|
||||
+ litest_add_ranged_for_device(tablet_dial_to_ring, LITEST_WACOM_INTUOS_PRO_3RD_PAD, &dial_ring_cases);
|
||||
+ enum {
|
||||
+ CCW = -1,
|
||||
+ CW = 1,
|
||||
+ };
|
||||
+ litest_with_parameters(params,
|
||||
+ "ring", 'u', 2, 0, 1,
|
||||
+ "direction", 'I', 2, litest_named_i32(CCW), litest_named_i32(CW),
|
||||
+ "left-handed", 'b') {
|
||||
+ litest_add_parametrized_for_device(pad_dial_to_ring, LITEST_WACOM_INTUOS_PRO_3RD_PAD, params);
|
||||
+ }
|
||||
/* clang-format on */
|
||||
}
|
||||
--
|
||||
2.50.1
|
||||
2.51.1
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
From 7ea1d8501fb5cfb4221a5f4647e8fde05092e613 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Gerecke <killertofu@gmail.com>
|
||||
Date: Mon, 29 Jul 2024 22:46:57 +0000
|
||||
Subject: [PATCH] tablet: Remove unnecessary scale factor on REL_HWHEEL_HI_RES
|
||||
|
||||
The two high-res axes should already be scaled appropriately by the
|
||||
kernel. This unnecessary scale factor causes 1 click of the dial to
|
||||
produce an event delta of +-14400 rather than the expected +-120.
|
||||
|
||||
Fixes: beca99812208 ("tablet: add API for relative dials")
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1029>
|
||||
(cherry picked from commit 66106b9746a46d5c1a112d8eae74acf0469a7cf6)
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
---
|
||||
src/evdev-tablet-pad.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/evdev-tablet-pad.c b/src/evdev-tablet-pad.c
|
||||
index 3aa92a4a4c69..90614c5dae91 100644
|
||||
--- a/src/evdev-tablet-pad.c
|
||||
+++ b/src/evdev-tablet-pad.c
|
||||
@@ -129,7 +129,7 @@ pad_process_relative(struct pad_dispatch *pad,
|
||||
pad_set_status(pad, PAD_AXES_UPDATED);
|
||||
break;
|
||||
case REL_HWHEEL_HI_RES:
|
||||
- pad->dials.dial2 = e->value * 120;
|
||||
+ pad->dials.dial2 = e->value;
|
||||
pad->changed_axes |= PAD_AXIS_DIAL2;
|
||||
pad_set_status(pad, PAD_AXES_UPDATED);
|
||||
break;
|
||||
--
|
||||
2.50.1
|
||||
|
||||
124
0001-util-sanitize-control-characters-in-str_sanitize.patch
Normal file
124
0001-util-sanitize-control-characters-in-str_sanitize.patch
Normal file
@ -0,0 +1,124 @@
|
||||
From fc2262e1c1847021239065e84f39f15492ef05cc Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Mon, 1 Jun 2026 10:12:29 +1000
|
||||
Subject: [PATCH] util: sanitize control characters in str_sanitize()
|
||||
|
||||
str_sanitize() only escaped '%' characters for format string safety.
|
||||
Device names from uinput devices can contain arbitrary bytes including
|
||||
ANSI escape sequences (ESC, 0x1b) and other control characters. When
|
||||
these strings are included in log messages and printed to a terminal,
|
||||
the escape sequences are interpreted by the terminal emulator. This
|
||||
could allow an attacker to manipulate terminal output (change colors,
|
||||
set window title, clear screen) when an administrator views libinput
|
||||
logs.
|
||||
|
||||
Replace all control characters (0x00-0x1f and 0x7f) with '?' in
|
||||
addition to the existing '%' escaping. This prevents terminal escape
|
||||
sequence injection through device names in log output.
|
||||
|
||||
Assisted-by: Claude:claude-opus-4-6
|
||||
(cherry picked from commit 71a2c5cae2a80a1e3bb29e3f3a07ccc3f3de5acb)
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1489>
|
||||
---
|
||||
src/util-strings.h | 30 ++++++++++++++++++++++++------
|
||||
test/test-utils.c | 10 ++++++++++
|
||||
2 files changed, 34 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/util-strings.h b/src/util-strings.h
|
||||
index 94236c481706..3c6626331a91 100644
|
||||
--- a/src/util-strings.h
|
||||
+++ b/src/util-strings.h
|
||||
@@ -538,34 +538,52 @@ strstartswith(const char *str, const char *prefix)
|
||||
const char *
|
||||
safe_basename(const char *filename);
|
||||
|
||||
char *
|
||||
trunkname(const char *filename);
|
||||
|
||||
/**
|
||||
* Return a copy of str with all % converted to %% to make the string
|
||||
- * acceptable as printf format.
|
||||
+ * acceptable as printf format, and all non-NUL control characters
|
||||
+ * (bytes 0x01-0x1f, 0x7f) replaced with '?' to prevent terminal
|
||||
+ * escape sequence injection. NUL bytes are excluded implicitly
|
||||
+ * because the string is null-terminated.
|
||||
*/
|
||||
static inline char *
|
||||
str_sanitize(const char *str)
|
||||
{
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
- if (!strchr(str, '%'))
|
||||
- return strdup(str);
|
||||
-
|
||||
size_t slen = strlen(str);
|
||||
slen = min(slen, 512);
|
||||
+
|
||||
+ bool needs_sanitization = false;
|
||||
+ for (size_t i = 0; i < slen; i++) {
|
||||
+ unsigned char c = str[i];
|
||||
+ if (c == '%' || c < 0x20 || c == 0x7f) {
|
||||
+ needs_sanitization = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!needs_sanitization)
|
||||
+ return strdup(str);
|
||||
+
|
||||
char *sanitized = zalloc(2 * slen + 1);
|
||||
const char *src = str;
|
||||
char *dst = sanitized;
|
||||
|
||||
for (size_t i = 0; i < slen; i++) {
|
||||
- if (*src == '%')
|
||||
+ unsigned char c = *src++;
|
||||
+ if (c == '%') {
|
||||
*dst++ = '%';
|
||||
- *dst++ = *src++;
|
||||
+ *dst++ = '%';
|
||||
+ } else if (c < 0x20 || c == 0x7f) {
|
||||
+ *dst++ = '?';
|
||||
+ } else {
|
||||
+ *dst++ = c;
|
||||
+ }
|
||||
}
|
||||
*dst = '\0';
|
||||
|
||||
return sanitized;
|
||||
}
|
||||
diff --git a/test/test-utils.c b/test/test-utils.c
|
||||
index 7c938b0af8ac..ee61ba13cc9c 100644
|
||||
--- a/test/test-utils.c
|
||||
+++ b/test/test-utils.c
|
||||
@@ -2081,16 +2081,26 @@ START_TEST(strsanitize_test)
|
||||
{ "foobar", "foobar" },
|
||||
{ "", "" },
|
||||
{ "%", "%%" },
|
||||
{ "%%%%", "%%%%%%%%" },
|
||||
{ "x %s", "x %%s" },
|
||||
{ "x %", "x %%" },
|
||||
{ "%sx", "%%sx" },
|
||||
{ "%s%s", "%%s%%s" },
|
||||
+ { "\t", "?" },
|
||||
+ { "\n", "?" },
|
||||
+ { "\r", "?" },
|
||||
+ { "\x1b[31m", "?[31m" },
|
||||
+ { "foo\tbar", "foo?bar" },
|
||||
+ { "foo\nbar", "foo?bar" },
|
||||
+ { "\x01\x1f\x7f", "???" },
|
||||
+ { "clean", "clean" },
|
||||
+ { "a\x1b[0mb", "a?[0mb" },
|
||||
+ { "%\n", "%%?" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
/* clang-format on */
|
||||
|
||||
for (struct strsanitize_test *t = tests; t->string; t++) {
|
||||
char *sanitized = str_sanitize(t->string);
|
||||
litest_assert_str_eq(sanitized, t->expected);
|
||||
free(sanitized);
|
||||
--
|
||||
2.54.0
|
||||
|
||||
116
0002-libinput-device-group-sanitize-phys-before-printing-.patch
Normal file
116
0002-libinput-device-group-sanitize-phys-before-printing-.patch
Normal file
@ -0,0 +1,116 @@
|
||||
From b2bde9504d42a5976d76e1f27c640dc561fbd99b Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Mon, 1 Jun 2026 10:48:24 +1000
|
||||
Subject: [PATCH] libinput-device-group: sanitize phys before printing it
|
||||
|
||||
A malicious uinput device could set the phys value (via UI_SET_PHYS)
|
||||
to contain a '\n'. When the value is printed as part of the device group
|
||||
the udev rules will interpret it as separate property.
|
||||
|
||||
Depending on the property this can cause local privilege escalation.
|
||||
|
||||
Closes #1296
|
||||
|
||||
Found-by: Csome
|
||||
(cherry picked from commit 76f0d8a7f57e2868882864b4611281f12f704b55)
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1489>
|
||||
---
|
||||
udev/libinput-device-group.c | 13 +++++++------
|
||||
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/udev/libinput-device-group.c b/udev/libinput-device-group.c
|
||||
index cdb38c0beb98..f9188406d4de 100644
|
||||
--- a/udev/libinput-device-group.c
|
||||
+++ b/udev/libinput-device-group.c
|
||||
@@ -102,61 +102,63 @@ wacom_handle_ekr(struct udev_device *device,
|
||||
udev = udev_device_get_udev(device);
|
||||
e = udev_enumerate_new(udev);
|
||||
udev_enumerate_add_match_subsystem(e, "input");
|
||||
udev_enumerate_add_match_sysname(e, "input*");
|
||||
udev_enumerate_scan_devices(e);
|
||||
|
||||
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
|
||||
struct udev_device *d;
|
||||
- const char *path, *phys;
|
||||
+ _autofree_ char *phys = NULL;
|
||||
+ const char *path;
|
||||
const char *pidstr, *vidstr;
|
||||
int pid, vid, dist;
|
||||
|
||||
/* Find and use the closest Wacom device on the system,
|
||||
* relying on wacom_handle_paired() to fix our ID later
|
||||
* if needed.
|
||||
*/
|
||||
path = udev_list_entry_get_name(entry);
|
||||
d = udev_device_new_from_syspath(udev, path);
|
||||
if (!d)
|
||||
continue;
|
||||
|
||||
vidstr = udev_device_get_property_value(d, "ID_VENDOR_ID");
|
||||
pidstr = udev_device_get_property_value(d, "ID_MODEL_ID");
|
||||
- phys = udev_device_get_sysattr_value(d, "phys");
|
||||
+ phys = str_sanitize(udev_device_get_sysattr_value(d, "phys"));
|
||||
|
||||
if (vidstr && pidstr && phys && safe_atoi_base(vidstr, &vid, 16) &&
|
||||
safe_atoi_base(pidstr, &pid, 16) && vid == VENDOR_ID_WACOM &&
|
||||
pid != PRODUCT_ID_WACOM_EKR) {
|
||||
dist = find_tree_distance(device, d);
|
||||
if (dist > 0 && (dist < best_dist || best_dist < 0)) {
|
||||
*vendor_id = vid;
|
||||
*product_id = pid;
|
||||
best_dist = dist;
|
||||
|
||||
free(*phys_attr);
|
||||
- *phys_attr = safe_strdup(phys);
|
||||
+ *phys_attr = steal(&phys);
|
||||
}
|
||||
}
|
||||
|
||||
udev_device_unref(d);
|
||||
}
|
||||
|
||||
udev_enumerate_unref(e);
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int rc = 1;
|
||||
struct udev *udev = NULL;
|
||||
struct udev_device *device = NULL;
|
||||
- const char *syspath, *phys = NULL;
|
||||
+ _autofree_ char *phys = NULL;
|
||||
+ const char *syspath = NULL;
|
||||
const char *product;
|
||||
int bustype, vendor_id, product_id, version;
|
||||
char group[1024];
|
||||
char *str;
|
||||
|
||||
if (argc != 2)
|
||||
return 1;
|
||||
|
||||
@@ -170,18 +172,17 @@ main(int argc, char **argv)
|
||||
if (!device)
|
||||
goto out;
|
||||
|
||||
/* Find the first parent with ATTRS{phys} set. For tablets that
|
||||
* value looks like usb-0000:00:14.0-1/input1. Drop the /input1
|
||||
* bit and use the remainder as device group identifier */
|
||||
while (device != NULL) {
|
||||
struct udev_device *parent;
|
||||
-
|
||||
- phys = udev_device_get_sysattr_value(device, "phys");
|
||||
+ phys = str_sanitize(udev_device_get_sysattr_value(device, "phys"));
|
||||
if (phys)
|
||||
break;
|
||||
|
||||
parent = udev_device_get_parent(device);
|
||||
udev_device_ref(parent);
|
||||
udev_device_unref(device);
|
||||
device = parent;
|
||||
}
|
||||
--
|
||||
2.54.0
|
||||
|
||||
@ -1,38 +0,0 @@
|
||||
From ac3b94975742c06bbe1eb614edb251f2465b2dbb Mon Sep 17 00:00:00 2001
|
||||
From: Marge Yang <marge.yang@synaptics.corp-partner.google.com>
|
||||
Date: Tue, 21 Jan 2025 07:26:41 +0000
|
||||
Subject: [PATCH] quirks: add quirk for Dell Haptics Touchpad.
|
||||
|
||||
This Touchpad is a pressure pad and needs the pressure
|
||||
handling disable.
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1127>
|
||||
(cherry picked from commit af0e9a23c32d086fece58a95cb720994ad02d0b4)
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
---
|
||||
quirks/50-system-dell.quirks | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/quirks/50-system-dell.quirks b/quirks/50-system-dell.quirks
|
||||
index f46ab2b3c50e..a3492eb40e75 100644
|
||||
--- a/quirks/50-system-dell.quirks
|
||||
+++ b/quirks/50-system-dell.quirks
|
||||
@@ -141,3 +141,15 @@ MatchProduct=0x1063
|
||||
MatchUdevType=touchpad
|
||||
MatchDMIModalias=dmi:*svnDellInc.:pnPrecision5480*
|
||||
ModelTouchpadVisibleMarker=0
|
||||
+
|
||||
+[Dell laptop 14 Synaptics touchpad]
|
||||
+MatchBus=i2c
|
||||
+MatchVendor=0x06CB
|
||||
+MatchProduct=0xCFF8
|
||||
+ModelPressurePad=1
|
||||
+
|
||||
+[Dell laptop 16 Synaptics touchpad]
|
||||
+MatchBus=i2c
|
||||
+MatchVendor=0x06CB
|
||||
+MatchProduct=0xCFF9
|
||||
+ModelPressurePad=1
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
From a487280e095e376a40354e69c01593153d61f126 Mon Sep 17 00:00:00 2001
|
||||
From: Josiah Vehrs <jvehrs@amazon.com>
|
||||
Date: Wed, 10 Jun 2026 18:17:53 -0700
|
||||
Subject: [PATCH] util: fix possible return of unsanitized input in
|
||||
str_sanitize
|
||||
|
||||
Fixes: 71a2c5cae2a8 ("util: sanitize control characters in str_sanitize()")
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1493>
|
||||
---
|
||||
src/util-strings.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/util-strings.h b/src/util-strings.h
|
||||
index 6186c16784d5..a6ff440bd24b 100644
|
||||
--- a/src/util-strings.h
|
||||
+++ b/src/util-strings.h
|
||||
@@ -567,17 +567,17 @@ str_sanitize(const char *str)
|
||||
for (size_t i = 0; i < slen; i++) {
|
||||
unsigned char c = str[i];
|
||||
if (c == '%' || c < 0x20 || c == 0x7f) {
|
||||
needs_sanitization = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!needs_sanitization)
|
||||
- return strdup(str);
|
||||
+ return strndup(str, slen);
|
||||
|
||||
char *sanitized = zalloc(2 * slen + 1);
|
||||
const char *src = str;
|
||||
char *dst = sanitized;
|
||||
|
||||
for (size_t i = 0; i < slen; i++) {
|
||||
unsigned char c = *src++;
|
||||
if (c == '%') {
|
||||
--
|
||||
2.54.0
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
From 54bbba8b2e35b6ceefed3ca0fe8c18e5b9a0759b Mon Sep 17 00:00:00 2001
|
||||
From: wangyafei <wangyafei@goodix.com>
|
||||
Date: Tue, 21 Jan 2025 17:17:05 +0800
|
||||
Subject: [PATCH] quirks: add quirks for Dell laptop with Goodix Touchpad.
|
||||
|
||||
This touchpad is a pressure pad and needs the pressure
|
||||
handling disable.
|
||||
|
||||
Signed-off-by: Charles Wang <charles.goodix@gmail.com>
|
||||
Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1130>
|
||||
(cherry picked from commit 3cf6c91fff5b84757792810c4016144443581da6)
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
---
|
||||
quirks/50-system-dell.quirks | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/quirks/50-system-dell.quirks b/quirks/50-system-dell.quirks
|
||||
index a3492eb40e75..8110651e466f 100644
|
||||
--- a/quirks/50-system-dell.quirks
|
||||
+++ b/quirks/50-system-dell.quirks
|
||||
@@ -153,3 +153,15 @@ MatchBus=i2c
|
||||
MatchVendor=0x06CB
|
||||
MatchProduct=0xCFF9
|
||||
ModelPressurePad=1
|
||||
+
|
||||
+[Dell laptop 14 Goodix touchpad]
|
||||
+MatchBus=i2c
|
||||
+MatchVendor=0x27C6
|
||||
+MatchProduct=0x0F61
|
||||
+ModelPressurePad=1
|
||||
+
|
||||
+[Dell laptop 16 Goodix touchpad]
|
||||
+MatchBus=i2c
|
||||
+MatchVendor=0x27C6
|
||||
+MatchProduct=0x0F62
|
||||
+ModelPressurePad=1
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
%global gitversion 58abea394
|
||||
|
||||
Name: libinput
|
||||
Version: 1.26.1
|
||||
Release: 5%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist}
|
||||
Version: 1.30.1
|
||||
Release: 2%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist}
|
||||
Summary: Input device library
|
||||
|
||||
# SPDX
|
||||
@ -19,10 +19,11 @@ Source2: commitid
|
||||
Source0: https://gitlab.freedesktop.org/libinput/libinput/-/archive/%{version}/libinput-%{version}.tar.bz2
|
||||
%endif
|
||||
|
||||
Patch0001: 0001-tablet-Remove-unnecessary-scale-factor-on-REL_HWHEEL.patch
|
||||
Patch0002: 0002-RHEL-map-dials-to-rings-on-the-Intuos-Pro-3rd-Gen-de.patch
|
||||
Patch0003: 0003-quirks-add-quirk-for-Dell-Haptics-Touchpad.patch
|
||||
Patch0004: 0004-quirks-add-quirks-for-Dell-laptop-with-Goodix-Touchp.patch
|
||||
Patch0002: 0001-RHEL-map-dials-to-rings-on-the-Intuos-Pro-3rd-Gen-de.patch
|
||||
# CVE-2026-50292 (RHEL-182371)
|
||||
Patch0003: 0001-util-sanitize-control-characters-in-str_sanitize.patch
|
||||
Patch0004: 0002-libinput-device-group-sanitize-phys-before-printing-.patch
|
||||
Patch0005: 0003-util-fix-possible-return-of-unsanitized-input-in-str.patch
|
||||
|
||||
BuildRequires: git-core
|
||||
BuildRequires: gcc
|
||||
@ -79,6 +80,7 @@ intended to be run by users.
|
||||
-Ddocumentation=false \
|
||||
-Dtests=true \
|
||||
-Dinstall-tests=true \
|
||||
-Dlua-plugins=disabled \
|
||||
-Dudev-dir=%{udevdir}
|
||||
%meson_build
|
||||
|
||||
@ -124,6 +126,7 @@ intended to be run by users.
|
||||
%{_libexecdir}/libinput/libinput-analyze-recording
|
||||
%{_libexecdir}/libinput/libinput-analyze-touch-down-state
|
||||
%{_libexecdir}/libinput/libinput-debug-tablet
|
||||
%{_libexecdir}/libinput/libinput-debug-tablet-pad
|
||||
%{_libexecdir}/libinput/libinput-list-kernel-devices
|
||||
%{_libexecdir}/libinput/libinput-measure
|
||||
%{_libexecdir}/libinput/libinput-measure-fuzz
|
||||
@ -140,6 +143,7 @@ intended to be run by users.
|
||||
%{_mandir}/man1/libinput-analyze-recording.1*
|
||||
%{_mandir}/man1/libinput-analyze-touch-down-state.1*
|
||||
%{_mandir}/man1/libinput-debug-tablet.1*
|
||||
%{_mandir}/man1/libinput-debug-tablet-pad.1*
|
||||
%{_mandir}/man1/libinput-list-kernel-devices.1*
|
||||
%{_mandir}/man1/libinput-measure.1*
|
||||
%{_mandir}/man1/libinput-measure-fuzz.1*
|
||||
@ -162,6 +166,18 @@ intended to be run by users.
|
||||
|
||||
|
||||
%changelog
|
||||
* Fri Jun 12 2026 Peter Hutterer <peter.hutterer@redhat.com> - 1.30.1-2
|
||||
- CVE-2026-50292: sanitize phys before printing it in libinput-device-group
|
||||
Resolves: RHEL-182371
|
||||
|
||||
* Wed Dec 17 2025 Peter Hutterer <peter.hutterer@redhat.com> - 1.30.1-1
|
||||
- libinput 1.30.1
|
||||
Resolves: RHEL-136390
|
||||
|
||||
* Wed Nov 05 2025 Florian Müllner <fmuellner@redhat.com> - 1.28.1-1
|
||||
- libinput 1.28.1
|
||||
Resolves: RHEL-126613
|
||||
|
||||
* Fri Aug 01 2025 Peter Hutterer <peter.hutterer@redhat.com> - 1.26.1-5
|
||||
- Add quirks for four Dell pressure pads (RHEL-106932)
|
||||
|
||||
|
||||
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (libinput-1.26.1.tar.bz2) = d4611fc75ee6091f3139134f348db79d710560c27a936c7a8c0dc50657d6e1bdbdb1b44fb4c2c668a5b45934d91d3aef336d4096806807354472b25e298cdab6
|
||||
SHA512 (libinput-1.30.1.tar.bz2) = 6d9bb5653dfeb0e30c64e92f8146a8908233162ef39f89114f619605b7f0de3f9e0f344412d91c809d3c1dc3d4b836a5709373a80191484db3c6d0a8f69c4f82
|
||||
|
||||
Loading…
Reference in New Issue
Block a user