Patch "batman-adv: Add missing refcnt for last_candidate" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
batman-adv: Add missing refcnt for last_candidate
to the 4.7-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:
batman-adv-add-missing-refcnt-for-last_candidate.patch
and it can be found in the queue-4.7 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
936523441bb64cdc9a5b263e8fd2782e70313a57Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <[email protected]>
Date: Sat, 6 Aug 2016 15:50:52 +0200
Subject: batman-adv: Add missing refcnt for last_candidate
From: Sven Eckelmann <[email protected]>
commit 936523441bb64cdc9a5b263e8fd2782e70313a57 upstream.
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
@@ -456,6 +456,29 @@ static int batadv_check_unicast_packet(s }/** +* 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
@@ -525,7 +548,7 @@ batadv_find_router(struct batadv_priv *b* 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);
@@ -617,6 +640,9 @@ next:batadv_orig_ifinfo_put (next_candidate); } +if (last_candidate) +batadv_orig_ifinfo_put (last_candidate); +return router; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/batman-adv-add-missing-refcnt-for-last_candidate.patch queue-4.7/batman-adv-fix-elp-packet-data-reservation.patch