|
@@ -163,18 +163,24 @@ static void dell_wmi_notify(u32 value, void *context)
|
|
|
const struct key_entry *key;
|
|
const struct key_entry *key;
|
|
|
int reported_key;
|
|
int reported_key;
|
|
|
u16 *buffer_entry = (u16 *)obj->buffer.pointer;
|
|
u16 *buffer_entry = (u16 *)obj->buffer.pointer;
|
|
|
|
|
+ int buffer_size = obj->buffer.length/2;
|
|
|
|
|
|
|
|
- if (dell_new_hk_type && (buffer_entry[1] != 0x10)) {
|
|
|
|
|
|
|
+ if (buffer_size >= 2 && dell_new_hk_type && buffer_entry[1] != 0x10) {
|
|
|
pr_info("Received unknown WMI event (0x%x)\n",
|
|
pr_info("Received unknown WMI event (0x%x)\n",
|
|
|
buffer_entry[1]);
|
|
buffer_entry[1]);
|
|
|
kfree(obj);
|
|
kfree(obj);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (dell_new_hk_type || buffer_entry[1] == 0x0)
|
|
|
|
|
|
|
+ if (buffer_size >= 3 && (dell_new_hk_type || buffer_entry[1] == 0x0))
|
|
|
reported_key = (int)buffer_entry[2];
|
|
reported_key = (int)buffer_entry[2];
|
|
|
- else
|
|
|
|
|
|
|
+ else if (buffer_size >= 2)
|
|
|
reported_key = (int)buffer_entry[1] & 0xffff;
|
|
reported_key = (int)buffer_entry[1] & 0xffff;
|
|
|
|
|
+ else {
|
|
|
|
|
+ pr_info("Received unknown WMI event\n");
|
|
|
|
|
+ kfree(obj);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
key = sparse_keymap_entry_from_scancode(dell_wmi_input_dev,
|
|
key = sparse_keymap_entry_from_scancode(dell_wmi_input_dev,
|
|
|
reported_key);
|
|
reported_key);
|