Patch "mac80211: mesh: fix call_rcu() usage" has been added to the 3.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mac80211: mesh: fix call_rcu() usage
to the 3.10-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:
mac80211-mesh-fix-call_rcu-usage.patch
and it can be found in the queue-3.10 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
c2e703a55245bfff3db53b1f7cbe59f1ee8a4339Mon Sep 17 00:00:00 2001
From: Johannes Berg <[email protected]>
Date: Tue, 17 Nov 2015 14:25:21 +0100
Subject: mac80211: mesh: fix call_rcu() usage
From: Johannes Berg <[email protected]>
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.
--- net/mac80211/mesh_pathtbl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/mac80211/mesh_pathtbl.c +4 -4
@@ -747,10 +747,8 @@ void mesh_plink_broken(struct sta_info *static void mesh_path_node_reclaim (struct rcu_head *rp) { struct mpath_node *node = container_of(rp, struct mpath_node, rcu); -struct ieee80211_sub_if_data *sdata = node->mpath->sdata;del_timer_sync (&node->mpath->timer); -atomic_dec (&sdata->u.mesh.mpaths);kfree (node->mpath);kfree (node); }
@@ -758,8 +756,9 @@ static void mesh_path_node_reclaim(struc/* needs to be called with the corresponding hashwlock taken */ static void __mesh_path_del (struct mesh_table *tbl,struct mpath_node *node) { -struct mesh_path *mpath; - mpath = node->mpath; +struct mesh_path *mpath = node->mpath; +struct ieee80211_sub_if_data *sdata = node->mpath->sdata; +spin_lock (&mpath->state_lock); mpath->flags |=MESH_PATH_RESOLVING ;if (mpath->is_gate)
@@ -767,6 +766,7 @@ static void __mesh_path_del(struct mesh_hlist_del_rcu (&node->list);call_rcu (&node->rcu, mesh_path_node_reclaim);spin_unlock (&mpath->state_lock); +atomic_dec (&sdata->u.mesh.mpaths);atomic_dec (&tbl->entries); }
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/rfkill-copy-the-name-into-the-rfkill-struct.patch queue-3.10/mac80211-mesh-fix-call_rcu-usage.patch