Patch "batman-adv: Make MCAST capability changes atomic" has been added to the 4.2-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
batman-adv: Make MCAST capability changes atomic
to the 4.2-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-make-mcast-capability-changes-atomic.patch
and it can be found in the queue-4.2 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
9c936e3f4c4fad07abb6c082a89508b8f724c88fMon Sep 17 00:00:00 2001
From: =?UTF-8?q?Linus=20L=C3=BCssing?= <[email protected]>
Date: Tue, 16 Jun 2015 17:10:25 +0200
Subject: batman-adv: Make MCAST capability changes atomic
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: =?UTF-8?q?Linus=20L=C3=BCssing?= <[email protected]>
commit 9c936e3f4c4fad07abb6c082a89508b8f724c88f upstream.
Bitwise OR/AND assignments in C aren't guaranteed to be atomic. One OGM handler might undo the set/clear of a specific bit from another handler run in between.
Fix this by using the atomic set_bit()/clear_bit()/test_bit() functions.
--- net/batman-adv/multicast.c | 18 ++++++++++-------- net/batman-adv/types.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-)
net/batman-adv/multicast.c +10 -8
@@ -19,6 +19,7 @@#include "main.h" #include <linux/atomic.h> +#include <linux/bitops.h> #include <linux/byteorder/generic.h> #include <linux/errno.h> #include <linux/etherdevice.h>
@@ -697,29 +698,30 @@ static void batadv_mcast_tvlv_ogm_handleuint8_t mcast_flags =BATADV_NO_FLAGS ;bool orig_initialized; - orig_initialized = orig->capa_initialized &BATADV_ORIG_CAPA_HAS_MCAST ; + orig_initialized =test_bit (BATADV_ORIG_CAPA_HAS_MCAST , + &orig->capa_initialized);/* If mcast support is turned on decrease the disabled mcast node * counter only if we had increased it for this node before. If this * is a completely new orig_node no need to decrease the counter. */ if (orig_mcast_enabled && - !(orig->capabilities &BATADV_ORIG_CAPA_HAS_MCAST )) { + !test_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capabilities)) {if (orig_initialized)atomic_dec (&bat_priv->mcast.num_disabled); - orig->capabilities |=BATADV_ORIG_CAPA_HAS_MCAST ; +set_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capabilities);/* If mcast support is being switched off or if this is an initial * OGM without mcast support then increase the disabled mcast * node counter. */ }else if (!orig_mcast_enabled && - (orig->capabilities &BATADV_ORIG_CAPA_HAS_MCAST || + (test_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capabilities) || !orig_initialized)) {atomic_inc (&bat_priv->mcast.num_disabled); - orig->capabilities &= ~BATADV_ORIG_CAPA_HAS_MCAST ; +clear_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capabilities); } - orig->capa_initialized |=BATADV_ORIG_CAPA_HAS_MCAST ; +set_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capa_initialized);if (orig_mcast_enabled && tvlv_value && (tvlv_value_len >=sizeof (mcast_flags)))
@@ -763,8 +765,8 @@ void batadv_mcast_purge_orig(struct bata {struct batadv_priv *bat_priv = orig->bat_priv; -if (!(orig->capabilities &BATADV_ORIG_CAPA_HAS_MCAST ) && - orig->capa_initialized &BATADV_ORIG_CAPA_HAS_MCAST ) +if (!test_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capabilities) && +test_bit (BATADV_ORIG_CAPA_HAS_MCAST , &orig->capa_initialized))atomic_dec (&bat_priv->mcast.num_disabled);batadv_mcast_want_unsnoop_update (bat_priv, orig,BATADV_NO_FLAGS );
net/batman-adv/types.h +1 -1
@@ -316,7 +316,7 @@ enum batadv_orig_capabilities {BATADV_ORIG_CAPA_HAS_DAT ,BATADV_ORIG_CAPA_HAS_NC ,BATADV_ORIG_CAPA_HAS_TT , - BATADV_ORIG_CAPA_HAS_MCAST = BIT(3), + BATADV_ORIG_CAPA_HAS_MCAST, };/**
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/batman-adv-fix-potential-synchronization-issues-in-mcast-tvlv-handler.patch queue-4.2/batman-adv-make-tt-capability-changes-atomic.patch queue-4.2/batman-adv-make-dat-capability-changes-atomic.patch queue-4.2/batman-adv-make-nc-capability-changes-atomic.patch queue-4.2/batman-adv-fix-potentially-broken-skb-network-header-access.patch queue-4.2/batman-adv-make-mcast-capability-changes-atomic.patch