mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-08-09 06:14:34 +02:00
batman-adv: dat: prevent false sharing between VLANs
commit20d7658b74upstream. The local hash of DAT entries is supposed to be VLAN (VID) aware. But the adding to the hash and the search in the hash were not checking the VID information of the hash entries. The entries would therefore only be correctly separated when batadv_hash_dat() didn't select the same buckets for different VIDs. Cc: stable@kernel.org Fixes:be1db4f661("batman-adv: make the Distributed ARP Table vlan aware") Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8615d7f54b
commit
f01043292b
@@ -215,10 +215,13 @@ static void batadv_dat_purge(struct work_struct *work)
|
||||
*/
|
||||
static bool batadv_compare_dat(const struct hlist_node *node, const void *data2)
|
||||
{
|
||||
const void *data1 = container_of(node, struct batadv_dat_entry,
|
||||
hash_entry);
|
||||
const struct batadv_dat_entry *entry1;
|
||||
const struct batadv_dat_entry *entry2;
|
||||
|
||||
return memcmp(data1, data2, sizeof(__be32)) == 0;
|
||||
entry1 = container_of(node, struct batadv_dat_entry, hash_entry);
|
||||
entry2 = data2;
|
||||
|
||||
return entry1->ip == entry2->ip && entry1->vid == entry2->vid;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -345,6 +348,9 @@ batadv_dat_entry_hash_find(struct batadv_priv *bat_priv, __be32 ip,
|
||||
if (dat_entry->ip != ip)
|
||||
continue;
|
||||
|
||||
if (dat_entry->vid != vid)
|
||||
continue;
|
||||
|
||||
if (!kref_get_unless_zero(&dat_entry->refcount))
|
||||
continue;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user