]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/batman-adv/translation-table.c
Merge ath-next from ath.git
[mirror_ubuntu-bionic-kernel.git] / net / batman-adv / translation-table.c
index 5e953297d3b2bda513cd9ad90e7e634928f34a20..c1eb7b72ab15fb3a09bf3dc236dc7c83043d51d9 100644 (file)
@@ -19,6 +19,7 @@
 #include "main.h"
 
 #include <linux/atomic.h>
+#include <linux/bitops.h>
 #include <linux/bug.h>
 #include <linux/byteorder/generic.h>
 #include <linux/compiler.h>
@@ -595,8 +596,11 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
        /* increase the refcounter of the related vlan */
        vlan = batadv_softif_vlan_get(bat_priv, vid);
        if (WARN(!vlan, "adding TT local entry %pM to non-existent VLAN %d",
-                addr, BATADV_PRINT_VID(vid)))
+                addr, BATADV_PRINT_VID(vid))) {
+               kfree(tt_local);
+               tt_local = NULL;
                goto out;
+       }
 
        batadv_dbg(BATADV_DBG_TT, bat_priv,
                   "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n",
@@ -1879,7 +1883,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                }
                spin_unlock_bh(list_lock);
        }
-       orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TT;
+       clear_bit(BATADV_ORIG_CAPA_HAS_TT, &orig_node->capa_initialized);
 }
 
 static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
@@ -2212,7 +2216,7 @@ static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
        spin_lock_bh(&bat_priv->tt.req_list_lock);
 
        list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
-               list_del(&node->list);
+               list_del_init(&node->list);
                kfree(node);
        }
 
@@ -2248,7 +2252,7 @@ static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
        list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
                if (batadv_has_timed_out(node->issued_at,
                                         BATADV_TT_REQUEST_TIMEOUT)) {
-                       list_del(&node->list);
+                       list_del_init(&node->list);
                        kfree(node);
                }
        }
@@ -2530,7 +2534,8 @@ out:
                batadv_hardif_free_ref(primary_if);
        if (ret && tt_req_node) {
                spin_lock_bh(&bat_priv->tt.req_list_lock);
-               list_del(&tt_req_node->list);
+               /* list_del_init() verifies tt_req_node still is in the list */
+               list_del_init(&tt_req_node->list);
                spin_unlock_bh(&bat_priv->tt.req_list_lock);
                kfree(tt_req_node);
        }
@@ -2838,7 +2843,7 @@ static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
                                return;
                }
        }
-       orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TT;
+       set_bit(BATADV_ORIG_CAPA_HAS_TT, &orig_node->capa_initialized);
 }
 
 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
@@ -2967,7 +2972,7 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
        list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
                if (!batadv_compare_eth(node->addr, resp_src))
                        continue;
-               list_del(&node->list);
+               list_del_init(&node->list);
                kfree(node);
        }
 
@@ -3340,7 +3345,8 @@ static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
        bool has_tt_init;
 
        tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
-       has_tt_init = orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TT;
+       has_tt_init = test_bit(BATADV_ORIG_CAPA_HAS_TT,
+                              &orig_node->capa_initialized);
 
        /* orig table not initialised AND first diff is in the OGM OR the ttvn
         * increased by one -> we can apply the attached changes