From: Michal Hocko <mhocko@xxxxxxxx> syzbot has triggered a NULL ptr dereference when allocation fault injection enforces a failure and alloc_mem_cgroup_per_node_info initializes memcg->nodeinfo only half way through. __mem_cgroup_free still tries to free all per-node data and dereferences pn->lruvec_stat_cpu unconditioanlly even if the specific per-node data hasn't been initialized. The bug is quite unlikely to hit because small allocations do not fail and we would need quite some numa nodes to make struct mem_cgroup_per_node large enough to cross the costly order. Reported-by: syzbot+8a5de3cce7cdc70e9ebe@xxxxxxxxxxxxxxxxxxxxxxxxx Fixes: 00f3ca2c2d66 ("mm: memcontrol: per-lruvec stats infrastructure") Reviewed-by: Andrey Ryabinin <aryabinin@xxxxxxxxxxxxx> Signed-off-by: Michal Hocko <mhocko@xxxxxxxx> --- Hi! Previously posted [1] based on the syzkaller report [2]. I haven't heard back from syzkaller but this seems like the right fix. Andrew could you add this to the pile? [1] http://lkml.kernel.org/r/20180403105048.GK5501@xxxxxxxxxxxxxx [2] http://lkml.kernel.org/r/001a113fe4c0a623b10568bb75ea@xxxxxxxxxx mm/memcontrol.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7667ea9daf4f..8c2ed1c2b72c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4340,6 +4340,9 @@ static void free_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node) { struct mem_cgroup_per_node *pn = memcg->nodeinfo[node]; + if (!pn) + return; + free_percpu(pn->lruvec_stat_cpu); kfree(pn); } -- 2.16.3