batman-adv: Refresh patches
[feed/routing.git] / batman-adv / patches / 0040-batman-adv-Fix-bat_ogm_iv-best-gw-refcnt-after-netli.patch
1 From: Sven Eckelmann <sven@narfation.org>
2 Date: Sat, 2 Jun 2018 17:26:34 +0200
3 Subject: batman-adv: Fix bat_ogm_iv best gw refcnt after netlink dump
4
5 A reference for the best gateway is taken when the list of gateways in the
6 mesh is sent via netlink. This is necessary to check whether the currently
7 dumped entry is the currently selected gateway or not. This information is
8 then transferred as flag BATADV_ATTR_FLAG_BEST.
9
10 After the comparison of the current entry is done,
11 batadv_iv_gw_dump_entry() has to decrease the reference counter again.
12 Otherwise the reference will be held and thus prevents a proper shutdown of
13 the batman-adv interfaces (and some of the interfaces enslaved in it).
14
15 Fixes: fa3228924152 ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations")
16 Reported-by: Andreas Ziegler <dev@andreas-ziegler.de>
17 Tested-by: Andreas Ziegler <dev@andreas-ziegler.de>
18 Signed-off-by: Sven Eckelmann <sven@narfation.org>
19 Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
20
21 Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/46360d203c627e71a27d1f8f551c819c7f2353fd
22
23 diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
24 index bf389adbb2694746d6397a0a38353cdcd8008899..f0174a17b30d14e5c127106b364b8fbc8ec384ee 100644
25 --- a/net/batman-adv/bat_iv_ogm.c
26 +++ b/net/batman-adv/bat_iv_ogm.c
27 @@ -2722,7 +2722,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
28 {
29 struct batadv_neigh_ifinfo *router_ifinfo = NULL;
30 struct batadv_neigh_node *router;
31 - struct batadv_gw_node *curr_gw;
32 + struct batadv_gw_node *curr_gw = NULL;
33 int ret = 0;
34 void *hdr;
35
36 @@ -2770,6 +2770,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
37 ret = 0;
38
39 out:
40 + if (curr_gw)
41 + batadv_gw_node_put(curr_gw);
42 if (router_ifinfo)
43 batadv_neigh_ifinfo_put(router_ifinfo);
44 if (router)