| From foo@baz Wed May 28 21:03:54 PDT 2014 |
| From: Simon Wunderlich <simon@open-mesh.com> |
| Date: Wed, 26 Mar 2014 15:46:22 +0100 |
| Subject: batman-adv: fix neigh reference imbalance |
| |
| From: Simon Wunderlich <simon@open-mesh.com> |
| |
| [ Upstream commit 000c8dff97311357535d64539e58990526e4de70 ] |
| |
| When an interface is removed from batman-adv, the orig_ifinfo of a |
| orig_node may be removed without releasing the router first. |
| This will prevent the reference for the neighbor pointed at by the |
| orig_ifinfo->router to be released, and this leak may result in |
| reference leaks for the interface used by this neighbor. Fix that. |
| |
| This is a regression introduced by |
| 7351a4822d42827ba0110677c0cbad88a3d52585 |
| ("batman-adv: split out router from orig_node"). |
| |
| Reported-by: Antonio Quartulli <antonio@open-mesh.com> |
| Signed-off-by: Simon Wunderlich <simon@open-mesh.com> |
| Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> |
| Signed-off-by: Antonio Quartulli <antonio@meshcoding.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/batman-adv/originator.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/net/batman-adv/originator.c |
| +++ b/net/batman-adv/originator.c |
| @@ -500,12 +500,17 @@ batadv_neigh_node_get(const struct batad |
| static void batadv_orig_ifinfo_free_rcu(struct rcu_head *rcu) |
| { |
| struct batadv_orig_ifinfo *orig_ifinfo; |
| + struct batadv_neigh_node *router; |
| |
| orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu); |
| |
| if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT) |
| batadv_hardif_free_ref_now(orig_ifinfo->if_outgoing); |
| |
| + /* this is the last reference to this object */ |
| + router = rcu_dereference_protected(orig_ifinfo->router, true); |
| + if (router) |
| + batadv_neigh_node_free_ref_now(router); |
| kfree(orig_ifinfo); |
| } |
| |