Andrea Righi
1d72d9f960
Input: elantech - fix stack out of bound access in elantech_change_report_id()
The array param[] in elantech_change_report_id() must be at least 3
bytes, because elantech_read_reg_params() is calling ps2_command() with
PSMOUSE_CMD_GETINFO, that is going to access 3 bytes from param[], but
it's defined in the stack as an array of 2 bytes, therefore we have a
potential stack out-of-bounds access here, also confirmed by KASAN:
[ 6.512374] BUG: KASAN: stack-out-of-bounds in __ps2_command+0x372/0x7e0
[ 6.512397] Read of size 1 at addr ffff8881024d77c2 by task kworker/2:1/118
[ 6.512416] CPU: 2 PID: 118 Comm: kworker/2:1 Not tainted 5.13.0-22-generic #22+arighi20211110
[ 6.512428] Hardware name: LENOVO 20T8000QGE/20T8000QGE, BIOS R1AET32W (1.08 ) 08/14/2020
[ 6.512436] Workqueue: events_long serio_handle_event
[ 6.512453] Call Trace:
[ 6.512462] show_stack+0x52/0x58
[ 6.512474] dump_stack+0xa1/0xd3
[ 6.512487] print_address_description.constprop.0+0x1d/0x140
[ 6.512502] ? __ps2_command+0x372/0x7e0
[ 6.512516] __kasan_report.cold+0x7d/0x112
[ 6.512527] ? _raw_write_lock_irq+0x20/0xd0
[ 6.512539] ? __ps2_command+0x372/0x7e0
[ 6.512552] kasan_report+0x3c/0x50
[ 6.512564] __asan_load1+0x6a/0x70
[ 6.512575] __ps2_command+0x372/0x7e0
[ 6.512589] ? ps2_drain+0x240/0x240
[ 6.512601] ? dev_printk_emit+0xa2/0xd3
[ 6.512612] ? dev_vprintk_emit+0xc5/0xc5
[ 6.512621] ? __kasan_check_write+0x14/0x20
[ 6.512634] ? mutex_lock+0x8f/0xe0
[ 6.512643] ? __mutex_lock_slowpath+0x20/0x20
[ 6.512655] ps2_command+0x52/0x90
[ 6.512670] elantech_ps2_command+0x4f/0xc0 [psmouse]
[ 6.512734] elantech_change_report_id+0x1e6/0x256 [psmouse]
[ 6.512799] ? elantech_report_trackpoint.constprop.0.cold+0xd/0xd [psmouse]
[ 6.512863] ? ps2_command+0x7f/0x90
[ 6.512877] elantech_query_info.cold+0x6bd/0x9ed [psmouse]
[ 6.512943] ? elantech_setup_ps2+0x460/0x460 [psmouse]
[ 6.513005] ? psmouse_reset+0x69/0xb0 [psmouse]
[ 6.513064] ? psmouse_attr_set_helper+0x2a0/0x2a0 [psmouse]
[ 6.513122] ? phys_pmd_init+0x30e/0x521
[ 6.513137] elantech_init+0x8a/0x200 [psmouse]
[ 6.513200] ? elantech_init_ps2+0xf0/0xf0 [psmouse]
[ 6.513249] ? elantech_query_info+0x440/0x440 [psmouse]
[ 6.513296] ? synaptics_send_cmd+0x60/0x60 [psmouse]
[ 6.513342] ? elantech_query_info+0x440/0x440 [psmouse]
[ 6.513388] ? psmouse_try_protocol+0x11e/0x170 [psmouse]
[ 6.513432] psmouse_extensions+0x65d/0x6e0 [psmouse]
[ 6.513476] ? psmouse_try_protocol+0x170/0x170 [psmouse]
[ 6.513519] ? mutex_unlock+0x22/0x40
[ 6.513526] ? ps2_command+0x7f/0x90
[ 6.513536] ? psmouse_probe+0xa3/0xf0 [psmouse]
[ 6.513580] psmouse_switch_protocol+0x27d/0x2e0 [psmouse]
[ 6.513624] psmouse_connect+0x272/0x530 [psmouse]
[ 6.513669] serio_driver_probe+0x55/0x70
[ 6.513679] really_probe+0x190/0x720
[ 6.513689] driver_probe_device+0x160/0x1f0
[ 6.513697] device_driver_attach+0x119/0x130
[ 6.513705] ? device_driver_attach+0x130/0x130
[ 6.513713] __driver_attach+0xe7/0x1a0
[ 6.513720] ? device_driver_attach+0x130/0x130
[ 6.513728] bus_for_each_dev+0xfb/0x150
[ 6.513738] ? subsys_dev_iter_exit+0x10/0x10
[ 6.513748] ? _raw_write_unlock_bh+0x30/0x30
[ 6.513757] driver_attach+0x2d/0x40
[ 6.513764] serio_handle_event+0x199/0x3d0
[ 6.513775] process_one_work+0x471/0x740
[ 6.513785] worker_thread+0x2d2/0x790
[ 6.513794] ? process_one_work+0x740/0x740
[ 6.513802] kthread+0x1b4/0x1e0
[ 6.513809] ? set_kthread_struct+0x80/0x80
[ 6.513816] ret_from_fork+0x22/0x30
[ 6.513832] The buggy address belongs to the page:
[ 6.513838] page:00000000bc35e189 refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1024d7
[ 6.513847] flags: 0x17ffffc0000000(node=0|zone=2|lastcpupid=0x1fffff)
[ 6.513860] raw: 0017ffffc0000000 dead000000000100 dead000000000122 0000000000000000
[ 6.513867] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
[ 6.513872] page dumped because: kasan: bad access detected
[ 6.513879] addr ffff8881024d77c2 is located in stack of task kworker/2:1/118 at offset 34 in frame:
[ 6.513887] elantech_change_report_id+0x0/0x256 [psmouse]
[ 6.513941] this frame has 1 object:
[ 6.513947] [32, 34) 'param'
[ 6.513956] Memory state around the buggy address:
[ 6.513962] ffff8881024d7680: f2 f2 f2 f2 f2 00 00 f3 f3 00 00 00 00 00 00 00
[ 6.513969] ffff8881024d7700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 6.513976] >ffff8881024d7780: 00 00 00 00 f1 f1 f1 f1 02 f3 f3 f3 00 00 00 00
[ 6.513982] ^
[ 6.513988] ffff8881024d7800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 6.513995] ffff8881024d7880: 00 f1 f1 f1 f1 03 f2 03 f2 03 f3 f3 f3 00 00 00
[ 6.514000] ==================================================================
Define param[] in elantech_change_report_id() as an array of 3 bytes to
prevent the out-of-bounds access in the stack.
Fixes: e4c9062717 ("Input: elantech - fix protocol errors for some trackpoints in SMBus mode")
BugLink: https://bugs.launchpad.net/bugs/1945590
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Reviewed-by: Wolfram Sang <wsa@kernel.org>
Link: https://lore.kernel.org/r/20211116095559.24395-1-andrea.righi@canonical.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
2021-11-29 00:11:15 -08:00
..
2021-04-26 11:20:10 -07:00
2021-06-11 17:57:24 +02:00
2021-05-13 20:35:26 +02:00
2021-05-05 13:24:11 -07:00
2021-05-07 16:01:08 -07:00
2021-05-07 00:26:34 -07:00
2021-06-23 19:34:58 +02:00
2021-04-18 09:36:56 +03:00
2021-06-12 11:59:58 -07:00
2021-06-04 18:25:39 -07:00
2021-06-12 12:13:55 -07:00
2021-05-13 18:58:44 +02:00
2021-05-20 06:31:52 -10:00
2021-05-11 08:47:25 +02:00
2021-05-14 14:55:13 +02:00
2021-04-15 09:26:25 +02:00
2021-06-14 15:55:02 +02:00
2021-04-08 20:05:49 +02:00
2021-05-13 17:23:05 +02:00
2021-04-16 18:21:56 -07:00
2021-04-08 13:14:51 +09:00
2021-06-16 09:03:52 -07:00
2021-05-20 14:02:27 +02:00
2021-05-10 07:51:38 +02:00
2021-04-28 15:59:13 -07:00
2021-04-26 09:43:16 -07:00
2021-05-23 11:39:02 +02:00
2021-04-26 12:11:52 -07:00
2021-06-25 12:13:53 +02:00
2021-06-25 06:05:13 +10:00
2021-04-16 07:26:50 +02:00
2021-05-27 15:40:35 +02:00
2021-04-16 00:14:49 +02:00
2021-04-27 18:09:44 -07:00
2021-06-10 08:40:09 -07:00
2021-05-01 10:14:08 -07:00
2021-06-24 22:08:00 +02:00
2021-04-24 22:21:01 +02:00
2021-04-08 19:18:07 +02:00
2021-05-22 08:32:36 +01:00
2021-06-10 08:59:34 -03:00
2021-11-29 00:11:15 -08:00
2021-05-11 07:26:31 +03:00
2021-05-27 16:07:08 +02:00
2021-06-17 15:22:31 +02:00
2021-05-26 17:44:49 -10:00
2021-05-13 17:30:15 +02:00
2021-04-13 09:16:12 -06:00
2021-04-16 23:57:51 +10:00
2021-04-28 16:10:33 -07:00
2021-06-12 11:59:58 -07:00
2021-05-13 18:58:32 +02:00
2021-05-02 00:43:35 +09:00
2021-04-26 11:08:23 +02:00
2021-04-13 01:39:12 -04:00
2021-04-28 15:59:13 -07:00
2021-06-09 19:10:22 +02:00
2021-06-14 14:02:33 +02:00
2021-04-26 11:14:21 -07:00
2021-05-10 18:34:30 +02:00
2021-06-18 18:55:29 -07:00
2021-05-23 17:26:38 -07:00
2021-05-06 19:24:11 -07:00
2021-06-02 10:10:38 +03:00
2021-05-03 13:57:56 -05:00
2021-05-07 00:26:34 -07:00
2021-06-22 17:35:18 +02:00
2021-05-01 10:14:08 -07:00
2021-06-03 11:18:19 +05:30
2021-06-18 14:56:54 +02:00
2021-06-04 22:03:13 +02:00
2021-04-28 15:43:58 -07:00
2021-04-26 11:20:10 -07:00
2021-06-15 10:59:46 -07:00
2021-05-05 12:53:16 -07:00
2021-05-13 18:32:19 +02:00
2021-04-07 11:52:26 +02:00
2021-06-08 09:41:16 -07:00
2021-05-04 11:13:33 -07:00
2021-05-05 13:24:11 -07:00
2021-04-09 11:08:42 -05:00
2021-05-03 12:15:21 -07:00
2021-06-21 11:19:18 +02:00
2021-06-25 15:59:14 -07:00
2021-04-26 09:43:16 -07:00
2021-05-31 09:26:58 +02:00
2021-05-13 11:14:13 +05:30
2021-06-14 15:02:01 +01:00
2021-06-18 18:55:29 -07:00
2021-05-31 22:59:13 -04:00
2021-06-05 15:43:11 -07:00
2021-06-06 12:25:43 -07:00
2021-05-20 11:52:58 +03:00
2021-06-09 14:40:48 +02:00
2021-05-14 13:26:04 +02:00
2021-06-17 15:34:21 +02:00
2021-05-18 23:01:48 -07:00
2021-05-24 13:40:13 -06:00
2021-05-05 13:31:39 -07:00
2021-06-01 17:38:40 +02:00
2021-04-29 19:06:49 +02:00
2021-05-04 04:19:59 -04:00
2021-04-10 10:58:21 +02:00
2021-04-28 15:59:13 -07:00
2021-06-24 12:52:36 +02:00
2021-04-15 09:26:25 +02:00
2021-05-05 13:31:39 -07:00