mm: memcg: fix use after free in mem_cgroup_iter()
Subsystems (3)
[email protected]
maintainerPATCH 6/6 mm: memcg: fix use after free in mem_cgroup_iter()
From: Jing Xia <[email protected]>
Subject: mm: memcg: fix use after free in mem_cgroup_iter()
It was reported that a kernel crash happened in mem_cgroup_iter(), which can be triggered if the legacy cgroup-v1 non-hierarchical mode is used.
Unable to handle kernel paging request at virtual address 6b6b6b6b6b6b8f ...... Call trace: mem_cgroup_iter+0x2e0/0x6d4 shrink_zone+0x8c/0x324 balance_pgdat+0x450/0x640 kswapd+0x130/0x4b8 kthread+0xe8/0xfc ret_from_fork+0x10/0x20
mem_cgroup_iter():
......
if (css_tryget(css)) <-- crash here
break;
......The crashing reason is that mem_cgroup_iter() uses the memcg object whose pointer is stored in iter->position, which has been freed before and filled with POISON_FREE(0x6b).
And the root cause of the use-after-free issue is that invalidate_reclaim_iterators() fails to reset the value of iter->position to NULL when the css of the memcg is released in non- hierarchical mode.
Fixes 6df38689e0e9 ("mm: memcontrol: fix possible memcg leak due to interrupted reclaim")
Signed-off-by Jing Xia <[email protected]>
Acked-by Michal Hocko <[email protected]>
Cc Johannes Weiner <[email protected]>
Cc Vladimir Davydov <[email protected]>
Cc <[email protected]>
Cc Shakeel Butt <[email protected]>
Cc <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
mm/memcontrol.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/memcontrol.c renamed from mm/memcontrol.c~mm-memcg-fix-use-after-free-in-mem_cgroup_iter +1 -1
@@ -850,7 +850,7 @@ static void invalidate_reclaim_iteratorsint nid;int i; -while ((memcg =parent_mem_cgroup (memcg))) { +for (; memcg; memcg =parent_mem_cgroup (memcg)) {for_each_node (nid) { mz =mem_cgroup_nodeinfo (memcg, nid);for (i =0 ; i <=DEF_PRIORITY ; i++) {
_