diff options
author | Simon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de> | 2012-08-30 12:22:27 -0400 |
---|---|---|
committer | Antonio Quartulli <ordex@autistici.org> | 2012-11-14 15:00:32 -0500 |
commit | 07568d0369f93cd54d2e5ca6f5c64f5b55557857 (patch) | |
tree | f30f4188b200b9cdb1d3b68d52f1d791e4791ac3 /net/batman-adv/bridge_loop_avoidance.c | |
parent | bf0098f22ca7b59e8844ac6882bbae230d34b98d (diff) |
batman-adv: don't rely on positions in struct for hashing
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>
Diffstat (limited to 'net/batman-adv/bridge_loop_avoidance.c')
-rw-r--r-- | net/batman-adv/bridge_loop_avoidance.c | 20 |
1 files changed, 6 insertions, 14 deletions
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c index 29a5542aac75..49c35a60195a 100644 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c | |||
@@ -40,15 +40,11 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv, | |||
40 | /* return the index of the claim */ | 40 | /* return the index of the claim */ |
41 | static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) | 41 | static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) |
42 | { | 42 | { |
43 | const unsigned char *key = data; | 43 | struct batadv_claim *claim = (struct batadv_claim *)data; |
44 | uint32_t hash = 0; | 44 | uint32_t hash = 0; |
45 | size_t i; | ||
46 | 45 | ||
47 | for (i = 0; i < ETH_ALEN + sizeof(short); i++) { | 46 | hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); |
48 | hash += key[i]; | 47 | hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); |
49 | hash += (hash << 10); | ||
50 | hash ^= (hash >> 6); | ||
51 | } | ||
52 | 48 | ||
53 | hash += (hash << 3); | 49 | hash += (hash << 3); |
54 | hash ^= (hash >> 11); | 50 | hash ^= (hash >> 11); |
@@ -61,15 +57,11 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) | |||
61 | static inline uint32_t batadv_choose_backbone_gw(const void *data, | 57 | static inline uint32_t batadv_choose_backbone_gw(const void *data, |
62 | uint32_t size) | 58 | uint32_t size) |
63 | { | 59 | { |
64 | const unsigned char *key = data; | 60 | struct batadv_claim *claim = (struct batadv_claim *)data; |
65 | uint32_t hash = 0; | 61 | uint32_t hash = 0; |
66 | size_t i; | ||
67 | 62 | ||
68 | for (i = 0; i < ETH_ALEN + sizeof(short); i++) { | 63 | hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); |
69 | hash += key[i]; | 64 | hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); |
70 | hash += (hash << 10); | ||
71 | hash ^= (hash >> 6); | ||
72 | } | ||
73 | 65 | ||
74 | hash += (hash << 3); | 66 | hash += (hash << 3); |
75 | hash ^= (hash >> 11); | 67 | hash ^= (hash >> 11); |