Merge tag 'hsi-for-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi
[deliverable/linux.git] / net / batman-adv / translation-table.c
index 76f19ba62462bf03fadba72171d3ae01a565ba57..a22080c53401403c50424cb6ff548d3292c1a826 100644 (file)
@@ -1443,7 +1443,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
                 * TT_CLIENT_WIFI, therefore they have to be copied in the
                 * client entry
                 */
-               tt_global_entry->common.flags |= flags;
+               common->flags |= flags;
 
                /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
                 * one originator left in the list and we previously received a
@@ -2419,8 +2419,8 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
 {
        struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp;
        struct batadv_orig_node_vlan *vlan;
+       int i, orig_num_vlan;
        u32 crc;
-       int i;
 
        /* check if each received CRC matches the locally stored one */
        for (i = 0; i < num_vlan; i++) {
@@ -2446,6 +2446,18 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
                        return false;
        }
 
+       /* check if any excess VLANs exist locally for the originator
+        * which are not mentioned in the TVLV from the originator.
+        */
+       rcu_read_lock();
+       orig_num_vlan = 0;
+       hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list)
+               orig_num_vlan++;
+       rcu_read_unlock();
+
+       if (orig_num_vlan > num_vlan)
+               return false;
+
        return true;
 }
 
@@ -3327,7 +3339,10 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
        bool ret = false;
 
        vlan = batadv_softif_vlan_get(bat_priv, vid);
-       if (!vlan || !atomic_read(&vlan->ap_isolation))
+       if (!vlan)
+               return false;
+
+       if (!atomic_read(&vlan->ap_isolation))
                goto out;
 
        tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid);
@@ -3344,8 +3359,7 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
        ret = true;
 
 out:
-       if (vlan)
-               batadv_softif_vlan_free_ref(vlan);
+       batadv_softif_vlan_free_ref(vlan);
        if (tt_global_entry)
                batadv_tt_global_entry_free_ref(tt_global_entry);
        if (tt_local_entry)
This page took 0.024523 seconds and 5 git commands to generate.