HID: cougar: Stop processing vendor events on hid-core
authorDaniel M. Lambea <dmlambea@gmail.com>
Fri, 27 Jul 2018 20:19:12 +0000 (21:19 +0100)
committerJiri Kosina <jkosina@suse.cz>
Wed, 5 Sep 2018 08:25:37 +0000 (10:25 +0200)
Special key events received by the custom vendor's hdev are
translated to key events on the kbd iface's input device, so
their processing must not continue. Return -EPERM from
raw_event handler to effectively stop source events from
being processed in hid-core.

Signed-off-by: Daniel M. Lambea <dmlambea@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-cougar.c

index 910ef43..3f0916b 100644 (file)
@@ -261,26 +261,32 @@ static int cougar_raw_event(struct hid_device *hdev, struct hid_report *report,
                            u8 *data, int size)
 {
        struct cougar *cougar;
+       struct cougar_shared *shared;
        unsigned char code, action;
        int i;
 
        cougar = hid_get_drvdata(hdev);
-       if (!cougar->special_intf || !cougar->shared ||
-           !cougar->shared->input || !cougar->shared->enabled)
+       shared = cougar->shared;
+       if (!cougar->special_intf || !shared)
                return 0;
 
+       if (!shared->enabled || !shared->input)
+               return -EPERM;
+
        code = data[COUGAR_FIELD_CODE];
        action = data[COUGAR_FIELD_ACTION];
        for (i = 0; cougar_mapping[i][0]; i++) {
                if (code == cougar_mapping[i][0]) {
-                       input_event(cougar->shared->input, EV_KEY,
+                       input_event(shared->input, EV_KEY,
                                    cougar_mapping[i][1], action);
-                       input_sync(cougar->shared->input);
-                       return 0;
+                       input_sync(shared->input);
+                       return -EPERM;
                }
        }
-       hid_warn(hdev, "unmapped special key code %x: ignoring\n", code);
-       return 0;
+       /* Avoid warnings on the same unmapped key twice */
+       if (action != 0)
+               hid_warn(hdev, "unmapped special key code %0x: ignoring\n", code);
+       return -EPERM;
 }
 
 static void cougar_remove(struct hid_device *hdev)