On 21/08/15 17:15, Simon Wunderlich wrote: > If the local representation of the global TT table of one originator has > more VLAN entries than the respective TT update, there is some > inconsistency present. By detecting and reporting this inconsistency, > the global table gets updated and the excess VLAN will get removed in > the process. > > Reported-by: Alessandro Bolletta > Signed-off-by: Simon Wunderlich > --- > net/batman-adv/translation-table.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c > index dced2da..1adb72e 100644 > --- a/net/batman-adv/translation-table.c > +++ b/net/batman-adv/translation-table.c > @@ -2392,6 +2392,7 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, > struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp; > struct batadv_orig_node_vlan *vlan; > uint32_t crc; > + bool found; > int i; > > /* check if each received CRC matches the locally stored one */ > @@ -2418,6 +2419,26 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node, > return false; > } > > + /* check if any excess VLANs exist locally for the originator > + * which are not mentioned in the TVLV from the originator. > + */ > + rcu_read_lock(); > + list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) { > + found = false; > + > + for (i = 0; i < num_vlan; i++) { > + tt_vlan_tmp = tt_vlan + i; > + if (ntohs(tt_vlan_tmp->vid) == vlan->vid) { > + found = true; > + break; > + } > + } > + > + if (!found) > + return false; > + } > + rcu_read_unlock(); > + NAK. we already do this check slightly above in this function with the following code: 2426 vlan = batadv_orig_node_vlan_get(orig_node, 2427 ntohs(tt_vlan_tmp->vid)); 2428 if (!vlan) 2429 return false; batadv_orig_node_vlan_get() returns NULL if we don't know this VLAN for that Originator, therefore the CRC check fails here. Cheers, > return true; > } > > -- Antonio Quartulli