Roman Gushchin
33d9490b27
mm: kmem: fix a NULL pointer dereference in obj_stock_flush_required()
commit 3b8abb3239 upstream.
KCSAN found an issue in obj_stock_flush_required():
stock->cached_objcg can be reset between the check and dereference:
==================================================================
BUG: KCSAN: data-race in drain_all_stock / drain_obj_stock
write to 0xffff888237c2a2f8 of 8 bytes by task 19625 on cpu 0:
drain_obj_stock+0x408/0x4e0 mm/memcontrol.c:3306
refill_obj_stock+0x9c/0x1e0 mm/memcontrol.c:3340
obj_cgroup_uncharge+0xe/0x10 mm/memcontrol.c:3408
memcg_slab_free_hook mm/slab.h:587 [inline]
__cache_free mm/slab.c:3373 [inline]
__do_kmem_cache_free mm/slab.c:3577 [inline]
kmem_cache_free+0x105/0x280 mm/slab.c:3602
__d_free fs/dcache.c:298 [inline]
dentry_free fs/dcache.c:375 [inline]
__dentry_kill+0x422/0x4a0 fs/dcache.c:621
dentry_kill+0x8d/0x1e0
dput+0x118/0x1f0 fs/dcache.c:913
__fput+0x3bf/0x570 fs/file_table.c:329
____fput+0x15/0x20 fs/file_table.c:349
task_work_run+0x123/0x160 kernel/task_work.c:179
resume_user_mode_work include/linux/resume_user_mode.h:49 [inline]
exit_to_user_mode_loop+0xcf/0xe0 kernel/entry/common.c:171
exit_to_user_mode_prepare+0x6a/0xa0 kernel/entry/common.c:203
__syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline]
syscall_exit_to_user_mode+0x26/0x140 kernel/entry/common.c:296
do_syscall_64+0x4d/0xc0 arch/x86/entry/common.c:86
entry_SYSCALL_64_after_hwframe+0x63/0xcd
read to 0xffff888237c2a2f8 of 8 bytes by task 19632 on cpu 1:
obj_stock_flush_required mm/memcontrol.c:3319 [inline]
drain_all_stock+0x174/0x2a0 mm/memcontrol.c:2361
try_charge_memcg+0x6d0/0xd10 mm/memcontrol.c:2703
try_charge mm/memcontrol.c:2837 [inline]
mem_cgroup_charge_skmem+0x51/0x140 mm/memcontrol.c:7290
sock_reserve_memory+0xb1/0x390 net/core/sock.c:1025
sk_setsockopt+0x800/0x1e70 net/core/sock.c:1525
udp_lib_setsockopt+0x99/0x6c0 net/ipv4/udp.c:2692
udp_setsockopt+0x73/0xa0 net/ipv4/udp.c:2817
sock_common_setsockopt+0x61/0x70 net/core/sock.c:3668
__sys_setsockopt+0x1c3/0x230 net/socket.c:2271
__do_sys_setsockopt net/socket.c:2282 [inline]
__se_sys_setsockopt net/socket.c:2279 [inline]
__x64_sys_setsockopt+0x66/0x80 net/socket.c:2279
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x63/0xcd
value changed: 0xffff8881382d52c0 -> 0xffff888138893740
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 19632 Comm: syz-executor.0 Not tainted 6.3.0-rc2-syzkaller-00387-g534293368afa #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/02/2023
Fix it by using READ_ONCE()/WRITE_ONCE() for all accesses to
stock->cached_objcg.
Link: https://lkml.kernel.org/r/20230502160839.361544-1-roman.gushchin@linux.dev
Fixes: bf4f059954 ("mm: memcg/slab: obj_cgroup API")
Signed-off-by: Roman Gushchin <roman.gushchin@linux.dev>
Reported-by: syzbot+774c29891415ab0fd29d@syzkaller.appspotmail.com
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Link: https://lore.kernel.org/linux-mm/CACT4Y+ZfucZhM60YPphWiCLJr6+SGFhT+jjm8k1P-a_8Kkxsjg@mail.gmail.com/T/#t
Reviewed-by: Yosry Ahmed <yosryahmed@google.com>
Acked-by: Shakeel Butt <shakeelb@google.com>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-08-11 12:08:23 +02:00
..
2023-07-19 16:22:11 +02:00
2023-07-23 13:49:32 +02:00
2023-04-13 16:55:30 +02:00
2023-04-26 14:28:41 +02:00
2023-04-26 14:28:39 +02:00
2022-08-02 12:34:03 -04:00
2022-08-28 14:02:45 -07:00
2022-09-11 20:25:50 -07:00
2021-05-05 11:27:24 -07:00
2022-05-13 15:11:26 -07:00
2022-03-22 15:57:09 -07:00
2023-02-01 08:34:49 +01:00
2017-11-02 11:10:55 +01:00
2022-06-27 12:52:53 -07:00
2022-09-26 19:46:26 -07:00
2022-01-15 16:30:28 +02:00
2022-03-22 15:57:11 -07:00
2022-04-26 13:36:25 -07:00
2022-11-22 18:50:44 -08:00
2023-02-22 12:59:49 +01:00
2022-10-03 14:02:53 -07:00
2022-09-26 12:14:34 -07:00
2022-07-17 17:14:27 -07:00
2021-05-05 11:27:26 -07:00
2023-07-01 13:16:25 +02:00
2022-10-12 18:51:51 -07:00
2022-09-26 19:46:05 -07:00
2023-04-26 14:28:41 +02:00
2022-09-11 20:25:53 -07:00
2022-11-08 15:57:23 -08:00
2022-08-08 18:06:43 -07:00
2023-04-13 16:55:36 +02:00
2022-10-03 14:03:05 -07:00
2022-09-26 19:46:16 -07:00
2022-10-03 14:03:30 -07:00
2021-04-30 11:20:38 -07:00
2021-04-30 11:20:39 -07:00
2022-06-27 12:22:31 +01:00
2023-07-01 13:16:24 +02:00
2023-06-14 11:15:29 +02:00
2023-04-26 14:28:41 +02:00
2022-10-28 13:37:22 -07:00
2023-03-30 12:49:29 +02:00
2022-06-16 19:48:31 -07:00
2023-06-28 11:12:17 +02:00
2023-02-09 11:28:04 +01:00
2022-10-03 14:03:36 -07:00
2022-01-15 16:30:27 +02:00
2023-02-22 12:59:50 +01:00
2023-08-11 12:08:23 +02:00
2023-06-28 11:12:27 +02:00
2022-10-03 14:03:04 -07:00
2023-03-10 09:34:25 +01:00
2023-03-10 09:34:27 +01:00
2023-07-19 16:21:16 +02:00
2023-05-11 23:03:41 +09:00
2022-06-16 19:48:30 -07:00
2022-11-08 15:57:23 -08:00
2017-11-02 11:10:55 +01:00
2022-11-22 18:50:43 -08:00
2023-02-22 12:59:49 +01:00
2023-03-22 13:34:03 +01:00
2022-09-26 19:46:27 -07:00
2022-09-26 19:46:09 -07:00
2022-10-03 14:02:43 -07:00
2021-07-23 17:43:28 -07:00
2023-07-19 16:22:16 +02:00
2022-11-30 14:49:42 -08:00
2022-04-21 20:01:10 -07:00
2022-09-26 19:46:09 -07:00
2022-10-12 15:56:46 -07:00
2023-02-09 11:28:22 +01:00
2022-09-26 19:46:25 -07:00
2023-07-05 18:27:37 +01:00
2022-09-26 19:46:29 -07:00
2023-04-26 14:28:44 +02:00
2022-09-11 20:26:01 -07:00
2022-11-22 18:50:41 -08:00
2022-05-19 14:08:54 -07:00
2023-02-09 11:28:04 +01:00
2022-10-28 13:37:22 -07:00
2022-10-03 14:03:03 -07:00
2021-04-30 11:20:36 -07:00
2021-06-29 10:53:47 -07:00
2021-06-29 10:53:47 -07:00
2023-06-14 11:15:29 +02:00
2022-09-26 19:46:05 -07:00
2022-09-26 12:28:07 +02:00
2022-10-10 17:53:04 -07:00
2022-05-13 07:20:18 -07:00
2021-07-04 18:30:17 +00:00
2022-03-08 09:30:46 -05:00
2021-07-04 18:30:17 +00:00
2022-07-17 17:14:47 -07:00
2021-05-07 00:26:35 -07:00
2022-05-13 07:20:05 -07:00
2023-02-09 11:28:04 +01:00
2022-09-03 10:13:13 -07:00
2022-09-20 08:24:38 -06:00
2023-03-10 09:34:25 +01:00
2022-10-03 14:03:05 -07:00
2022-10-03 14:03:36 -07:00
2023-07-19 16:22:11 +02:00
2023-02-22 12:59:46 +01:00
2022-10-03 14:03:07 -07:00
2021-05-22 15:09:07 -10:00
2022-11-07 17:11:27 +01:00
2023-03-30 12:49:23 +02:00
2022-10-10 17:53:04 -07:00
2022-09-29 11:30:55 +02:00
2022-10-11 17:42:55 -06:00
2022-08-08 18:06:42 -07:00
2022-07-03 18:08:49 -07:00
2022-10-03 14:03:36 -07:00
2022-10-03 14:02:46 -07:00
2022-10-03 14:02:51 -07:00
2022-10-03 14:02:45 -07:00
2022-10-03 14:02:51 -07:00
2023-04-13 16:55:36 +02:00
2022-10-03 14:02:45 -07:00
2023-06-28 11:12:17 +02:00
2022-11-08 15:57:23 -08:00
2022-10-10 17:53:04 -07:00
2023-04-26 14:28:41 +02:00
2021-11-06 13:30:40 -07:00
2023-05-11 23:03:39 +09:00
2022-10-10 17:53:04 -07:00
2022-09-26 19:46:09 -07:00
2022-08-02 12:34:03 -04:00
2021-07-01 11:06:03 -07:00
2022-01-15 16:30:31 +02:00
2022-10-20 21:27:21 -07:00
2023-06-21 16:00:54 +02:00