Skip to content

Commit

Permalink
batman-adv: don't rely on positions in struct for hashing
Browse files Browse the repository at this point in the history
The hash functions in the bridge loop avoidance code expects the
VLAN vid to be right after the mac address, but this is not guaranteed.

Fix this by explicitly hashing over the right fields of the struct.

Reported-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
  • Loading branch information
Simon Wunderlich authored and Antonio Quartulli committed Nov 14, 2012
1 parent bf0098f commit 07568d0
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
20 changes: 6 additions & 14 deletions net/batman-adv/bridge_loop_avoidance.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,11 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
/* return the index of the claim */
static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
{
const unsigned char *key = data;
struct batadv_claim *claim = (struct batadv_claim *)data;
uint32_t hash = 0;
size_t i;

for (i = 0; i < ETH_ALEN + sizeof(short); i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));

hash += (hash << 3);
hash ^= (hash >> 11);
Expand All @@ -61,15 +57,11 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
static inline uint32_t batadv_choose_backbone_gw(const void *data,
uint32_t size)
{
const unsigned char *key = data;
struct batadv_claim *claim = (struct batadv_claim *)data;
uint32_t hash = 0;
size_t i;

for (i = 0; i < ETH_ALEN + sizeof(short); i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));

hash += (hash << 3);
hash ^= (hash >> 11);
Expand Down
22 changes: 22 additions & 0 deletions net/batman-adv/hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,28 @@ static inline void batadv_hash_delete(struct batadv_hashtable *hash,
batadv_hash_destroy(hash);
}

/**
* batadv_hash_bytes - hash some bytes and add them to the previous hash
* @hash: previous hash value
* @data: data to be hashed
* @size: number of bytes to be hashed
*
* Returns the new hash value.
*/
static inline uint32_t batadv_hash_bytes(uint32_t hash, void *data,
uint32_t size)
{
const unsigned char *key = data;
int i;

for (i = 0; i < size; i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
return hash;
}

/**
* batadv_hash_add - adds data to the hashtable
* @hash: storage hash table
Expand Down

0 comments on commit 07568d0

Please sign in to comment.