mac80211: mesh: fix call_rcu() usage
authorJohannes Berg <johannes.berg@intel.com>
Tue, 17 Nov 2015 13:25:21 +0000 (14:25 +0100)
committerZefan Li <lizefan@huawei.com>
Wed, 26 Oct 2016 15:15:29 +0000 (23:15 +0800)
commite37ecd53989e3a4a7ed4ccb8cd38a11ddb8b4eff
treeebbea9f1fa0614b6c52eac03c6e6539abb030437
parenta73cb24083e4068c8a7b7de4820e4906f78651b8
mac80211: mesh: fix call_rcu() usage

commit c2e703a55245bfff3db53b1f7cbe59f1ee8a4339 upstream.

When using call_rcu(), the called function may be delayed quite
significantly, and without a matching rcu_barrier() there's no
way to be sure it has finished.
Therefore, global state that could be gone/freed/reused should
never be touched in the callback.

Fix this in mesh by moving the atomic_dec() into the caller;
that's not really a problem since we already unlinked the path
and it will be destroyed anyway.

This fixes a crash Jouni observed when running certain tests in
a certain order, in which the mesh interface was torn down, the
memory reused for a function pointer (work struct) and running
that then crashed since the pointer had been decremented by 1,
resulting in an invalid instruction byte stream.

Fixes: eb2b9311fd00 ("mac80211: mesh path table implementation")
Reported-by: Jouni Malinen <j@w1.fi>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Zefan Li <lizefan@huawei.com>
net/mac80211/mesh_pathtbl.c