During futex_key_to_node_opt() execution, vma->vm_policy is read under speculative mmap lock and RCU. Concurrently, mbind() may call vma_replace_policy() which frees the old mempolicy immediately via kmem_cache_free(). This creates a race where __futex_key_to_node() dereferences a freed mempolicy pointer, causing a use-after-free read of mpol->mode. [ 151.412631] BUG: KASAN: slab-use-after-free in __futex_key_to_node (kernel/futex/core.c:349) [ 151.414046] Read of size 2 at addr ffff888001c49634 by task e/87 [ 151.415969] Call Trace: [ 151.416732] __asan_load2 (mm/kasan/generic.c:271) [ 151.416777] __futex_key_to_node (kernel/futex/core.c:349) [ 151.416822] get_futex_key (kernel/futex/core.c:374 kernel/futex/core.c:386 kernel/futex/core.c:593) Fix by adding rcu to __mpol_put().
Showing the changes to include (1 of 3 files). Show all
Unified · Split
| @@ -55,6 +55,7 @@ struct mempolicy { · 54 unmodified lines | |||
| 55 | nodemask_t cpuset_mems_allowed; /* relative to these nodes */ | 55 | nodemask_t cpuset_mems_allowed; /* relative to these nodes */ |
| 56 | nodemask_t user_nodemask; /* nodemask passed by user */ | 56 | nodemask_t user_nodemask; /* nodemask passed by user */ |
| 57 | } w; | 57 | } w; |
| 58 | struct rcu_head rcu; | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /* | 61 | /* |