Kumar Kartikeya Dwivedi
a8abb0c3dc
bpf: Fix crash due to incorrect copy_map_value
When both bpf_spin_lock and bpf_timer are present in a BPF map value,
copy_map_value needs to skirt both objects when copying a value into and
out of the map. However, the current code does not set both s_off and
t_off in copy_map_value, which leads to a crash when e.g. bpf_spin_lock
is placed in map value with bpf_timer, as bpf_map_update_elem call will
be able to overwrite the other timer object.
When the issue is not fixed, an overwriting can produce the following
splat:
[root@(none) bpf]# ./test_progs -t timer_crash
[ 15.930339] bpf_testmod: loading out-of-tree module taints kernel.
[ 16.037849] ==================================================================
[ 16.038458] BUG: KASAN: user-memory-access in __pv_queued_spin_lock_slowpath+0x32b/0x520
[ 16.038944] Write of size 8 at addr 0000000000043ec0 by task test_progs/325
[ 16.039399]
[ 16.039514] CPU: 0 PID: 325 Comm: test_progs Tainted: G OE 5.16.0+ #278
[ 16.039983] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ArchLinux 1.15.0-1 04/01/2014
[ 16.040485] Call Trace:
[ 16.040645] <TASK>
[ 16.040805] dump_stack_lvl+0x59/0x73
[ 16.041069] ? __pv_queued_spin_lock_slowpath+0x32b/0x520
[ 16.041427] kasan_report.cold+0x116/0x11b
[ 16.041673] ? __pv_queued_spin_lock_slowpath+0x32b/0x520
[ 16.042040] __pv_queued_spin_lock_slowpath+0x32b/0x520
[ 16.042328] ? memcpy+0x39/0x60
[ 16.042552] ? pv_hash+0xd0/0xd0
[ 16.042785] ? lockdep_hardirqs_off+0x95/0xd0
[ 16.043079] __bpf_spin_lock_irqsave+0xdf/0xf0
[ 16.043366] ? bpf_get_current_comm+0x50/0x50
[ 16.043608] ? jhash+0x11a/0x270
[ 16.043848] bpf_timer_cancel+0x34/0xe0
[ 16.044119] bpf_prog_c4ea1c0f7449940d_sys_enter+0x7c/0x81
[ 16.044500] bpf_trampoline_6442477838_0+0x36/0x1000
[ 16.044836] __x64_sys_nanosleep+0x5/0x140
[ 16.045119] do_syscall_64+0x59/0x80
[ 16.045377] ? lock_is_held_type+0xe4/0x140
[ 16.045670] ? irqentry_exit_to_user_mode+0xa/0x40
[ 16.046001] ? mark_held_locks+0x24/0x90
[ 16.046287] ? asm_exc_page_fault+0x1e/0x30
[ 16.046569] ? asm_exc_page_fault+0x8/0x30
[ 16.046851] ? lockdep_hardirqs_on+0x7e/0x100
[ 16.047137] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 16.047405] RIP: 0033:0x7f9e4831718d
[ 16.047602] Code: b4 0c 00 0f 05 eb a9 66 0f 1f 44 00 00 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d b3 6c 0c 00 f7 d8 64 89 01 48
[ 16.048764] RSP: 002b:00007fff488086b8 EFLAGS: 00000206 ORIG_RAX: 0000000000000023
[ 16.049275] RAX: ffffffffffffffda RBX: 00007f9e48683740 RCX: 00007f9e4831718d
[ 16.049747] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00007fff488086d0
[ 16.050225] RBP: 00007fff488086f0 R08: 00007fff488085d7 R09: 00007f9e4cb594a0
[ 16.050648] R10: 0000000000000000 R11: 0000000000000206 R12: 00007f9e484cde30
[ 16.051124] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
[ 16.051608] </TASK>
[ 16.051762] ==================================================================
Fixes: 68134668c1 ("bpf: Add map side support for bpf timers.")
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20220209070324.1093182-2-memxor@gmail.com
2022-02-11 13:13:04 -08:00
..
2021-12-09 16:42:27 -08:00
2021-12-17 12:37:18 -08:00
2022-01-05 12:09:06 +01:00
2022-02-02 18:50:36 +01:00
2022-01-03 17:05:02 +05:30
2021-12-31 14:35:40 +00:00
2022-01-14 16:02:28 +01:00
2021-12-16 22:16:41 +01:00
2021-12-17 12:26:14 +01:00
2021-12-12 17:12:18 +00:00
2021-12-16 13:21:12 +00:00
2022-01-08 14:42:01 -05:00
2022-01-12 17:02:27 -08:00
2022-01-06 16:22:52 -08:00
2021-12-31 13:31:34 +01:00
2022-01-09 23:30:13 +01:00
2022-01-17 08:07:57 +02:00
2022-01-06 08:37:03 -08:00
2022-01-11 12:17:45 -08:00
2022-01-22 08:33:34 +02:00
2022-01-13 09:05:29 -08:00
2021-12-24 14:06:45 +00:00
2022-01-07 17:14:30 +00:00
2022-01-17 05:49:30 +02:00
2022-01-20 08:52:53 +02:00
2022-01-25 18:30:15 +01:00
2022-01-12 15:57:59 -08:00
2022-01-22 08:33:34 +02:00
2022-02-07 22:38:02 +09:00
2021-12-30 17:27:44 -08:00
2021-12-22 13:56:19 +01:00
2022-01-12 12:51:41 -08:00
2021-12-11 09:09:45 +01:00
2022-01-15 08:47:31 -08:00
2022-01-15 08:47:31 -08:00
2022-01-09 10:36:51 -07:00
2021-12-22 23:38:29 -05:00
2022-01-28 12:28:15 -07:00
2022-01-06 12:27:03 +01:00
2021-12-29 17:54:40 -08:00
2022-01-19 01:21:24 +01:00
2021-12-16 14:57:10 -08:00
2021-12-16 14:57:10 -08:00
2021-12-29 20:03:05 -08:00
2022-02-11 13:13:04 -08:00
2021-12-10 15:56:13 -08:00
2021-12-08 16:49:42 +01:00
2022-01-11 09:14:37 -08:00
2021-12-08 11:19:20 +01:00
2021-12-09 16:42:28 -08:00
2021-12-09 16:42:28 -08:00
2021-12-21 15:09:46 -08:00
2022-01-22 08:33:36 +02:00
2021-12-30 17:44:07 +01:00
2021-12-14 12:30:26 +00:00
2022-01-15 08:47:31 -08:00
2021-12-23 22:35:00 +11:00
2022-01-15 16:30:33 +02:00
2021-12-18 08:04:53 -08:00
2022-01-22 08:33:36 +02:00
2021-12-10 17:10:55 -08:00
2022-01-20 08:52:55 +02:00
2021-12-18 08:04:53 -08:00
2021-12-16 22:22:16 +01:00
2021-12-17 21:42:17 +05:30
2022-01-22 08:33:34 +02:00
2021-12-23 16:55:20 +01:00
2021-12-10 12:51:28 +01:00
2022-01-18 08:51:51 +02:00
2022-01-20 08:52:53 +02:00
2022-01-20 08:52:53 +02:00
2022-01-20 11:30:15 +00:00
2022-01-08 14:42:01 -05:00
2022-01-22 08:33:35 +02:00
2022-02-02 15:14:56 +01:00
2022-01-05 19:46:32 -08:00
2022-01-15 08:47:31 -08:00
2022-01-22 08:33:38 +02:00
2022-01-17 09:40:29 +02:00
2021-12-09 14:09:36 -05:00
2022-02-01 11:13:24 -08:00
2022-01-07 13:43:18 +00:00
2022-01-21 21:36:28 +00:00
2021-12-15 14:04:27 +01:00
2022-01-24 14:16:46 +01:00
2022-01-15 16:30:29 +02:00
2022-01-20 08:52:54 +02:00
2022-01-10 09:49:13 +01:00
2021-12-16 14:07:07 +01:00
2022-01-04 13:15:33 -05:00
2022-01-15 16:30:29 +02:00
2022-01-15 16:30:29 +02:00
2021-12-26 15:02:06 -08:00
2021-12-20 18:01:09 +00:00
2021-12-13 11:44:47 +01:00
2021-12-07 20:44:58 -08:00
2022-02-01 20:59:43 -08:00
2021-12-24 10:24:30 -05:00
2021-12-06 16:05:11 -08:00
2022-01-22 08:33:35 +02:00
2021-12-21 15:09:46 -08:00
2021-12-17 16:13:14 +01:00
2021-12-17 09:06:15 +01:00
2021-12-10 20:47:38 +01:00
2021-12-16 10:59:02 -07:00
2022-01-26 09:19:20 -08:00
2021-12-20 09:03:05 +01:00
2021-12-20 13:53:26 +01:00
2022-01-04 12:17:35 +00:00
2022-02-03 10:57:44 -05:00
2022-01-15 20:37:06 +02:00
2021-12-09 16:42:29 -08:00
2021-12-09 16:42:26 -08:00
2022-01-20 10:41:01 +02:00
2021-12-21 10:34:39 +01:00
2022-01-04 14:36:06 +01:00
2022-01-22 08:33:36 +02:00
2022-01-20 10:41:01 +02:00
2022-01-07 10:44:44 -05:00
2022-02-05 00:58:25 -05:00
2022-01-07 10:44:44 -05:00
2022-02-04 16:44:23 +09:00
2022-01-20 08:52:53 +02:00
2022-01-29 08:52:27 +02:00
2021-12-06 13:46:24 -05:00
2022-01-16 23:34:43 +01:00
2022-01-05 11:22:17 +00:00
2022-01-11 12:36:47 +02:00
2022-01-15 20:37:06 +02:00
2022-01-15 16:30:30 +02:00
2022-01-15 20:37:06 +02:00
2021-12-17 17:17:14 +01:00
2022-01-22 08:33:34 +02:00
2022-01-15 16:30:27 +02:00
2022-01-30 09:56:58 +02:00
2022-01-30 09:56:58 +02:00
2022-01-15 16:30:29 +02:00
2021-12-05 10:28:57 +01:00
2022-01-17 07:32:51 +02:00
2022-01-22 08:33:36 +02:00
2021-12-06 16:06:02 -08:00
2021-12-16 22:22:20 +01:00
2022-01-20 10:12:53 +00:00
2022-01-09 23:35:16 +01:00
2022-01-09 23:30:13 +01:00
2022-02-01 10:29:18 -06:00
2021-12-06 16:06:02 -08:00
2022-01-25 20:16:03 +02:00
2022-02-02 10:47:33 -05:00
2022-01-13 09:30:48 -05:00
2022-02-09 09:24:40 -05:00
2021-12-09 07:02:22 -08:00
2022-01-12 10:14:09 -06:00
2022-01-20 12:55:26 -06:00
2022-01-15 16:30:31 +02:00
2022-02-04 09:25:04 -08:00
2022-01-18 06:40:47 +02:00
2022-01-12 12:37:02 -08:00
2022-01-13 16:50:50 -05:00
2022-01-16 08:08:11 +02:00
2022-01-16 08:08:11 +02:00
2022-01-02 18:48:47 +00:00
2021-12-09 15:41:09 -05:00
2022-01-20 08:52:52 +02:00
2022-01-18 12:09:47 +01:00
2022-02-04 09:25:05 -08:00
2021-12-09 13:23:02 -08:00
2021-12-16 10:37:13 +00:00
2022-01-26 18:57:09 -08:00
2022-01-22 08:33:36 +02:00
2022-01-03 21:24:34 -07:00
2022-01-12 19:59:05 +01:00
2022-01-12 19:59:05 +01:00
2021-12-23 22:35:00 +11:00
2022-01-22 08:33:35 +02:00
2022-01-11 11:26:57 -08:00
2022-01-22 08:33:36 +02:00
2022-01-22 08:33:37 +02:00
2022-01-08 12:43:57 -06:00
2022-01-14 16:02:28 +01:00
2022-01-18 12:09:57 +01:00
2022-01-30 09:56:58 +02:00
2021-12-17 16:59:47 +11:00
2022-01-06 12:18:08 +00:00
2022-01-24 14:45:02 +01:00
2022-01-07 00:25:25 +01:00
2021-12-07 15:14:12 +01:00
2021-12-07 16:24:44 -08:00
2022-01-22 08:33:37 +02:00
2021-12-20 11:02:38 +01:00
2021-12-21 10:22:19 +01:00
2022-01-22 08:33:37 +02:00
2022-01-22 08:33:37 +02:00
2022-01-22 08:33:37 +02:00
2022-01-13 12:52:14 -07:00
2021-12-22 09:21:43 +01:00
2022-02-03 11:20:34 -08:00
2021-12-06 13:46:24 -05:00
2021-12-10 06:38:26 -08:00
2022-01-22 08:33:37 +02:00
2021-12-31 13:42:30 +01:00
2021-12-30 13:23:44 +01:00
2021-12-20 16:53:44 +01:00
2022-01-22 08:33:38 +02:00
2022-01-27 08:45:13 -08:00
2022-01-06 12:26:13 +01:00
2022-01-19 11:15:19 +02:00
2022-01-06 12:26:13 +01:00
2022-01-22 08:33:37 +02:00
2021-12-07 15:14:12 +01:00
2021-12-09 16:42:27 -08:00
2022-01-22 08:33:37 +02:00
2022-01-22 08:33:35 +02:00
2021-12-10 14:06:03 +00:00
2022-01-25 18:34:08 +01:00
2022-01-15 16:30:28 +02:00
2022-01-22 08:33:38 +02:00
2021-12-20 18:01:09 +00:00
2022-01-11 15:38:59 -05:00
2022-01-15 16:30:30 +02:00
2022-01-30 09:56:58 +02:00
2021-12-07 11:36:30 -08:00
2022-01-10 08:13:52 -08:00
2021-12-07 16:36:17 -08:00
2022-01-09 00:18:47 +02:00
2022-01-13 16:23:04 -05:00
2022-01-08 12:43:58 -06:00
2021-12-13 12:42:08 +00:00
2022-01-12 15:46:11 -08:00
2021-12-30 12:13:04 +01:00
2022-01-14 18:50:54 -05:00
2021-12-20 18:47:37 -08:00
2022-01-14 18:50:52 -05:00
2022-01-15 16:30:29 +02:00
2022-01-15 16:30:25 +02:00
2021-12-09 10:49:56 -08:00
2021-12-06 22:33:39 +01:00
2022-01-07 09:22:19 +00:00
2021-12-23 11:21:53 +00:00
2022-01-08 00:28:41 -05:00