aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/translation-table.c
diff options
context:
space:
mode:
authorAntonio Quartulli <ordex@autistici.org>2012-01-06 15:31:33 -0500
committerMarek Lindner <lindner_marek@yahoo.de>2012-02-16 13:50:21 -0500
commitc40ed2bfa6cc30174d5c547b37bcd6528c830ef4 (patch)
tree311997f241af6d9550321958fc57f6838727a670 /net/batman-adv/translation-table.c
parent567db7b0b7c0a94cc62846f8ebb429bdda2884bc (diff)
batman-adv: set TT_CLIENT_NEW flag before invoking hash_add()
In case of a new tt_local_entry, the TT_CLIENT_NEW flag has to be set before adding such entry to the hash table. Otherwise, it opens a race condition in which the entry can be found but the flag has not been set. Signed-off-by: Antonio Quartulli <ordex@autistici.org> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net/batman-adv/translation-table.c')
-rw-r--r--net/batman-adv/translation-table.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 4dc5af334f6b..9be9c41c529b 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -210,6 +210,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
210 if (compare_eth(addr, soft_iface->dev_addr)) 210 if (compare_eth(addr, soft_iface->dev_addr))
211 tt_local_entry->common.flags |= TT_CLIENT_NOPURGE; 211 tt_local_entry->common.flags |= TT_CLIENT_NOPURGE;
212 212
213 /* The local entry has to be marked as NEW to avoid to send it in
214 * a full table response going out before the next ttvn increment
215 * (consistency check) */
216 tt_local_entry->common.flags |= TT_CLIENT_NEW;
217
213 hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig, 218 hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig,
214 &tt_local_entry->common, 219 &tt_local_entry->common,
215 &tt_local_entry->common.hash_entry); 220 &tt_local_entry->common.hash_entry);
@@ -222,11 +227,6 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
222 227
223 tt_local_event(bat_priv, addr, tt_local_entry->common.flags); 228 tt_local_event(bat_priv, addr, tt_local_entry->common.flags);
224 229
225 /* The local entry has to be marked as NEW to avoid to send it in
226 * a full table response going out before the next ttvn increment
227 * (consistency check) */
228 tt_local_entry->common.flags |= TT_CLIENT_NEW;
229
230 /* remove address from global hash if present */ 230 /* remove address from global hash if present */
231 tt_global_entry = tt_global_hash_find(bat_priv, addr); 231 tt_global_entry = tt_global_hash_find(bat_priv, addr);
232 232