wacom_bpt_touch() dereferences both touch_input and pad_input. wacom_bpt3_touch_msg() dereferences touch_input. wacom_bpt3_button_msg() dereferences pad_input. All three can be NULL when the corresponding wacom_setup_{touch,pad}_input_capabilities() returns -ENODEV during a successful probe. Add per-function guards. Fixes: 2a6cdbdd4cc0 ("HID: wacom: Introduce new 'touch_input' device") Fixes: 862cf5535c0c ("HID: wacom: Introduce a new WACOM_DEVICETYPE_PAD device_type") Signed-off-by: Jinmo Yang Co-Authored-By: Claude Opus 4.6 --- drivers/hid/wacom_wac.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 12a632ee1cbf..21c2504a085a 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -3148,6 +3148,12 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) if (data[0] != 0x02) return 0; + if (!input || !pad_input) { + dev_warn_once(&container_of(wacom, struct wacom, wacom_wac)->hdev->dev, + "%s: input is NULL\n", __func__); + return 0; + } + for (i = 0; i < 2; i++) { int offset = (data[1] & 0x80) ? (8 * i) : (9 * i); bool touch = report_touch_events(wacom) @@ -3182,8 +3188,17 @@ static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) { struct wacom_features *features = &wacom->features; struct input_dev *input = wacom->touch_input; - bool touch = data[1] & 0x80; - int slot = input_mt_get_slot_by_key(input, data[0]); + bool touch; + int slot; + + if (!input) { + dev_warn_once(&container_of(wacom, struct wacom, wacom_wac)->hdev->dev, + "%s: touch_input is NULL\n", __func__); + return; + } + + touch = data[1] & 0x80; + slot = input_mt_get_slot_by_key(input, data[0]); if (slot < 0) return; @@ -3226,6 +3241,12 @@ static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) struct input_dev *input = wacom->pad_input; struct wacom_features *features = &wacom->features; + if (!input) { + dev_warn_once(&container_of(wacom, struct wacom, wacom_wac)->hdev->dev, + "%s: pad_input is NULL\n", __func__); + return; + } + if (features->type == INTUOSHT || features->type == INTUOSHT2) { input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0); input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0); -- 2.53.0