pull request for net: batman-adv 2016-09-14
Subsystems (3)
cover pull request for net: batman-adv 2016-09-14
Hi David,
here are some more bugfix patches which we would like to have integrated into net.
Please pull or let me know of any problem!
Thank you,
Simon
The following changes since commit 1fe323aa1b2390a0c57fb0b06a782f128d49094c:
sctp: use event->chunk when it's valid (2016-08-08 14:31:23 -0700)
are available in the git repository at:
git://git.open-mesh.org/linux-merge.git tags/batadv-net-for-davem-20160914
for you to fetch changes up to 1e5d343b8f23770e8ac5d31f5c439826bdb35148:
batman-adv: fix elp packet data reservation (2016-08-26 15:22:31 +0200)
----------------------------------------------------------------
Here are two batman-adv bugfix patches:
- Fix reference counting for last_bonding_candidate, by Sven Eckelmann
- Fix head room reservation for ELP packets, by Linus Luessing
----------------------------------------------------------------
Linus Lüssing (1):
batman-adv: fix elp packet data reservation
Sven Eckelmann (1):
batman-adv: Add missing refcnt for last_candidate
net/batman-adv/bat_v_elp.c | 2 +- net/batman-adv/routing.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-)
A message that is not in the archive (sent off-list or not yet received): 20160914123735.9411-1-sw-2YrNx6rUIHYiY0qSoAWiAoQuADTiUCJX@public.gmane.org
PATCH 1/2 batman-adv: Add missing refcnt for last_candidate
From: Sven Eckelmann <[email protected]>
batadv_find_router dereferences last_bonding_candidate from orig_node without making sure that it has a valid reference. This reference has to be retrieved by increasing the reference counter while holding neigh_list_lock. The lock is required to avoid that batadv_last_bonding_replace removes the current last_bonding_candidate, reduces the reference counter and maybe destroys the object in this process.
--- net/batman-adv/routing.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
net/batman-adv/routing.c +27 -1
@@ -470,6 +470,29 @@ static int batadv_check_unicast_packet(struct batadv_priv *bat_priv, }/** +* batadv_last_bonding_get - Get last_bonding_candidate of orig_node +* @orig_node: originator node whose last bonding candidate should be retrieved +* +* Return: last bonding candidate of router or NULL if not found +* +* The object is returned with refcounter increased by 1. +*/ +static struct batadv_orig_ifinfo * +batadv_last_bonding_get (struct batadv_orig_node *orig_node) +{ +struct batadv_orig_ifinfo *last_bonding_candidate; + +spin_lock_bh (&orig_node->neigh_list_lock); + last_bonding_candidate = orig_node->last_bonding_candidate; + +if (last_bonding_candidate) +kref_get (&last_bonding_candidate->refcount); +spin_unlock_bh (&orig_node->neigh_list_lock); + +return last_bonding_candidate; +} + +/** * batadv_last_bonding_replace - Replace last_bonding_candidate of orig_node * @orig_node: originator node whose bonding candidates should be replaced * @new_candidate: new bonding candidate or NULL
@@ -539,7 +562,7 @@ batadv_find_router(struct batadv_priv *bat_priv,* router - obviously there are no other candidates. */ rcu_read_lock (); - last_candidate = orig_node->last_bonding_candidate; + last_candidate =batadv_last_bonding_get (orig_node);if (last_candidate) last_cand_router =rcu_dereference (last_candidate->router);
@@ -631,6 +654,9 @@ next:batadv_orig_ifinfo_put (next_candidate); } +if (last_candidate) +batadv_orig_ifinfo_put (last_candidate); +return router; }
Signature · 1 line
2.9.3
From: Simon Wunderlich <[email protected]>
Date: Wed, 14 Sep 2016 14:37:33 +0200
Quoted 4 lines
here are some more bugfix patches which we would like to have integrated into net.
Please pull or let me know of any problem!
Pulled, thanks.
Simon Wunderlich
maintainerPATCH 2/2 batman-adv: fix elp packet data reservation
In reply to Simon WunderlichFrom: Linus Lüssing <[email protected]>
The skb_reserve() call only reserved headroom for the mac header, but not the elp packet header itself.
Fixing this by using skb_put()'ing towards the skb tail instead of skb_push()'ing towards the skb head.
--- net/batman-adv/bat_v_elp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/batman-adv/bat_v_elp.c +1 -1
@@ -335,7 +335,7 @@ int batadv_v_elp_iface_enable(struct batadv_hard_iface *hard_iface) goto out;skb_reserve (hard_iface->bat_v.elp_skb,ETH_HLEN +NET_IP_ALIGN ); - elp_buff =skb_push (hard_iface->bat_v.elp_skb,BATADV_ELP_HLEN ); + elp_buff =skb_put (hard_iface->bat_v.elp_skb,BATADV_ELP_HLEN ); elp_packet = (struct batadv_elp_packet *)elp_buff;memset (elp_packet,0 ,BATADV_ELP_HLEN );
Signature · 1 line
2.9.3