Patch "mm, mempolicy: task->mempolicy must be NULL before dropping final reference" has been added to the 4.7-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm, mempolicy: task->mempolicy must be NULL before dropping final reference
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-mempolicy-task-mempolicy-must-be-null-before-dropping-final-reference.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c11600e4fed67ae4cd6a8096936afd445410e8edMon Sep 17 00:00:00 2001
From: David Rientjes <[email protected]>
Date: Thu, 1 Sep 2016 16:15:07 -0700
Subject: mm, mempolicy: task->mempolicy must be NULL before dropping final reference
From: David Rientjes <[email protected]>
commit c11600e4fed67ae4cd6a8096936afd445410e8ed upstream.
KASAN allocates memory from the page allocator as part of kmem_cache_free(), and that can reference current->mempolicy through any number of allocation functions. It needs to be NULL'd out before the final reference is dropped to prevent a use-after-free bug:
BUG: KASAN: use-after-free in alloc_pages_current+0x363/0x370 at addr ffff88010b48102c CPU: 0 PID: 15425 Comm: trinity-c2 Not tainted 4.8.0-rc2+ #140 ... Call Trace: dump_stack kasan_object_err kasan_report_error __asan_report_load2_noabort alloc_pages_current <-- use after free depot_save_stack save_stack kasan_slab_free kmem_cache_free __mpol_put <-- free do_exit
This patch sets current->mempolicy to NULL before dropping the final reference.
--- include/linux/mempolicy.h | 4 ++++ kernel/exit.c | 7 +------ mm/mempolicy.c | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-)
include/linux/mempolicy.h +4 -0
@@ -195,6 +195,7 @@ static inline bool vma_migratable(struct }extern int mpol_misplaced (struct page *,struct vm_area_struct *,unsigned long ); +extern void mpol_put_task_policy (struct task_struct *);#else
@@ -297,5 +298,8 @@ static inline int mpol_misplaced(structreturn -1 ;/* no node preference */ } +static inline void mpol_put_task_policy (struct task_struct *task) +{ +}#endif /* CONFIG_NUMA */ #endif
kernel/exit.c +1 -6
@@ -768,12 +768,7 @@ void do_exit(long code)TASKS_RCU (preempt_enable ());exit_notify (tsk, group_dead);proc_exit_connector (tsk); -#ifdef CONFIG_NUMA -task_lock (tsk); -mpol_put (tsk->mempolicy); - tsk->mempolicy =NULL ; -task_unlock (tsk); -#endif +mpol_put_task_policy (tsk);#ifdef CONFIG_FUTEX if (unlikely (current->pi_state_cache))kfree (current->pi_state_cache);
mm/mempolicy.c +17 -0
@@ -2334,6 +2334,23 @@ out:return ret; } +/* +* Drop the (possibly final) reference to task->mempolicy. It needs to be +* dropped after task->mempolicy is set to NULL so that any allocation done as +* part of its kmem_cache_free(), such as by KASAN, doesn't reference a freed +* policy. +*/ +void mpol_put_task_policy (struct task_struct *task) +{ +struct mempolicy *pol; + +task_lock (task); + pol = task->mempolicy; + task->mempolicy =NULL ; +task_unlock (task); +mpol_put (pol); +} +static void sp_delete (struct shared_policy *sp,struct sp_node *n) {pr_debug ("deleting %lx-l%lx\n" , n->start, n->end);
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/mm-oom-prevent-premature-oom-killer-invocation-for-high-order-request.patch queue-4.7/mm-mempolicy-task-mempolicy-must-be-null-before-dropping-final-reference.patch