| From foo@baz Wed Aug 22 09:42:09 CEST 2018 |
| From: Sven Eckelmann <sven@narfation.org> |
| Date: Sat, 2 Jun 2018 17:26:34 +0200 |
| Subject: batman-adv: Fix bat_ogm_iv best gw refcnt after netlink dump |
| |
| From: Sven Eckelmann <sven@narfation.org> |
| |
| [ Upstream commit b5685d2687d6612adf5eac519eb7008f74dfd1ec ] |
| |
| A reference for the best gateway is taken when the list of gateways in the |
| mesh is sent via netlink. This is necessary to check whether the currently |
| dumped entry is the currently selected gateway or not. This information is |
| then transferred as flag BATADV_ATTR_FLAG_BEST. |
| |
| After the comparison of the current entry is done, |
| batadv_iv_gw_dump_entry() has to decrease the reference counter again. |
| Otherwise the reference will be held and thus prevents a proper shutdown of |
| the batman-adv interfaces (and some of the interfaces enslaved in it). |
| |
| Fixes: efb766af06e3 ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations") |
| Reported-by: Andreas Ziegler <dev@andreas-ziegler.de> |
| Tested-by: Andreas Ziegler <dev@andreas-ziegler.de> |
| Signed-off-by: Sven Eckelmann <sven@narfation.org> |
| Acked-by: Marek Lindner <mareklindner@neomailbox.ch> |
| Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/batman-adv/bat_iv_ogm.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/net/batman-adv/bat_iv_ogm.c |
| +++ b/net/batman-adv/bat_iv_ogm.c |
| @@ -2704,7 +2704,7 @@ static int batadv_iv_gw_dump_entry(struc |
| { |
| struct batadv_neigh_ifinfo *router_ifinfo = NULL; |
| struct batadv_neigh_node *router; |
| - struct batadv_gw_node *curr_gw; |
| + struct batadv_gw_node *curr_gw = NULL; |
| int ret = 0; |
| void *hdr; |
| |
| @@ -2752,6 +2752,8 @@ static int batadv_iv_gw_dump_entry(struc |
| ret = 0; |
| |
| out: |
| + if (curr_gw) |
| + batadv_gw_node_put(curr_gw); |
| if (router_ifinfo) |
| batadv_neigh_ifinfo_put(router_ifinfo); |
| if (router) |